| ... | ... | @@ -343,6 +343,10 @@ static bool cc_want_sret_attr(CallingConvention cc) { |
| 343 | 343 | zig_unreachable(); |
| 344 | 344 | } |
| 345 | 345 | |
| 346 | static bool codegen_have_frame_pointer(CodeGen *g) { |
| 347 | return g->build_mode == BuildModeDebug; |
| 348 | } |
| 349 | |
| 346 | 350 | static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 347 | 351 | Buf *unmangled_name = &fn->symbol_name; |
| 348 | 352 | Buf *symbol_name; |
| ... | ... | @@ -482,7 +486,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) { |
| 482 | 486 | addLLVMFnAttr(llvm_fn, "nounwind"); |
| 483 | 487 | add_uwtable_attr(g, llvm_fn); |
| 484 | 488 | addLLVMFnAttr(llvm_fn, "nobuiltin"); |
| 485 | | if (g->build_mode == BuildModeDebug && fn->fn_inline != FnInlineAlways) { |
| 489 | if (codegen_have_frame_pointer(g) && fn->fn_inline != FnInlineAlways) { |
| 486 | 490 | ZigLLVMAddFunctionAttr(llvm_fn, "no-frame-pointer-elim", "true"); |
| 487 | 491 | ZigLLVMAddFunctionAttr(llvm_fn, "no-frame-pointer-elim-non-leaf", nullptr); |
| 488 | 492 | } |
| ... | ... | @@ -1020,7 +1024,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) { |
| 1020 | 1024 | // Error return trace memory is in the stack, which is impossible to be at address 0 |
| 1021 | 1025 | // on any architecture. |
| 1022 | 1026 | addLLVMArgAttr(fn_val, (unsigned)0, "nonnull"); |
| 1023 | | if (g->build_mode == BuildModeDebug) { |
| 1027 | if (codegen_have_frame_pointer(g)) { |
| 1024 | 1028 | ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim", "true"); |
| 1025 | 1029 | ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim-non-leaf", nullptr); |
| 1026 | 1030 | } |
| ... | ... | @@ -1101,7 +1105,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) { |
| 1101 | 1105 | // Error return trace memory is in the stack, which is impossible to be at address 0 |
| 1102 | 1106 | // on any architecture. |
| 1103 | 1107 | addLLVMArgAttr(fn_val, (unsigned)0, "nonnull"); |
| 1104 | | if (g->build_mode == BuildModeDebug) { |
| 1108 | if (codegen_have_frame_pointer(g)) { |
| 1105 | 1109 | ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim", "true"); |
| 1106 | 1110 | ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim-non-leaf", nullptr); |
| 1107 | 1111 | } |
| ... | ... | @@ -1173,7 +1177,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) { |
| 1173 | 1177 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 1174 | 1178 | addLLVMFnAttr(fn_val, "nounwind"); |
| 1175 | 1179 | add_uwtable_attr(g, fn_val); |
| 1176 | | if (g->build_mode == BuildModeDebug) { |
| 1180 | if (codegen_have_frame_pointer(g)) { |
| 1177 | 1181 | ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim", "true"); |
| 1178 | 1182 | ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim-non-leaf", nullptr); |
| 1179 | 1183 | } |
| ... | ... | @@ -4210,7 +4214,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) { |
| 4210 | 4214 | LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified)); |
| 4211 | 4215 | addLLVMFnAttr(fn_val, "nounwind"); |
| 4212 | 4216 | add_uwtable_attr(g, fn_val); |
| 4213 | | if (g->build_mode == BuildModeDebug) { |
| 4217 | if (codegen_have_frame_pointer(g)) { |
| 4214 | 4218 | ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim", "true"); |
| 4215 | 4219 | ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim-non-leaf", nullptr); |
| 4216 | 4220 | } |
| ... | ... | @@ -8220,6 +8224,12 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 8220 | 8224 | args.append("-g"); |
| 8221 | 8225 | } |
| 8222 | 8226 | |
| 8227 | if (codegen_have_frame_pointer(g)) { |
| 8228 | args.append("-fno-omit-frame-pointer"); |
| 8229 | } else { |
| 8230 | args.append("-fomit-frame-pointer"); |
| 8231 | } |
| 8232 | |
| 8223 | 8233 | switch (g->build_mode) { |
| 8224 | 8234 | case BuildModeDebug: |
| 8225 | 8235 | // windows c runtime requires -D_DEBUG if using debug libraries |
| ... | ... | @@ -8232,7 +8242,6 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 8232 | 8242 | } else { |
| 8233 | 8243 | args.append("-fno-stack-protector"); |
| 8234 | 8244 | } |
| 8235 | | args.append("-fno-omit-frame-pointer"); |
| 8236 | 8245 | break; |
| 8237 | 8246 | case BuildModeSafeRelease: |
| 8238 | 8247 | // See the comment in the BuildModeFastRelease case for why we pass -O2 rather |
| ... | ... | @@ -8246,7 +8255,6 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 8246 | 8255 | } else { |
| 8247 | 8256 | args.append("-fno-stack-protector"); |
| 8248 | 8257 | } |
| 8249 | | args.append("-fomit-frame-pointer"); |
| 8250 | 8258 | break; |
| 8251 | 8259 | case BuildModeFastRelease: |
| 8252 | 8260 | args.append("-DNDEBUG"); |
| ... | ... | @@ -8257,13 +8265,11 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa |
| 8257 | 8265 | // running in -O2 and thus the -O3 path has been tested less. |
| 8258 | 8266 | args.append("-O2"); |
| 8259 | 8267 | args.append("-fno-stack-protector"); |
| 8260 | | args.append("-fomit-frame-pointer"); |
| 8261 | 8268 | break; |
| 8262 | 8269 | case BuildModeSmallRelease: |
| 8263 | 8270 | args.append("-DNDEBUG"); |
| 8264 | 8271 | args.append("-Os"); |
| 8265 | 8272 | args.append("-fno-stack-protector"); |
| 8266 | | args.append("-fomit-frame-pointer"); |
| 8267 | 8273 | break; |
| 8268 | 8274 | } |
| 8269 | 8275 | |
| ... | ... | @@ -9685,4 +9691,3 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget |
| 9685 | 9691 | |
| 9686 | 9692 | return g; |
| 9687 | 9693 | } |
| 9688 | | |