diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-02-18 16:47:30 -0500 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-02-18 16:47:30 -0500 |
| commit | 28bf768883d2411d4cd75582d396d465ab6a54b2 (patch) | |
| tree | 542fb1bed1e22462938a62b5caf647c366dfc0c2 /src/codegen.cpp | |
| parent | 74a335c4ccd9eb4cfcc5cc6c01b633584c6bb6ba (diff) | |
| download | zig-28bf768883d2411d4cd75582d396d465ab6a54b2.tar.gz zig-28bf768883d2411d4cd75582d396d465ab6a54b2.zip | |
export _mh_execute_header with weak linkage
* also fix extern variables with initialiaztion values to generate runtime code
* remove the workaround in example/shared_library/mathtest.zig
* introduce the ability for global variables to have Weak and LinkOnce
linkage
* fix `@export` to work for non-functions. this code needs to be
audited though.
* fix comptime ptrcast not keeping bigger alignment
* fix linker warnings when targeting darwin
closes #1903
Diffstat (limited to 'src/codegen.cpp')
| -rw-r--r-- | src/codegen.cpp | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp index 9085d4ea7c..843f8cfd17 100644 --- a/src/codegen.cpp +++ b/src/codegen.cpp @@ -6421,6 +6421,22 @@ static void set_global_tls(CodeGen *g, ZigVar *var, LLVMValueRef global_value) { } } +static LLVMLinkage var_linkage_to_llvm(VarLinkage var_linkage) { + switch (var_linkage) { + case VarLinkageInternal: + return LLVMInternalLinkage; + case VarLinkageExportStrong: + return LLVMExternalLinkage; + case VarLinkageExportWeak: + return LLVMWeakODRLinkage; + case VarLinkageExportLinkOnce: + return LLVMLinkOnceODRLinkage; + case VarLinkageExternal: + return LLVMExternalLinkage; + } + zig_unreachable(); +} + static void do_code_gen(CodeGen *g) { assert(!g->errors.length); @@ -6501,21 +6517,21 @@ static void do_code_gen(CodeGen *g) { global_value = LLVMAddGlobal(g->module, var->var_type->type_ref, buf_ptr(&var->name)); // TODO debug info for the extern variable - LLVMSetLinkage(global_value, LLVMExternalLinkage); + LLVMSetLinkage(global_value, var_linkage_to_llvm(var->linkage)); maybe_import_dll(g, global_value, GlobalLinkageIdStrong); LLVMSetAlignment(global_value, var->align_bytes); LLVMSetGlobalConstant(global_value, var->gen_is_const); set_global_tls(g, var, global_value); } } else { - bool exported = (var->linkage == VarLinkageExport); + bool exported = (var->linkage != VarLinkageInternal); const char *mangled_name = buf_ptr(get_mangled_name(g, &var->name, exported)); render_const_val(g, var->const_value, mangled_name); render_const_val_global(g, var->const_value, mangled_name); global_value = var->const_value->global_refs->llvm_global; if (exported) { - LLVMSetLinkage(global_value, LLVMExternalLinkage); + LLVMSetLinkage(global_value, var_linkage_to_llvm(var->linkage)); maybe_export_dll(g, global_value, GlobalLinkageIdStrong); } if (tld_var->section_name) { |
