| ... | @@ -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 | } |
| 448 | | 448 | |
| | 449 | static 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 | |
| | 455 | static 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 | |
| 449 | static LLVMValueRef fn_llvm_value(CodeGen *g, ZigFn *fn_table_entry) { | 464 | static 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 | } |
| 540 | | 555 | |
| 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 | } |
| 552 | | 571 | |
| 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 variable | 6126 | // TODO debug info for the extern variable |
| 6108 | | 6127 | |
| 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) { |
| 6119 | | 6139 | |
| 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)); |