authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-04 20:44:52-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-04 20:44:52-04:00
logf27e5d439c121e620b2c0d9d7a6a8f4154826aa8
tree5be0ca1ce7d361e9baef87c33cdfae386e664a27
parentb7c94be6881e68fe40b432778163f1e9bca43e3d
signaturelock-open Commit is signed but in an unrecognized format.

refactor logic for determining if there is a frame pointer


1 files changed, 15 insertions(+), 10 deletions(-)

src/codegen.cpp+15-10
......@@ -343,6 +343,10 @@ static bool cc_want_sret_attr(CallingConvention cc) {
343343 zig_unreachable();
344344}
345345
346static bool codegen_have_frame_pointer(CodeGen *g) {
347 return g->build_mode == BuildModeDebug;
348}
349
346350static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {
347351 Buf *unmangled_name = &fn->symbol_name;
348352 Buf *symbol_name;
......@@ -482,7 +486,7 @@ static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {
482486 addLLVMFnAttr(llvm_fn, "nounwind");
483487 add_uwtable_attr(g, llvm_fn);
484488 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) {
486490 ZigLLVMAddFunctionAttr(llvm_fn, "no-frame-pointer-elim", "true");
487491 ZigLLVMAddFunctionAttr(llvm_fn, "no-frame-pointer-elim-non-leaf", nullptr);
488492 }
......@@ -1020,7 +1024,7 @@ static LLVMValueRef get_add_error_return_trace_addr_fn(CodeGen *g) {
10201024 // Error return trace memory is in the stack, which is impossible to be at address 0
10211025 // on any architecture.
10221026 addLLVMArgAttr(fn_val, (unsigned)0, "nonnull");
1023 if (g->build_mode == BuildModeDebug) {
1027 if (codegen_have_frame_pointer(g)) {
10241028 ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim", "true");
10251029 ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim-non-leaf", nullptr);
10261030 }
......@@ -1101,7 +1105,7 @@ static LLVMValueRef get_return_err_fn(CodeGen *g) {
11011105 // Error return trace memory is in the stack, which is impossible to be at address 0
11021106 // on any architecture.
11031107 addLLVMArgAttr(fn_val, (unsigned)0, "nonnull");
1104 if (g->build_mode == BuildModeDebug) {
1108 if (codegen_have_frame_pointer(g)) {
11051109 ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim", "true");
11061110 ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim-non-leaf", nullptr);
11071111 }
......@@ -1173,7 +1177,7 @@ static LLVMValueRef get_safety_crash_err_fn(CodeGen *g) {
11731177 LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));
11741178 addLLVMFnAttr(fn_val, "nounwind");
11751179 add_uwtable_attr(g, fn_val);
1176 if (g->build_mode == BuildModeDebug) {
1180 if (codegen_have_frame_pointer(g)) {
11771181 ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim", "true");
11781182 ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim-non-leaf", nullptr);
11791183 }
......@@ -4210,7 +4214,7 @@ static LLVMValueRef get_enum_tag_name_function(CodeGen *g, ZigType *enum_type) {
42104214 LLVMSetFunctionCallConv(fn_val, get_llvm_cc(g, CallingConventionUnspecified));
42114215 addLLVMFnAttr(fn_val, "nounwind");
42124216 add_uwtable_attr(g, fn_val);
4213 if (g->build_mode == BuildModeDebug) {
4217 if (codegen_have_frame_pointer(g)) {
42144218 ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim", "true");
42154219 ZigLLVMAddFunctionAttr(fn_val, "no-frame-pointer-elim-non-leaf", nullptr);
42164220 }
......@@ -8220,6 +8224,12 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa
82208224 args.append("-g");
82218225 }
82228226
8227 if (codegen_have_frame_pointer(g)) {
8228 args.append("-fno-omit-frame-pointer");
8229 } else {
8230 args.append("-fomit-frame-pointer");
8231 }
8232
82238233 switch (g->build_mode) {
82248234 case BuildModeDebug:
82258235 // 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
82328242 } else {
82338243 args.append("-fno-stack-protector");
82348244 }
8235 args.append("-fno-omit-frame-pointer");
82368245 break;
82378246 case BuildModeSafeRelease:
82388247 // 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
82468255 } else {
82478256 args.append("-fno-stack-protector");
82488257 }
8249 args.append("-fomit-frame-pointer");
82508258 break;
82518259 case BuildModeFastRelease:
82528260 args.append("-DNDEBUG");
......@@ -8257,13 +8265,11 @@ void add_cc_args(CodeGen *g, ZigList<const char *> &args, const char *out_dep_pa
82578265 // running in -O2 and thus the -O3 path has been tested less.
82588266 args.append("-O2");
82598267 args.append("-fno-stack-protector");
8260 args.append("-fomit-frame-pointer");
82618268 break;
82628269 case BuildModeSmallRelease:
82638270 args.append("-DNDEBUG");
82648271 args.append("-Os");
82658272 args.append("-fno-stack-protector");
8266 args.append("-fomit-frame-pointer");
82678273 break;
82688274 }
82698275
......@@ -9685,4 +9691,3 @@ CodeGen *codegen_create(Buf *main_pkg_path, Buf *root_src_path, const ZigTarget
96859691
96869692 return g;
96879693}
9688