From cc0fca9d83f5a62cf0e109dde3a323c01ea71301 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Tue, 7 Apr 2020 10:23:51 +0200 Subject: [PATCH] stage1: Respect the specified name for extern var Extend the logic used for function definitions to variables. Closes #4947 --- src/all_types.hpp | 2 +- src/analyze.cpp | 6 +++++- src/codegen.cpp | 27 +++++++++++++-------------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/all_types.hpp b/src/all_types.hpp index 56ce74caae..db745275f7 100644 --- a/src/all_types.hpp +++ b/src/all_types.hpp @@ -2083,7 +2083,7 @@ struct CodeGen { HashMap memoized_fn_eval_table; HashMap llvm_fn_table; HashMap exported_symbol_names; - HashMap external_prototypes; + HashMap external_symbol_names; HashMap string_literals_table; HashMap type_info_cache; HashMap one_possible_values; diff --git a/src/analyze.cpp b/src/analyze.cpp index 14b9c25c07..c3580e35ea 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -3498,7 +3498,7 @@ static void resolve_decl_fn(CodeGen *g, TldFn *tld_fn) { } } else { fn_table_entry->inferred_async_node = inferred_async_none; - g->external_prototypes.put_unique(tld_fn->base.name, &tld_fn->base); + g->external_symbol_names.put_unique(tld_fn->base.name, &tld_fn->base); } 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) { add_var_export(g, tld_var->var, tld_var->var->name, GlobalLinkageIdStrong); } + if (is_extern) { + g->external_symbol_names.put_unique(tld_var->base.name, &tld_var->base); + } + g->global_vars.append(tld_var); } diff --git a/src/codegen.cpp b/src/codegen.cpp index 7de26e0b6d..980a8a4aca 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -204,15 +204,14 @@ static bool is_symbol_available(CodeGen *g, const char *name) { Buf *buf_name = buf_create_from_str(name); bool result = g->exported_symbol_names.maybe_get(buf_name) == nullptr && - g->external_prototypes.maybe_get(buf_name) == nullptr; + g->external_symbol_names.maybe_get(buf_name) == nullptr; buf_destroy(buf_name); return result; } -static const char *get_mangled_name(CodeGen *g, const char *original_name, bool external_linkage) { - if (external_linkage || is_symbol_available(g, original_name)) { +static const char *get_mangled_name(CodeGen *g, const char *original_name) { + if (is_symbol_available(g, original_name)) return original_name; - } int n = 0; for (;; n += 1) { @@ -437,7 +436,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { symbol_name = unmangled_name; linkage = GlobalLinkageIdStrong; } else if (fn->export_list.length == 0) { - symbol_name = get_mangled_name(g, unmangled_name, false); + symbol_name = get_mangled_name(g, unmangled_name); linkage = GlobalLinkageIdInternal; } else { GlobalExport *fn_export = &fn->export_list.items[0]; @@ -1115,7 +1114,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) { }; LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 2, false); - const char *fn_name = get_mangled_name(g, "__zig_add_err_ret_trace_addr", false); + const char *fn_name = get_mangled_name(g, "__zig_add_err_ret_trace_addr"); LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); addLLVMFnAttr(fn_val, "alwaysinline"); LLVMSetLinkage(fn_val, LLVMInternalLinkage); @@ -1194,7 +1193,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) { }; LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), arg_types, 1, false); - const char *fn_name = get_mangled_name(g, "__zig_return_error", false); + const char *fn_name = get_mangled_name(g, "__zig_return_error"); LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); addLLVMFnAttr(fn_val, "noinline"); // so that we can look at return address addLLVMFnAttr(fn_val, "cold"); @@ -1264,7 +1263,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { LLVMSetLinkage(msg_prefix, LLVMPrivateLinkage); LLVMSetGlobalConstant(msg_prefix, true); - const char *fn_name = get_mangled_name(g, "__zig_fail_unwrap", false); + const char *fn_name = get_mangled_name(g, "__zig_fail_unwrap"); LLVMTypeRef fn_type_ref; if (g->have_err_ret_tracing) { LLVMTypeRef arg_types[] = { @@ -2174,7 +2173,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) { }; LLVMTypeRef fn_type_ref = LLVMFunctionType(LLVMVoidType(), param_types, 2, false); - const char *fn_name = get_mangled_name(g, "__zig_merge_error_return_traces", false); + const char *fn_name = get_mangled_name(g, "__zig_merge_error_return_traces"); LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); LLVMSetLinkage(fn_val, LLVMInternalLinkage); ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); @@ -5099,7 +5098,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) { &tag_int_llvm_type, 1, false); const char *fn_name = get_mangled_name(g, - buf_ptr(buf_sprintf("__zig_tag_name_%s", buf_ptr(&enum_type->name))), false); + buf_ptr(buf_sprintf("__zig_tag_name_%s", buf_ptr(&enum_type->name)))); LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); LLVMSetLinkage(fn_val, LLVMInternalLinkage); ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); @@ -7588,7 +7587,7 @@ static void generate_error_name_table(CodeGen *g) { LLVMValueRef err_name_table_init = LLVMConstArray(get_llvm_type(g, str_type), values, (unsigned)g->errors_by_index.length); g->err_name_table = LLVMAddGlobal(g->module, LLVMTypeOf(err_name_table_init), - get_mangled_name(g, buf_ptr(buf_create_from_str("__zig_err_name_table")), false)); + get_mangled_name(g, buf_ptr(buf_create_from_str("__zig_err_name_table")))); LLVMSetInitializer(g->err_name_table, err_name_table_init); LLVMSetLinkage(g->err_name_table, LLVMPrivateLinkage); LLVMSetGlobalConstant(g->err_name_table, true); @@ -7719,7 +7718,7 @@ static void do_code_gen(CodeGen *g) { symbol_name = unmangled_name; linkage = GlobalLinkageIdStrong; } else { - symbol_name = get_mangled_name(g, unmangled_name, false); + symbol_name = get_mangled_name(g, unmangled_name); linkage = GlobalLinkageIdInternal; } } else { @@ -10954,7 +10953,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget g->llvm_fn_table.init(16); g->memoized_fn_eval_table.init(16); g->exported_symbol_names.init(8); - g->external_prototypes.init(8); + g->external_symbol_names.init(8); g->string_literals_table.init(16); g->type_info_cache.init(32); g->one_possible_values.init(32); @@ -10964,7 +10963,7 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget buf_resize(&g->global_asm, 0); for (size_t i = 0; i < array_length(symbols_that_llvm_depends_on); i += 1) { - g->external_prototypes.put(buf_create_from_str(symbols_that_llvm_depends_on[i]), nullptr); + g->external_symbol_names.put(buf_create_from_str(symbols_that_llvm_depends_on[i]), nullptr); } if (root_src_path) {