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
signature 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) {...@@ -343,6 +343,10 @@ static bool cc_want_sret_attr(CallingConvention cc) {
343 zig_unreachable();343 zig_unreachable();
344}344}
345345
346static bool codegen_have_frame_pointer(CodeGen *g) {
347 return g->build_mode == BuildModeDebug;
348}
349
346static LLVMValueRef make_fn_llvm_value(CodeGen *g, ZigFn *fn) {350static 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 01024 // 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 01105 // 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 }
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
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 libraries8235 // 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 rather8247 // 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 }
82698275
...@@ -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
96859691
9686 return g;9692 return g;
9687}9693}
9688