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 {
20832083 HashMap<Scope *, ZigValue *, fn_eval_hash, fn_eval_eql> memoized_fn_eval_table;
20842084 HashMap<ZigLLVMFnKey, LLVMValueRef, zig_llvm_fn_key_hash, zig_llvm_fn_key_eql> llvm_fn_table;
20852085 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;
20872087 HashMap<Buf *, ZigValue *, buf_hash, buf_eql_buf> string_literals_table;
20882088 HashMap<const ZigType *, ZigValue *, type_ptr_hash, type_ptr_eql> type_info_cache;
20892089 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) {
34983498 }
34993499 } else {
35003500 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);
35023502 }
35033503
35043504 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) {
40484048 add_var_export(g, tld_var->var, tld_var->var->name, GlobalLinkageIdStrong);
40494049 }
40504050
4051 if (is_extern) {
4052 g->external_symbol_names.put_unique(tld_var->base.name, &tld_var->base);
4053 }
4054
40514055 g->global_vars.append(tld_var);
40524056}
40534057
src/codegen.cpp+13-14
......@@ -204,15 +204,14 @@ static bool is_symbol_available(CodeGen *g, const char *name) {
204204 Buf *buf_name = buf_create_from_str(name);
205205 bool result =
206206 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;
208208 buf_destroy(buf_name);
209209 return result;
210210}
211211
212static const char *get_mangled_name(CodeGen *g, const char *original_name, bool external_linkage) {
213 if (external_linkage || is_symbol_available(g, original_name)) {
212static const char *get_mangled_name(CodeGen *g, const char *original_name) {
213 if (is_symbol_available(g, original_name))
214214 return original_name;
215 }
216215
217216 int n = 0;
218217 for (;; n += 1) {
......@@ -437,7 +436,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {
437436 symbol_name = unmangled_name;
438437 linkage = GlobalLinkageIdStrong;
439438 } 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);
441440 linkage = GlobalLinkageIdInternal;
442441 } else {
443442 GlobalExport *fn_export = &fn->export_list.items[0];
......@@ -1115,7 +1114,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) {
11151114 };
11161115 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");
11191118 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);
11201119 addLLVMFnAttr(fn_val, "alwaysinline");
11211120 LLVMSetLinkage(fn_val, LLVMInternalLinkage);
......@@ -1194,7 +1193,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) {
11941193 };
11951194 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");
11981197 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);
11991198 addLLVMFnAttr(fn_val, "noinline"); // so that we can look at return address
12001199 addLLVMFnAttr(fn_val, "cold");
......@@ -1264,7 +1263,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
12641263 LLVMSetLinkage(msg_prefix, LLVMPrivateLinkage);
12651264 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");
12681267 LLVMTypeRef fn_type_ref;
12691268 if (g->have_err_ret_tracing) {
12701269 LLVMTypeRef arg_types[] = {
......@@ -2174,7 +2173,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) {
21742173 };
21752174 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");
21782177 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);
21792178 LLVMSetLinkage(fn_val, LLVMInternalLinkage);
21802179 ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));
......@@ -5099,7 +5098,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) {
50995098 &tag_int_llvm_type, 1, false);
51005099
51015100 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))));
51035102 LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref);
51045103 LLVMSetLinkage(fn_val, LLVMInternalLinkage);
51055104 ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));
......@@ -7588,7 +7587,7 @@ static void generate_error_name_table(CodeGen *g) {
75887587 LLVMValueRef err_name_table_init = LLVMConstArray(get_llvm_type(g, str_type), values, (unsigned)g->errors_by_index.length);
75897588
75907589 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"))));
75927591 LLVMSetInitializer(g->err_name_table, err_name_table_init);
75937592 LLVMSetLinkage(g->err_name_table, LLVMPrivateLinkage);
75947593 LLVMSetGlobalConstant(g->err_name_table, true);
......@@ -7719,7 +7718,7 @@ static void do_code_gen(CodeGen *g) {
77197718 symbol_name = unmangled_name;
77207719 linkage = GlobalLinkageIdStrong;
77217720 } else {
7722 symbol_name = get_mangled_name(g, unmangled_name, false);
7721 symbol_name = get_mangled_name(g, unmangled_name);
77237722 linkage = GlobalLinkageIdInternal;
77247723 }
77257724 } else {
......@@ -10954,7 +10953,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget
1095410953 g->llvm_fn_table.init(16);
1095510954 g->memoized_fn_eval_table.init(16);
1095610955 g->exported_symbol_names.init(8);
10957 g->external_prototypes.init(8);
10956 g->external_symbol_names.init(8);
1095810957 g->string_literals_table.init(16);
1095910958 g->type_info_cache.init(32);
1096010959 g->one_possible_values.init(32);
......@@ -10964,7 +10963,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget
1096410963 buf_resize(&g->global_asm, 0);
1096510964
1096610965 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);
1096810967 }
1096910968
1097010969 if (root_src_path) {