authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-08-25 03:55:32-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-08-25 03:55:59-04:00
log02f5a9fa62cc54835467e36b7015a6bcb642583d
treed055b64c39ec3d544499256103f555a7f7005fd3
parentb95ff12f2fb4aa5c20aecb789a91396557662287

fix handling multiple extern vars with the same name


1 files changed, 9 insertions(+), 5 deletions(-)

src/codegen.cpp+9-5
...@@ -5812,12 +5812,16 @@ static void do_code_gen(CodeGen *g) {...@@ -5812,12 +5812,16 @@ static void do_code_gen(CodeGen *g) {
58125812
5813 LLVMValueRef global_value;5813 LLVMValueRef global_value;
5814 if (var->linkage == VarLinkageExternal) {5814 if (var->linkage == VarLinkageExternal) {
5815 global_value = LLVMAddGlobal(g->module, var->value->type->type_ref, buf_ptr(&var->name));5815 LLVMValueRef existing_llvm_var = LLVMGetNamedGlobal(g->module, buf_ptr(&var->name));
58165816 if (existing_llvm_var) {
5817 // TODO debug info for the extern variable5817 global_value = LLVMConstBitCast(existing_llvm_var, LLVMPointerType(var->value->type->type_ref, 0));
5818 } else {
5819 global_value = LLVMAddGlobal(g->module, var->value->type->type_ref, buf_ptr(&var->name));
5820 // TODO debug info for the extern variable
58185821
5819 LLVMSetLinkage(global_value, LLVMExternalLinkage);5822 LLVMSetLinkage(global_value, LLVMExternalLinkage);
5820 LLVMSetAlignment(global_value, var->align_bytes);5823 LLVMSetAlignment(global_value, var->align_bytes);
5824 }
5821 } else {5825 } else {
5822 bool exported = (var->linkage == VarLinkageExport);5826 bool exported = (var->linkage == VarLinkageExport);
5823 const char *mangled_name = buf_ptr(get_mangled_name(g, &var->name, exported));5827 const char *mangled_name = buf_ptr(get_mangled_name(g, &var->name, exported));