| ... | @@ -364,6 +364,29 @@ static bool codegen_have_frame_pointer(CodeGen *g) { | ... | @@ -364,6 +364,29 @@ static bool codegen_have_frame_pointer(CodeGen *g) { |
| 364 | return g->build_mode == BuildModeDebug; | 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 | static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { | 390 | static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 368 | const char *unmangled_name = buf_ptr(&fn->symbol_name); | 391 | const char *unmangled_name = buf_ptr(&fn->symbol_name); |
| 369 | const char *symbol_name; | 392 | const char *symbol_name; |
| ... | @@ -556,23 +579,10 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { | ... | @@ -556,23 +579,10 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 556 | maybe_import_dll(g, llvm_fn, linkage); | 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 | if (fn->alignstack_value != 0) { | 582 | if (fn->alignstack_value != 0) { |
| 564 | addLLVMFnAttrInt(llvm_fn, "alignstack", fn->alignstack_value); | 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 | if (codegen_have_frame_pointer(g) && cc != CallingConventionInline) { | 586 | if (codegen_have_frame_pointer(g) && cc != CallingConventionInline) { |
| 577 | ZigLLVMAddFunctionAttr(llvm_fn, "frame-pointer", "all"); | 587 | ZigLLVMAddFunctionAttr(llvm_fn, "frame-pointer", "all"); |
| 578 | } | 588 | } |
| ... | @@ -588,12 +598,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { | ... | @@ -588,12 +598,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 588 | // use the ABI alignment, which is fine. | 598 | // use the ABI alignment, which is fine. |
| 589 | } | 599 | } |
| 590 | | 600 | |
| 591 | if (g->zig_target->llvm_cpu_name != nullptr) { | 601 | add_common_fn_attributes(g, llvm_fn); |
| 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 | } | | |
| 597 | | 602 | |
| 598 | if (is_async) { | 603 | if (is_async) { |
| 599 | addLLVMArgAttr(llvm_fn, 0, "nonnull"); | 604 | addLLVMArgAttr(llvm_fn, 0, "nonnull"); |
| ... | @@ -1183,8 +1188,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) { | ... | @@ -1183,8 +1188,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) { |
| 1183 | addLLVMFnAttr(fn_val, "alwaysinline"); | 1188 | addLLVMFnAttr(fn_val, "alwaysinline"); |
| 1184 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 1189 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 1185 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 1190 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 1186 | addLLVMFnAttr(fn_val, "nounwind"); | 1191 | add_common_fn_attributes(g, fn_val); |
| 1187 | add_uwtable_attr(g, fn_val); | | |
| 1188 | // Error return trace memory is in the stack, which is impossible to be at address 0 | 1192 | // Error return trace memory is in the stack, which is impossible to be at address 0 |
| 1189 | // on any architecture. | 1193 | // on any architecture. |
| 1190 | addLLVMArgAttr(fn_val, (unsigned)0, "nonnull"); | 1194 | addLLVMArgAttr(fn_val, (unsigned)0, "nonnull"); |
| ... | @@ -1263,8 +1267,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) { | ... | @@ -1263,8 +1267,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) { |
| 1263 | addLLVMFnAttr(fn_val, "cold"); | 1267 | addLLVMFnAttr(fn_val, "cold"); |
| 1264 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 1268 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 1265 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 1269 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 1266 | addLLVMFnAttr(fn_val, "nounwind"); | 1270 | add_common_fn_attributes(g, fn_val); |
| 1267 | add_uwtable_attr(g, fn_val); | | |
| 1268 | if (codegen_have_frame_pointer(g)) { | 1271 | if (codegen_have_frame_pointer(g)) { |
| 1269 | ZigLLVMAddFunctionAttr(fn_val, "frame-pointer", "all"); | 1272 | ZigLLVMAddFunctionAttr(fn_val, "frame-pointer", "all"); |
| 1270 | } | 1273 | } |
| ... | @@ -1346,8 +1349,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { | ... | @@ -1346,8 +1349,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { |
| 1346 | addLLVMFnAttr(fn_val, "cold"); | 1349 | addLLVMFnAttr(fn_val, "cold"); |
| 1347 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 1350 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 1348 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 1351 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 1349 | addLLVMFnAttr(fn_val, "nounwind"); | 1352 | add_common_fn_attributes(g, fn_val); |
| 1350 | add_uwtable_attr(g, fn_val); | | |
| 1351 | if (codegen_have_frame_pointer(g)) { | 1353 | if (codegen_have_frame_pointer(g)) { |
| 1352 | ZigLLVMAddFunctionAttr(fn_val, "frame-pointer", "all"); | 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,8 +2324,7 @@ static LLVMValueRef get_merge_err_ret_traces_fn_val(CodeGen *g) { |
| 2322 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); | 2324 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 2323 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 2325 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 2324 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 2326 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 2325 | addLLVMFnAttr(fn_val, "nounwind"); | 2327 | add_common_fn_attributes(g, fn_val); |
| 2326 | add_uwtable_attr(g, fn_val); | | |
| 2327 | addLLVMArgAttr(fn_val, (unsigned)0, "noalias"); | 2328 | addLLVMArgAttr(fn_val, (unsigned)0, "noalias"); |
| 2328 | addLLVMArgAttr(fn_val, (unsigned)0, "writeonly"); | 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,8 +5267,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) { |
| 5266 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); | 5267 | LLVMValueRef fn_val = LLVMAddFunction(g->module, fn_name, fn_type_ref); |
| 5267 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); | 5268 | LLVMSetLinkage(fn_val, LLVMInternalLinkage); |
| 5268 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); | 5269 | ZigLLVMFunctionSetCallingConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 5269 | addLLVMFnAttr(fn_val, "nounwind"); | 5270 | add_common_fn_attributes(g, fn_val); |
| 5270 | add_uwtable_attr(g, fn_val); | | |
| 5271 | if (codegen_have_frame_pointer(g)) { | 5271 | if (codegen_have_frame_pointer(g)) { |
| 5272 | ZigLLVMAddFunctionAttr(fn_val, "frame-pointer", "all"); | 5272 | ZigLLVMAddFunctionAttr(fn_val, "frame-pointer", "all"); |
| 5273 | } | 5273 | } |