@@ -51,6 +51,7 @@ class _Target(typing.Generic[_S, _R]):
5151 debug : bool = False
5252 verbose : bool = False
5353 cflags : str = ""
54+ frame_pointers : bool = False
5455 llvm_version : str = _llvm ._LLVM_VERSION
5556 known_symbols : dict [str , int ] = dataclasses .field (default_factory = dict )
5657 pyconfig_dir : pathlib .Path = pathlib .Path .cwd ().resolve ()
@@ -158,7 +159,6 @@ async def _compile(
158159 # code than -O3). As a nice benefit, it uses less memory too:
159160 "-Os" ,
160161 "-S" ,
161- "-Xclang" , f"-mframe-pointer={ 'all' if opname == 'shim' else 'reserved' } " ,
162162 # Shorten full absolute file paths in the generated code (like the
163163 # __FILE__ macro and assert failure messages) for reproducibility:
164164 f"-ffile-prefix-map={ CPYTHON } =." ,
@@ -175,10 +175,13 @@ async def _compile(
175175 "-o" ,
176176 f"{ s } " ,
177177 f"{ c } " ,
178- * self .args ,
179- # Allow user-provided CFLAGS to override any defaults
180- * shlex .split (self .cflags ),
181178 ]
179+ if self .frame_pointers :
180+ frame_pointer = "all" if opname == "shim" else "reserved"
181+ args_s += ["-Xclang" , f"-mframe-pointer={ frame_pointer } " ]
182+ args_s += self .args
183+ # Allow user-provided CFLAGS to override any defaults
184+ args_s += shlex .split (self .cflags )
182185 await _llvm .run (
183186 "clang" , args_s , echo = self .verbose , llvm_version = self .llvm_version
184187 )
@@ -614,7 +617,9 @@ def get_target(host: str) -> _COFF32 | _COFF64 | _ELF | _MachO:
614617 condition = "defined(__x86_64__) && defined(__linux__)"
615618 args = ["-fno-pic" , "-mcmodel=medium" , "-mlarge-data-threshold=0" , "-fno-plt" ]
616619 optimizer = _optimizers .OptimizerX86
617- target = _ELF (host , condition , args = args , optimizer = optimizer )
620+ target = _ELF (
621+ host , condition , args = args , optimizer = optimizer , frame_pointers = True
622+ )
618623 else :
619624 raise ValueError (host )
620625 return target
0 commit comments