mirror of
https://github.com/python/cpython.git
synced 2025-07-24 11:44:31 +00:00
GH-115802: JIT "small" code for macOS and Linux (GH-115826)
This commit is contained in:
parent
5a83292213
commit
7259480957
3 changed files with 168 additions and 29 deletions
|
@ -37,6 +37,7 @@ class _Target(typing.Generic[_S, _R]):
|
|||
triple: str
|
||||
_: dataclasses.KW_ONLY
|
||||
alignment: int = 1
|
||||
args: typing.Sequence[str] = ()
|
||||
prefix: str = ""
|
||||
debug: bool = False
|
||||
force: bool = False
|
||||
|
@ -121,21 +122,14 @@ class _Target(typing.Generic[_S, _R]):
|
|||
"-fno-builtin",
|
||||
# SET_FUNCTION_ATTRIBUTE on 32-bit Windows debug builds:
|
||||
"-fno-jump-tables",
|
||||
# Position-independent code adds indirection to every load and jump:
|
||||
"-fno-pic",
|
||||
"-fno-plt",
|
||||
# Don't make calls to weird stack-smashing canaries:
|
||||
"-fno-stack-protector",
|
||||
# We have three options for code model:
|
||||
# - "small": the default, assumes that code and data reside in the
|
||||
# lowest 2GB of memory (128MB on aarch64)
|
||||
# - "medium": assumes that code resides in the lowest 2GB of memory,
|
||||
# and makes no assumptions about data (not available on aarch64)
|
||||
# - "large": makes no assumptions about either code or data
|
||||
"-mcmodel=large",
|
||||
"-o",
|
||||
f"{o}",
|
||||
"-std=c11",
|
||||
f"{c}",
|
||||
*self.args,
|
||||
]
|
||||
await _llvm.run("clang", args, echo=self.verbose)
|
||||
return await self._parse(o)
|
||||
|
@ -284,7 +278,23 @@ class _ELF(
|
|||
def _handle_relocation(
|
||||
self, base: int, relocation: _schema.ELFRelocation, raw: bytes
|
||||
) -> _stencils.Hole:
|
||||
symbol: str | None
|
||||
match relocation:
|
||||
case {
|
||||
"Addend": addend,
|
||||
"Offset": offset,
|
||||
"Symbol": {"Value": s},
|
||||
"Type": {
|
||||
"Value": "R_AARCH64_ADR_GOT_PAGE"
|
||||
| "R_AARCH64_LD64_GOT_LO12_NC"
|
||||
| "R_X86_64_GOTPCREL"
|
||||
| "R_X86_64_GOTPCRELX"
|
||||
| "R_X86_64_REX_GOTPCRELX" as kind
|
||||
},
|
||||
}:
|
||||
offset += base
|
||||
s = s.removeprefix(self.prefix)
|
||||
value, symbol = _stencils.HoleValue.GOT, s
|
||||
case {
|
||||
"Addend": addend,
|
||||
"Offset": offset,
|
||||
|
@ -358,6 +368,34 @@ class _MachO(
|
|||
s = s.removeprefix(self.prefix)
|
||||
value, symbol = _stencils.HoleValue.GOT, s
|
||||
addend = 0
|
||||
case {
|
||||
"Offset": offset,
|
||||
"Symbol": {"Value": s},
|
||||
"Type": {"Value": "X86_64_RELOC_GOT" | "X86_64_RELOC_GOT_LOAD" as kind},
|
||||
}:
|
||||
offset += base
|
||||
s = s.removeprefix(self.prefix)
|
||||
value, symbol = _stencils.HoleValue.GOT, s
|
||||
addend = (
|
||||
int.from_bytes(raw[offset : offset + 4], "little", signed=True) - 4
|
||||
)
|
||||
case {
|
||||
"Offset": offset,
|
||||
"Section": {"Value": s},
|
||||
"Type": {"Value": "X86_64_RELOC_SIGNED" as kind},
|
||||
} | {
|
||||
"Offset": offset,
|
||||
"Symbol": {"Value": s},
|
||||
"Type": {
|
||||
"Value": "X86_64_RELOC_BRANCH" | "X86_64_RELOC_SIGNED" as kind
|
||||
},
|
||||
}:
|
||||
offset += base
|
||||
s = s.removeprefix(self.prefix)
|
||||
value, symbol = _stencils.symbol_to_value(s)
|
||||
addend = (
|
||||
int.from_bytes(raw[offset : offset + 4], "little", signed=True) - 4
|
||||
)
|
||||
case {
|
||||
"Offset": offset,
|
||||
"Section": {"Value": s},
|
||||
|
@ -379,15 +417,19 @@ class _MachO(
|
|||
def get_target(host: str) -> _COFF | _ELF | _MachO:
|
||||
"""Build a _Target for the given host "triple" and options."""
|
||||
if re.fullmatch(r"aarch64-apple-darwin.*", host):
|
||||
return _MachO(host, alignment=8, prefix="_")
|
||||
args = ["-mcmodel=large"]
|
||||
return _MachO(host, alignment=8, args=args, prefix="_")
|
||||
if re.fullmatch(r"aarch64-.*-linux-gnu", host):
|
||||
return _ELF(host, alignment=8)
|
||||
args = ["-mcmodel=large"]
|
||||
return _ELF(host, alignment=8, args=args)
|
||||
if re.fullmatch(r"i686-pc-windows-msvc", host):
|
||||
return _COFF(host, prefix="_")
|
||||
args = ["-mcmodel=large"]
|
||||
return _COFF(host, args=args, prefix="_")
|
||||
if re.fullmatch(r"x86_64-apple-darwin.*", host):
|
||||
return _MachO(host, prefix="_")
|
||||
if re.fullmatch(r"x86_64-pc-windows-msvc", host):
|
||||
return _COFF(host)
|
||||
args = ["-mcmodel=large"]
|
||||
return _COFF(host, args=args)
|
||||
if re.fullmatch(r"x86_64-.*-linux-gnu", host):
|
||||
return _ELF(host)
|
||||
raise ValueError(host)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue