authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2020-04-07 10:23:51+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-04-07 14:48:37-04:00
logcc0fca9d83f5a62cf0e109dde3a323c01ea71301
tree66ca390bafe42ef592d3ea7969e54e84851c5f9b
parentadaf7ad672e4933c42543a239ad91b58abba6942

stage1: Respect the specified name for extern var

Extend the logic used for function definitions to variables. Closes #4947

3 files changed, 19 insertions(+), 16 deletions(-)

src/all_types.hpp+1-1
...@@ -2083,7 +2083,7 @@ struct CodeGen {...@@ -2083,7 +2083,7 @@ struct CodeGen {
2083 HashMap<Scope *, ZigValue *, fn_eval_hash, fn_eval_eql> memoized_fn_eval_table;2083 HashMap<Scope *, ZigValue *, fn_eval_hash, fn_eval_eql> memoized_fn_eval_table;
2084 HashMap<ZigLLVMFnKey, LLVMValueRef, zig_llvm_fn_key_hash, zig_llvm_fn_key_eql> llvm_fn_table;2084 HashMap<ZigLLVMFnKey, LLVMValueRef, zig_llvm_fn_key_hash, zig_llvm_fn_key_eql> llvm_fn_table;
2085 HashMap<Buf *, Tld *, buf_hash, buf_eql_buf> exported_symbol_names;2085 HashMap<Buf *, Tld *, buf_hash, buf_eql_buf> exported_symbol_names;
2086 HashMap<Buf *, Tld *, buf_hash, buf_eql_buf> external_prototypes;2086 HashMap<Buf *, Tld *, buf_hash, buf_eql_buf> external_symbol_names;
2087 HashMap<Buf *, ZigValue *, buf_hash, buf_eql_buf> string_literals_table;2087 HashMap<Buf *, ZigValue *, buf_hash, buf_eql_buf> string_literals_table;
2088 HashMap<const ZigType *, ZigValue *, type_ptr_hash, type_ptr_eql> type_info_cache;2088 HashMap<const ZigType *, ZigValue *, type_ptr_hash, type_ptr_eql> type_info_cache;
2089 HashMap<const ZigType *, ZigValue *, type_ptr_hash, type_ptr_eql> one_possible_values;2089 HashMap<const ZigType *, ZigValue *, type_ptr_hash, type_ptr_eql> one_possible_values;
src/analyze.cpp+5-1
...@@ -3498,7 +3498,7 @@ static void resolve_decl_fn(CodeGen *g, TldFn *tld_fn) {...@@ -3498,7 +3498,7 @@ static void resolve_decl_fn(CodeGen *g, TldFn *tld_fn) {
3498 }3498 }
3499 } else {3499 } else {
3500 fn_table_entry->inferred_async_node = inferred_async_none;3500 fn_table_entry->inferred_async_node = inferred_async_none;
3501 g->external_prototypes.put_unique(tld_fn->base.name, &tld_fn->base);3501 g->external_symbol_names.put_unique(tld_fn->base.name, &tld_fn->base);
3502 }3502 }
35033503
3504 Scope *child_scope = fn_table_entry->fndef_scope ? &fn_table_entry->fndef_scope->base : tld_fn->base.parent_scope;3504 Scope *child_scope = fn_table_entry->fndef_scope ? &fn_table_entry->fndef_scope->base : tld_fn->base.parent_scope;
...@@ -4048,6 +4048,10 @@ static void resolve_decl_var(CodeGen *g, TldVar *tld_var, bool allow_lazy) {...@@ -4048,6 +4048,10 @@ static void resolve_decl_var(CodeGen *g, TldVar *tld_var, bool allow_lazy) {
4048 add_var_export(g, tld_var->var, tld_var->var->name, GlobalLinkageIdStrong);4048 add_var_export(g, tld_var->var, tld_var->var->name, GlobalLinkageIdStrong);
4049 }4049 }
40504050
4051 if (is_extern) {
4052 g->external_symbol_names.put_unique(tld_var->base.name, &tld_var->base);
4053 }
4054
4051 g->global_vars.append(tld_var);4055 g->global_vars.append(tld_var);
4052}4056}
40534057
src/codegen.cpp+13-14
...@@ -204,15 +204,14 @@ static bool is_symbol_available(CodeGen *g, const char *name) {...@@ -204,15 +204,14 @@ static bool is_symbol_available(CodeGen *g, const char *name) {
204 Buf *buf_name = buf_create_from_str(name);204 Buf *buf_name = buf_create_from_str(name);
205 bool result =205 bool result =
206 g->exported_symbol_names.maybe_get(buf_name) == nullptr &&206 g->exported_symbol_names.maybe_get(buf_name) == nullptr &&
207 g->external_prototypes.maybe_get(buf_name) == nullptr;207 g->external_symbol_names.maybe_get(buf_name) == nullptr;
208 buf_destroy(buf_name);208 buf_destroy(buf_name);
209 return result;209 return result;
210}210}
211211
212static const char *get_mangled_name(CodeGen *g, const char *original_name, bool external_linkage) {212static const char *get_mangled_name(CodeGen *g, const char *original_name) {
213 if (external_linkage || is_symbol_available(g, original_name)) {213 if (is_symbol_available(g, original_name))
214 return original_name;214 return original_name;
215 }
216215
217 int n = 0;216 int n = 0;
218 for (;; n += 1) {217 for (;; n += 1) {
...@@ -437,7 +436,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {...@@ -437,7 +436,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {
437 symbol_name = unmangled_name;436 symbol_name = unmangled_name;
438 linkage = GlobalLinkageIdStrong;437 linkage = GlobalLinkageIdStrong;
439 } else if (fn->export_list.length == 0) {438 } else if (fn->export_list.length == 0) {
440 symbol_name = get_mangled_name(g, unmangled_name, false);439 symbol_name = get_mangled_name(g, unmangled_name);
441 linkage = GlobalLinkageIdInternal;440 linkage = GlobalLinkageIdInternal;
442 } else {441 } else {
443 GlobalExport *fn_export = &fn->export_list.items[0];442 GlobalExport *fn_export = &fn->export_list.items[0];
...@@ -1115,7 +1114,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) {...@@ -1115,7 +1114,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) {
1115 };1114 };
1116 LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 2, false);1115 LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 2, false);
11171116
1118 const char *fn_name = get_mangled_name(g, "__zig_add_err_ret_trace_addr", false);1117 const char *fn_name = get_mangled_name(g, "__zig_add_err_ret_trace_addr");
1119 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);1118 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);
1120 addLLVMFnAttr(fn_val, "alwaysinline");1119 addLLVMFnAttr(fn_val, "alwaysinline");
1121 LLVMSetLinkage(fn_val, LLVMInternalLinkage);1120 LLVMSetLinkage(fn_val, LLVMInternalLinkage);
...@@ -1194,7 +1193,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) {...@@ -1194,7 +1193,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) {
1194 };1193 };
1195 LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 1, false);1194 LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 1, false);
11961195
1197 const char *fn_name = get_mangled_name(g, "__zig_return_error", false);1196 const char *fn_name = get_mangled_name(g, "__zig_return_error");
1198 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);1197 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);
1199 addLLVMFnAttr(fn_val, "noinline"); // so that we can look at return address1198 addLLVMFnAttr(fn_val, "noinline"); // so that we can look at return address
1200 addLLVMFnAttr(fn_val, "cold");1199 addLLVMFnAttr(fn_val, "cold");
...@@ -1264,7 +1263,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {...@@ -1264,7 +1263,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
1264 LLVMSetLinkage(msg_prefix, LLVMPrivateLinkage);1263 LLVMSetLinkage(msg_prefix, LLVMPrivateLinkage);
1265 LLVMSetGlobalConstant(msg_prefix, true);1264 LLVMSetGlobalConstant(msg_prefix, true);
12661265
1267 const char *fn_name = get_mangled_name(g, "__zig_fail_unwrap", false);1266 const char *fn_name = get_mangled_name(g, "__zig_fail_unwrap");
1268 LLVMTypeRef fn_type_ref;1267 LLVMTypeRef fn_type_ref;
1269 if (g->have_err_ret_tracing) {1268 if (g->have_err_ret_tracing) {
1270 LLVMTypeRef arg_types[] = {1269 LLVMTypeRef arg_types[] = {
...@@ -2174,7 +2173,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) {...@@ -2174,7 +2173,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) {
2174 };2173 };
2175 LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), param_types, 2, false);2174 LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), param_types, 2, false);
21762175
2177 const char *fn_name = get_mangled_name(g, "__zig_merge_error_return_traces", false);2176 const char *fn_name = get_mangled_name(g, "__zig_merge_error_return_traces");
2178 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);2177 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);
2179 LLVMSetLinkage(fn_val, LLVMInternalLinkage);2178 LLVMSetLinkage(fn_val, LLVMInternalLinkage);
2180 ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));2179 ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));
...@@ -5099,7 +5098,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) {...@@ -5099,7 +5098,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) {
5099 &tag_int_llvm_type, 1, false);5098 &tag_int_llvm_type, 1, false);
51005099
5101 const char *fn_name = get_mangled_name(g,5100 const char *fn_name = get_mangled_name(g,
5102 buf_ptr(buf_sprintf("__zig_tag_name_%s", buf_ptr(&enum_type->name))), false);5101 buf_ptr(buf_sprintf("__zig_tag_name_%s", buf_ptr(&enum_type->name))));
5103 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);5102 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);
5104 LLVMSetLinkage(fn_val, LLVMInternalLinkage);5103 LLVMSetLinkage(fn_val, LLVMInternalLinkage);
5105 ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));5104 ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));
...@@ -7588,7 +7587,7 @@ static void generate_error_name_table(CodeGen *g) {...@@ -7588,7 +7587,7 @@ static void generate_error_name_table(CodeGen *g) {
7588 LLVMValueRef err_name_table_init = LLVMConstArray(get_llvm_type(g, str_type), values, (unsigned)g->errors_by_index.length);7587 LLVMValueRef err_name_table_init = LLVMConstArray(get_llvm_type(g, str_type), values, (unsigned)g->errors_by_index.length);
75897588
7590 g->err_name_table = LLVMAddGlobal(g->module, LLVMTypeOf(err_name_table_init),7589 g->err_name_table = LLVMAddGlobal(g->module, LLVMTypeOf(err_name_table_init),
7591 get_mangled_name(g, buf_ptr(buf_create_from_str("__zig_err_name_table")), false));7590 get_mangled_name(g, buf_ptr(buf_create_from_str("__zig_err_name_table"))));
7592 LLVMSetInitializer(g->err_name_table, err_name_table_init);7591 LLVMSetInitializer(g->err_name_table, err_name_table_init);
7593 LLVMSetLinkage(g->err_name_table, LLVMPrivateLinkage);7592 LLVMSetLinkage(g->err_name_table, LLVMPrivateLinkage);
7594 LLVMSetGlobalConstant(g->err_name_table, true);7593 LLVMSetGlobalConstant(g->err_name_table, true);
...@@ -7719,7 +7718,7 @@ static void do_code_gen(CodeGen *g) {...@@ -7719,7 +7718,7 @@ static void do_code_gen(CodeGen *g) {
7719 symbol_name = unmangled_name;7718 symbol_name = unmangled_name;
7720 linkage = GlobalLinkageIdStrong;7719 linkage = GlobalLinkageIdStrong;
7721 } else {7720 } else {
7722 symbol_name = get_mangled_name(g, unmangled_name, false);7721 symbol_name = get_mangled_name(g, unmangled_name);
7723 linkage = GlobalLinkageIdInternal;7722 linkage = GlobalLinkageIdInternal;
7724 }7723 }
7725 } else {7724 } else {
...@@ -10954,7 +10953,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget...@@ -10954,7 +10953,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget
10954 g->llvm_fn_table.init(16);10953 g->llvm_fn_table.init(16);
10955 g->memoized_fn_eval_table.init(16);10954 g->memoized_fn_eval_table.init(16);
10956 g->exported_symbol_names.init(8);10955 g->exported_symbol_names.init(8);
10957 g->external_prototypes.init(8);10956 g->external_symbol_names.init(8);
10958 g->string_literals_table.init(16);10957 g->string_literals_table.init(16);
10959 g->type_info_cache.init(32);10958 g->type_info_cache.init(32);
10960 g->one_possible_values.init(32);10959 g->one_possible_values.init(32);
...@@ -10964,7 +10963,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget...@@ -10964,7 +10963,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget
10964 buf_resize(&g->global_asm, 0);10963 buf_resize(&g->global_asm, 0);
1096510964
10966 for (size_t i = 0; i < array_length(symbols_that_llvm_depends_on); i += 1) {10965 for (size_t i = 0; i < array_length(symbols_that_llvm_depends_on); i += 1) {
10967 g->external_prototypes.put(buf_create_from_str(symbols_that_llvm_depends_on[i]), nullptr);10966 g->external_symbol_names.put(buf_create_from_str(symbols_that_llvm_depends_on[i]), nullptr);
10968 }10967 }
1096910968
10970 if (root_src_path) {10969 if (root_src_path) {