Fix up all GOT and internal relocations for this stencil group.
(self, known_symbols: dict[str, int])
| 249 | self.code.holes.append(hole) |
| 250 | |
| 251 | def process_relocations(self, known_symbols: dict[str, int]) -> None: |
| 252 | """Fix up all GOT and internal relocations for this stencil group.""" |
| 253 | for hole in self.code.holes.copy(): |
| 254 | if ( |
| 255 | hole.kind |
| 256 | in {"R_AARCH64_CALL26", "R_AARCH64_JUMP26", "ARM64_RELOC_BRANCH26"} |
| 257 | and hole.value is HoleValue.ZERO |
| 258 | and hole.symbol not in self.symbols |
| 259 | ): |
| 260 | hole.func = "patch_aarch64_trampoline" |
| 261 | hole.need_state = True |
| 262 | assert hole.symbol is not None |
| 263 | if hole.symbol in known_symbols: |
| 264 | ordinal = known_symbols[hole.symbol] |
| 265 | else: |
| 266 | ordinal = len(known_symbols) |
| 267 | known_symbols[hole.symbol] = ordinal |
| 268 | self._trampolines.add(ordinal) |
| 269 | hole.addend = ordinal |
| 270 | hole.symbol = None |
| 271 | # x86_64 Darwin trampolines for external symbols |
| 272 | elif ( |
| 273 | hole.kind == "X86_64_RELOC_BRANCH" |
| 274 | and hole.value is HoleValue.ZERO |
| 275 | and hole.symbol not in self.symbols |
| 276 | ): |
| 277 | hole.func = "patch_x86_64_trampoline" |
| 278 | hole.need_state = True |
| 279 | assert hole.symbol is not None |
| 280 | if hole.symbol in known_symbols: |
| 281 | ordinal = known_symbols[hole.symbol] |
| 282 | else: |
| 283 | ordinal = len(known_symbols) |
| 284 | known_symbols[hole.symbol] = ordinal |
| 285 | self._trampolines.add(ordinal) |
| 286 | hole.addend = ordinal |
| 287 | hole.symbol = None |
| 288 | elif ( |
| 289 | hole.kind in _AARCH64_GOT_RELOCATIONS | _X86_GOT_RELOCATIONS |
| 290 | and hole.symbol |
| 291 | and "_JIT_" not in hole.symbol |
| 292 | and hole.value is HoleValue.GOT |
| 293 | ): |
| 294 | if hole.symbol in known_symbols: |
| 295 | ordinal = known_symbols[hole.symbol] |
| 296 | else: |
| 297 | ordinal = len(known_symbols) |
| 298 | known_symbols[hole.symbol] = ordinal |
| 299 | self._got_entries.add(ordinal) |
| 300 | self.data.pad(8) |
| 301 | for stencil in [self.code, self.data]: |
| 302 | for hole in stencil.holes: |
| 303 | if hole.value is HoleValue.GOT: |
| 304 | assert hole.symbol is not None |
| 305 | if "_JIT_" in hole.symbol: |
| 306 | # Relocations for local symbols |
| 307 | hole.value = HoleValue.DATA |
| 308 | hole.addend += self._jit_symbol_table_lookup(hole.symbol) |
no test coverage detected