| ... | ... | @@ -446,6 +446,21 @@ static uint32_t get_err_ret_trace_arg_index(CodeGen *g, ZigFn *fn_table_entry) { |
| 446 | 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 | 464 | static LLVMValueRef fn_llvm_value(CodeGen *g, ZigFn *fn_table_entry) { |
| 450 | 465 | if (fn_table_entry->llvm_value) |
| 451 | 466 | return fn_table_entry->llvm_value; |
| ... | ... | @@ -539,6 +554,8 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, ZigFn *fn_table_entry) { |
| 539 | 554 | } |
| 540 | 555 | |
| 541 | 556 | if (fn_table_entry->body_node != nullptr) { |
| 557 | maybe_export_dll(g, fn_table_entry->llvm_value, linkage); |
| 558 | |
| 542 | 559 | bool want_fn_safety = g->build_mode != BuildModeFastRelease && |
| 543 | 560 | g->build_mode != BuildModeSmallRelease && |
| 544 | 561 | !fn_table_entry->def_scope->safety_off; |
| ... | ... | @@ -548,6 +565,8 @@ static LLVMValueRef fn_llvm_value(CodeGen *g, ZigFn *fn_table_entry) { |
| 548 | 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 | 572 | if (fn_table_entry->alignstack_value != 0) { |
| ... | ... | @@ -6107,6 +6126,7 @@ static void do_code_gen(CodeGen *g) { |
| 6107 | 6126 | // TODO debug info for the extern variable |
| 6108 | 6127 | |
| 6109 | 6128 | LLVMSetLinkage(global_value, LLVMExternalLinkage); |
| 6129 | maybe_import_dll(g, global_value, GlobalLinkageIdStrong); |
| 6110 | 6130 | LLVMSetAlignment(global_value, var->align_bytes); |
| 6111 | 6131 | LLVMSetGlobalConstant(global_value, var->gen_is_const); |
| 6112 | 6132 | } |
| ... | ... | @@ -6119,6 +6139,7 @@ static void do_code_gen(CodeGen *g) { |
| 6119 | 6139 | |
| 6120 | 6140 | if (exported) { |
| 6121 | 6141 | LLVMSetLinkage(global_value, LLVMExternalLinkage); |
| 6142 | maybe_export_dll(g, global_value, GlobalLinkageIdStrong); |
| 6122 | 6143 | } |
| 6123 | 6144 | if (tld_var->section_name) { |
| 6124 | 6145 | LLVMSetSection(global_value, buf_ptr(tld_var->section_name)); |