| ... | ... | @@ -364,6 +364,29 @@ static bool codegen_have_frame_pointer(CodeGen *g) { |
| 364 | 364 | return g->build_mode == BuildModeDebug; |
| 365 | 365 | } |
| 366 | 366 | |
| 367 | static void add_common_fn_attributes(CodeGen *g, LLVMValueRef llvm_fn) { |
| 368 | if (!g->red_zone) { |
| 369 | addLLVMFnAttr(llvm_fn, "noredzone"); |
| 370 | } |
| 371 | |
| 372 | addLLVMFnAttr(llvm_fn, "nounwind"); |
| 373 | add_uwtable_attr(g, llvm_fn); |
| 374 | addLLVMFnAttr(llvm_fn, "nobuiltin"); |
| 375 | |
| 376 | if (g->build_mode == BuildModeSmallRelease) { |
| 377 | // Optimize for small code size. |
| 378 | addLLVMFnAttr(llvm_fn, "minsize"); |
| 379 | addLLVMFnAttr(llvm_fn, "optsize"); |
| 380 | } |
| 381 | |
| 382 | if (g->zig_target->llvm_cpu_name != nullptr) { |
| 383 | ZigLLVMAddFunctionAttr(llvm_fn, "target-cpu", g->zig_target->llvm_cpu_name); |
| 384 | } |
| 385 | if (g->zig_target->llvm_cpu_features != nullptr) { |
| 386 | ZigLLVMAddFunctionAttr(llvm_fn, "target-features", g->zig_target->llvm_cpu_features); |
| 387 | } |
| 388 | } |
| 389 | |
| 367 | 390 | static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 368 | 391 | const char *unmangled_name = buf_ptr(&fn->symbol_name); |
| 369 | 392 | const char *symbol_name; |
| ... | ... | @@ -556,23 +579,10 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 556 | 579 | maybe_import_dll(g, llvm_fn, linkage); |
| 557 | 580 | } |
| 558 | 581 | |
| 559 | | if (!g->red_zone) { |
| 560 | | addLLVMFnAttr(llvm_fn, "noredzone"); |
| 561 | | } |
| 562 | | |
| 563 | 582 | if (fn->alignstack_value != 0) { |
| 564 | 583 | addLLVMFnAttrInt(llvm_fn, "alignstack", fn->alignstack_value); |
| 565 | 584 | } |
| 566 | 585 | |
| 567 | | if (g->build_mode == BuildModeSmallRelease) { |
| 568 | | // Optimize for small code size. |
| 569 | | addLLVMFnAttr(llvm_fn, "minsize"); |
| 570 | | addLLVMFnAttr(llvm_fn, "optsize"); |
| 571 | | } |
| 572 | | |
| 573 | | addLLVMFnAttr(llvm_fn, "nounwind"); |
| 574 | | add_uwtable_attr(g, llvm_fn); |
| 575 | | addLLVMFnAttr(llvm_fn, "nobuiltin"); |
| 576 | 586 | if (codegen_have_frame_pointer(g) && cc != CallingConventionInline) { |
| 577 | 587 | ZigLLVMAddFunctionAttr(llvm_fn, "frame-pointer", "all"); |
| 578 | 588 | } |
| ... | ... | @@ -588,12 +598,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 588 | 598 | // use the ABI alignment, which is fine. |
| 589 | 599 | } |
| 590 | 600 | |
| 591 | | if (g->zig_target->llvm_cpu_name != nullptr) { |
| 592 | | ZigLLVMAddFunctionAttr(llvm_fn, "target-cpu", g->zig_target->llvm_cpu_name); |
| 593 | | } |
| 594 | | if (g->zig_target->llvm_cpu_features != nullptr) { |
| 595 | | ZigLLVMAddFunctionAttr(llvm_fn, "target-features", g->zig_target->llvm_cpu_features); |
| 596 | | } |
| 601 | add_common_fn_attributes(g, llvm_fn); |
| 597 | 602 | |
| 598 | 603 | if (is_async) { |
| 599 | 604 | addLLVMArgAttr(llvm_fn, 0, "nonnull"); |
| ... | ... | @@ -1183,8 +1188,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) { |
| 1183 | 1188 | addLLVMFnAttr(fn_val, "alwaysinline"); |
| 1184 | 1189 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 1185 | 1190 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 1186 | | addLLVMFnAttr(fn_val, "nounwind"); |
| 1187 | | add_uwtable_attr(g, fn_val); |
| 1191 | add_common_fn_attributes(g, fn_val); |
| 1188 | 1192 | // Error return trace memory is in the stack, which is impossible to be at address 0 |
| 1189 | 1193 | // on any architecture. |
| 1190 | 1194 | addLLVMArgAttr(fn_val, (unsigned)0, "nonnull"); |
| ... | ... | @@ -1263,8 +1267,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) { |
| 1263 | 1267 | addLLVMFnAttr(fn_val, "cold"); |
| 1264 | 1268 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 1265 | 1269 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 1266 | | addLLVMFnAttr(fn_val, "nounwind"); |
| 1267 | | add_uwtable_attr(g, fn_val); |
| 1270 | add_common_fn_attributes(g, fn_val); |
| 1268 | 1271 | if (codegen_have_frame_pointer(g)) { |
| 1269 | 1272 | ZigLLVMAddFunctionAttr(fn_val, "frame-pointer", "all"); |
| 1270 | 1273 | } |
| ... | ... | @@ -1346,8 +1349,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { |
| 1346 | 1349 | addLLVMFnAttr(fn_val, "cold"); |
| 1347 | 1350 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 1348 | 1351 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 1349 | | addLLVMFnAttr(fn_val, "nounwind"); |
| 1350 | | add_uwtable_attr(g, fn_val); |
| 1352 | add_common_fn_attributes(g, fn_val); |
| 1351 | 1353 | if (codegen_have_frame_pointer(g)) { |
| 1352 | 1354 | ZigLLVMAddFunctionAttr(fn_val, "frame-pointer", "all"); |
| 1353 | 1355 | } |
| ... | ... | @@ -2322,8 +2324,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) { |
| 2322 | 2324 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 2323 | 2325 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 2324 | 2326 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 2325 | | addLLVMFnAttr(fn_val, "nounwind"); |
| 2326 | | add_uwtable_attr(g, fn_val); |
| 2327 | add_common_fn_attributes(g, fn_val); |
| 2327 | 2328 | addLLVMArgAttr(fn_val, (unsigned)0, "noalias"); |
| 2328 | 2329 | addLLVMArgAttr(fn_val, (unsigned)0, "writeonly"); |
| 2329 | 2330 | |
| ... | ... | @@ -5266,8 +5267,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) { |
| 5266 | 5267 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 5267 | 5268 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 5268 | 5269 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 5269 | | addLLVMFnAttr(fn_val, "nounwind"); |
| 5270 | | add_uwtable_attr(g, fn_val); |
| 5270 | add_common_fn_attributes(g, fn_val); |
| 5271 | 5271 | if (codegen_have_frame_pointer(g)) { |
| 5272 | 5272 | ZigLLVMAddFunctionAttr(fn_val, "frame-pointer", "all"); |
| 5273 | 5273 | } |