authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-27 10:22:16-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-27 10:22:16-04:00
logaf3263d7a87c922cbcb047944ee94123c69cfac1
treed978f66eb1ecb90ad65f94c9151fd1472c955689
parente7d9d00ac8c2bb075d0f67842b58718aececdc09

add dll export storage class where appropriate

closes #1443

1 files changed, 21 insertions(+), 0 deletions(-)

src/codegen.cpp+21
...@@ -446,6 +446,21 @@ static uint32_t get_err_ret_trace_arg_index(CodeGen *g, ZigFn *fn_table_entry) {...@@ -446,6 +446,21 @@ static uint32_t get_err_ret_trace_arg_index(CodeGen *g, ZigFn *fn_table_entry) {
446 return first_arg_ret ? 1 : 0;446 return first_arg_ret ? 1 : 0;
447}447}
448448
449static void maybe_export_dll(CodeGen *g, LLVMValueRef global_value, GlobalLinkageId linkage) {
450 if (linkage != GlobalLinkageIdInternal && g->zig_target.os == OsWindows) {
451 LLVMSetDLLStorageClass(global_value, LLVMDLLExportStorageClass);
452 }
453}
454
455static void maybe_import_dll(CodeGen *g, LLVMValueRef global_value, GlobalLinkageId linkage) {
456 if (linkage != GlobalLinkageIdInternal && g->zig_target.os == OsWindows) {
457 // TODO come up with a good explanation/understanding for why we never do
458 // DLLImportStorageClass. Empirically it only causes problems. But let's have
459 // this documented and then clean up the code accordingly.
460 //LLVMSetDLLStorageClass(global_value, LLVMDLLImportStorageClass);
461 }
462}
463
449static LLVMValueRef fn_llvm_value(CodeGen *g, ZigFn *fn_table_entry) {464static LLVMValueRef fn_llvm_value(CodeGen *g, ZigFn *fn_table_entry) {
450 if (fn_table_entry->llvm_value)465 if (fn_table_entry->llvm_value)
451 return fn_table_entry->llvm_value;466 return fn_table_entry->llvm_value;
...@@ -539,6 +554,8 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, ZigFn *fn_table_entry) {...@@ -539,6 +554,8 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, ZigFn *fn_table_entry) {
539 }554 }
540555
541 if (fn_table_entry->body_node != nullptr) {556 if (fn_table_entry->body_node != nullptr) {
557 maybe_export_dll(g, fn_table_entry->llvm_value, linkage);
558
542 bool want_fn_safety = g->build_mode != BuildModeFastRelease &&559 bool want_fn_safety = g->build_mode != BuildModeFastRelease &&
543 g->build_mode != BuildModeSmallRelease &&560 g->build_mode != BuildModeSmallRelease &&
544 !fn_table_entry->def_scope->safety_off;561 !fn_table_entry->def_scope->safety_off;
...@@ -548,6 +565,8 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, ZigFn *fn_table_entry) {...@@ -548,6 +565,8 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, ZigFn *fn_table_entry) {
548 addLLVMFnAttrStr(fn_table_entry->llvm_value, "stack-protector-buffer-size", "4");565 addLLVMFnAttrStr(fn_table_entry->llvm_value, "stack-protector-buffer-size", "4");
549 }566 }
550 }567 }
568 } else {
569 maybe_import_dll(g, fn_table_entry->llvm_value, linkage);
551 }570 }
552571
553 if (fn_table_entry->alignstack_value != 0) {572 if (fn_table_entry->alignstack_value != 0) {
...@@ -6107,6 +6126,7 @@ static void do_code_gen(CodeGen *g) {...@@ -6107,6 +6126,7 @@ static void do_code_gen(CodeGen *g) {
6107 // TODO debug info for the extern variable6126 // TODO debug info for the extern variable
61086127
6109 LLVMSetLinkage(global_value, LLVMExternalLinkage);6128 LLVMSetLinkage(global_value, LLVMExternalLinkage);
6129 maybe_import_dll(g, global_value, GlobalLinkageIdStrong);
6110 LLVMSetAlignment(global_value, var->align_bytes);6130 LLVMSetAlignment(global_value, var->align_bytes);
6111 LLVMSetGlobalConstant(global_value, var->gen_is_const);6131 LLVMSetGlobalConstant(global_value, var->gen_is_const);
6112 }6132 }
...@@ -6119,6 +6139,7 @@ static void do_code_gen(CodeGen *g) {...@@ -6119,6 +6139,7 @@ static void do_code_gen(CodeGen *g) {
61196139
6120 if (exported) {6140 if (exported) {
6121 LLVMSetLinkage(global_value, LLVMExternalLinkage);6141 LLVMSetLinkage(global_value, LLVMExternalLinkage);
6142 maybe_export_dll(g, global_value, GlobalLinkageIdStrong);
6122 }6143 }
6123 if (tld_var->section_name) {6144 if (tld_var->section_name) {
6124 LLVMSetSection(global_value, buf_ptr(tld_var->section_name));6145 LLVMSetSection(global_value, buf_ptr(tld_var->section_name));