Skip to content

Commit 38e11b9

Browse files
Touch up and add better comments
1 parent d715cf2 commit 38e11b9

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

Python/jit.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -428,8 +428,9 @@ void patch_x86_64_trampoline(unsigned char *location, int ordinal, jit_state *st
428428
#define TRAMPOLINE_SIZE 16
429429
#define DATA_ALIGN 8
430430
#elif defined(__x86_64__) && defined(__APPLE__)
431-
// x86_64 trampolines: jmp *(%rip); .quad address (6 bytes + 8 bytes = 14 bytes)
432-
#define TRAMPOLINE_SIZE 16 // Round up to 16 for alignment
431+
// LLVM 20 on macOS x86_64 debug builds: GOT entries may exceed ±2GB PC-relative
432+
// range. Trampolines provide indirect jumps using 64-bit absolute addresses.
433+
#define TRAMPOLINE_SIZE 16 // 14 bytes + 2 bytes padding for alignment
433434
#define DATA_ALIGN 16
434435
#else
435436
#define TRAMPOLINE_SIZE 0
@@ -489,7 +490,7 @@ patch_x86_64_trampoline(unsigned char *location, int ordinal, jit_state *state)
489490
uint64_t value = (uintptr_t)symbols_map[ordinal];
490491
int64_t range = (int64_t)value - 4 - (int64_t)location;
491492

492-
// If we are in range of 32 signed bits, patch directly
493+
// If we are in range of 32 signed bits, we can patch directly
493494
if (range >= -(1LL << 31) && range < (1LL << 31)) {
494495
patch_32r(location, value - 4);
495496
return;
@@ -510,12 +511,13 @@ patch_x86_64_trampoline(unsigned char *location, int ordinal, jit_state *state)
510511
assert((size_t)(index + 1) * TRAMPOLINE_SIZE <= state->trampolines.size);
511512

512513
/* Generate the trampoline (14 bytes, padded to 16):
513-
0: ff 25 00 00 00 00 jmp *(%rip) # Jump to address at offset 6
514-
6: XX XX XX XX XX XX XX XX .quad value (64-bit address)
514+
0: ff 25 00 00 00 00 jmp *(%rip)
515+
6: XX XX XX XX XX XX XX XX (64-bit target address)
516+
517+
Reference: https://wiki.osdev.org/X86-64_Instruction_Encoding#FF (JMP r/m64)
515518
*/
516-
trampoline[0] = 0xFF; // jmp opcode
517-
trampoline[1] = 0x25; // ModRM byte for jmp *disp32(%rip)
518-
// Offset 0: the address is right after this instruction (at offset 6)
519+
trampoline[0] = 0xFF;
520+
trampoline[1] = 0x25;
519521
*(uint32_t *)(trampoline + 2) = 0;
520522
*(uint64_t *)(trampoline + 6) = value;
521523

0 commit comments

Comments
 (0)