]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
GH-119726: Emit AArch64 trampolines out-of-line (GH-121280)
authorDiego Russo <diego.russo@arm.com>
Wed, 3 Jul 2024 13:22:21 +0000 (14:22 +0100)
committerGitHub <noreply@github.com>
Wed, 3 Jul 2024 13:22:21 +0000 (06:22 -0700)
Misc/NEWS.d/next/Core and Builtins/2024-06-28-18-34-49.gh-issue-119726.Fjv_Ab.rst [new file with mode: 0644]
Tools/jit/_stencils.py

diff --git a/Misc/NEWS.d/next/Core and Builtins/2024-06-28-18-34-49.gh-issue-119726.Fjv_Ab.rst b/Misc/NEWS.d/next/Core and Builtins/2024-06-28-18-34-49.gh-issue-119726.Fjv_Ab.rst
new file mode 100644 (file)
index 0000000..cf5d614
--- /dev/null
@@ -0,0 +1,2 @@
+Optimize code layout for calls to C functions from the JIT on AArch64.
+Patch by Diego Russo.
index 68eb1d13394170618f6c66211b99b012114bd9c2..1c6a9edb39840d8b4e4abe296ea6903401e0e108 100644 (file)
@@ -184,7 +184,7 @@ class Stencil:
         self.disassembly.append(f"{offset:x}: {' '.join(['00'] * padding)}")
         self.body.extend([0] * padding)
 
-    def emit_aarch64_trampoline(self, hole: Hole, alignment: int) -> None:
+    def emit_aarch64_trampoline(self, hole: Hole, alignment: int) -> Hole:
         """Even with the large code model, AArch64 Linux insists on 28-bit jumps."""
         assert hole.symbol is not None
         reuse_trampoline = hole.symbol in self.trampolines
@@ -194,14 +194,10 @@ class Stencil:
         else:
             self.pad(alignment)
             base = len(self.body)
-        where = slice(hole.offset, hole.offset + 4)
-        instruction = int.from_bytes(self.body[where], sys.byteorder)
-        instruction &= 0xFC000000
-        instruction |= ((base - hole.offset) >> 2) & 0x03FFFFFF
-        self.body[where] = instruction.to_bytes(4, sys.byteorder)
+        new_hole = hole.replace(addend=base, symbol=None, value=HoleValue.DATA)
 
         if reuse_trampoline:
-            return
+            return new_hole
 
         self.disassembly += [
             f"{base + 4 * 0:x}: 58000048      ldr     x8, 8",
@@ -219,6 +215,7 @@ class Stencil:
             self.body.extend(code)
         self.holes.append(hole.replace(offset=base + 8, kind="R_AARCH64_ABS64"))
         self.trampolines[hole.symbol] = base
+        return new_hole
 
     def remove_jump(self, *, alignment: int = 1) -> None:
         """Remove a zero-length continuation jump, if it exists."""
@@ -294,8 +291,9 @@ class StencilGroup:
                 in {"R_AARCH64_CALL26", "R_AARCH64_JUMP26", "ARM64_RELOC_BRANCH26"}
                 and hole.value is HoleValue.ZERO
             ):
-                self.code.emit_aarch64_trampoline(hole, alignment)
+                new_hole = self.data.emit_aarch64_trampoline(hole, alignment)
                 self.code.holes.remove(hole)
+                self.code.holes.append(new_hole)
         self.code.remove_jump(alignment=alignment)
         self.code.pad(alignment)
         self.data.pad(8)