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