@@ -44,7 +44,8 @@ class _Target(typing.Generic[_S, _R]):
4444 _ : dataclasses .KW_ONLY
4545 args : typing .Sequence [str ] = ()
4646 optimizer : type [_optimizers .Optimizer ] = _optimizers .Optimizer
47- prefix : str = ""
47+ label_prefix : typing .ClassVar [str ]
48+ symbol_prefix : typing .ClassVar [str ]
4849 stable : bool = False
4950 debug : bool = False
5051 verbose : bool = False
@@ -172,7 +173,9 @@ async def _compile(
172173 * shlex .split (self .cflags ),
173174 ]
174175 await _llvm .run ("clang" , args_s , echo = self .verbose )
175- self .optimizer (s , prefix = self .prefix ).run ()
176+ self .optimizer (
177+ s , label_prefix = self .label_prefix , symbol_prefix = self .symbol_prefix
178+ ).run ()
176179 args_o = [f"--target={ self .triple } " , "-c" , "-o" , f"{ o } " , f"{ s } " ]
177180 await _llvm .run ("clang" , args_o , echo = self .verbose )
178181 return await self ._parse (o )
@@ -274,7 +277,7 @@ def _handle_section(
274277 symbol = wrapped_symbol ["Symbol" ]
275278 offset = base + symbol ["Value" ]
276279 name = symbol ["Name" ]
277- name = name .removeprefix (self .prefix )
280+ name = name .removeprefix (self .symbol_prefix )
278281 if name not in group .symbols :
279282 group .symbols [name ] = value , offset
280283 for wrapped_relocation in section ["Relocations" ]:
@@ -285,9 +288,9 @@ def _handle_section(
285288 def _unwrap_dllimport (self , name : str ) -> tuple [_stencils .HoleValue , str | None ]:
286289 if name .startswith ("__imp_" ):
287290 name = name .removeprefix ("__imp_" )
288- name = name .removeprefix (self .prefix )
291+ name = name .removeprefix (self .symbol_prefix )
289292 return _stencils .HoleValue .GOT , name
290- name = name .removeprefix (self .prefix )
293+ name = name .removeprefix (self .symbol_prefix )
291294 return _stencils .symbol_to_value (name )
292295
293296 def _handle_relocation (
@@ -335,9 +338,24 @@ def _handle_relocation(
335338 return _stencils .Hole (offset , kind , value , symbol , addend )
336339
337340
341+ class _COFF32 (_COFF ):
342+ # These mangle like Mach-O and other "older" formats:
343+ label_prefix = "L"
344+ symbol_prefix = "_"
345+
346+
347+ class _COFF64 (_COFF ):
348+ # These mangle like ELF and other "newer" formats:
349+ label_prefix = ".L"
350+ symbol_prefix = ""
351+
352+
338353class _ELF (
339354 _Target [_schema .ELFSection , _schema .ELFRelocation ]
340355): # pylint: disable = too-few-public-methods
356+ label_prefix = ".L"
357+ symbol_prefix = ""
358+
341359 def _handle_section (
342360 self , section : _schema .ELFSection , group : _stencils .StencilGroup
343361 ) -> None :
@@ -374,7 +392,7 @@ def _handle_section(
374392 symbol = wrapped_symbol ["Symbol" ]
375393 offset = len (stencil .body ) + symbol ["Value" ]
376394 name = symbol ["Name" ]["Name" ]
377- name = name .removeprefix (self .prefix )
395+ name = name .removeprefix (self .symbol_prefix )
378396 group .symbols [name ] = value , offset
379397 stencil .body .extend (section ["SectionData" ]["Bytes" ])
380398 assert not section ["Relocations" ]
@@ -409,7 +427,7 @@ def _handle_relocation(
409427 },
410428 }:
411429 offset += base
412- s = s .removeprefix (self .prefix )
430+ s = s .removeprefix (self .symbol_prefix )
413431 value , symbol = _stencils .HoleValue .GOT , s
414432 case {
415433 "Addend" : addend ,
@@ -418,7 +436,7 @@ def _handle_relocation(
418436 "Type" : {"Name" : kind },
419437 }:
420438 offset += base
421- s = s .removeprefix (self .prefix )
439+ s = s .removeprefix (self .symbol_prefix )
422440 value , symbol = _stencils .symbol_to_value (s )
423441 case _:
424442 raise NotImplementedError (relocation )
@@ -428,17 +446,20 @@ def _handle_relocation(
428446class _MachO (
429447 _Target [_schema .MachOSection , _schema .MachORelocation ]
430448): # pylint: disable = too-few-public-methods
449+ label_prefix = "L"
450+ symbol_prefix = "_"
451+
431452 def _handle_section (
432453 self , section : _schema .MachOSection , group : _stencils .StencilGroup
433454 ) -> None :
434455 assert section ["Address" ] >= len (group .code .body )
435456 assert "SectionData" in section
436457 flags = {flag ["Name" ] for flag in section ["Attributes" ]["Flags" ]}
437458 name = section ["Name" ]["Value" ]
438- name = name .removeprefix (self .prefix )
459+ name = name .removeprefix (self .symbol_prefix )
439460 if "Debug" in flags :
440461 return
441- if "SomeInstructions " in flags :
462+ if "PureInstructions " in flags :
442463 value = _stencils .HoleValue .CODE
443464 stencil = group .code
444465 start_address = 0
@@ -459,7 +480,7 @@ def _handle_section(
459480 symbol = wrapped_symbol ["Symbol" ]
460481 offset = symbol ["Value" ] - start_address
461482 name = symbol ["Name" ]["Name" ]
462- name = name .removeprefix (self .prefix )
483+ name = name .removeprefix (self .symbol_prefix )
463484 group .symbols [name ] = value , offset
464485 assert "Relocations" in section
465486 for wrapped_relocation in section ["Relocations" ]:
@@ -484,7 +505,7 @@ def _handle_relocation(
484505 },
485506 }:
486507 offset += base
487- s = s .removeprefix (self .prefix )
508+ s = s .removeprefix (self .symbol_prefix )
488509 value , symbol = _stencils .HoleValue .GOT , s
489510 addend = 0
490511 case {
@@ -493,7 +514,7 @@ def _handle_relocation(
493514 "Type" : {"Name" : "X86_64_RELOC_GOT" | "X86_64_RELOC_GOT_LOAD" as kind },
494515 }:
495516 offset += base
496- s = s .removeprefix (self .prefix )
517+ s = s .removeprefix (self .symbol_prefix )
497518 value , symbol = _stencils .HoleValue .GOT , s
498519 addend = (
499520 int .from_bytes (raw [offset : offset + 4 ], "little" , signed = True ) - 4
@@ -508,7 +529,7 @@ def _handle_relocation(
508529 "Type" : {"Name" : "X86_64_RELOC_BRANCH" | "X86_64_RELOC_SIGNED" as kind },
509530 }:
510531 offset += base
511- s = s .removeprefix (self .prefix )
532+ s = s .removeprefix (self .symbol_prefix )
512533 value , symbol = _stencils .symbol_to_value (s )
513534 addend = (
514535 int .from_bytes (raw [offset : offset + 4 ], "little" , signed = True ) - 4
@@ -523,27 +544,27 @@ def _handle_relocation(
523544 "Type" : {"Name" : kind },
524545 }:
525546 offset += base
526- s = s .removeprefix (self .prefix )
547+ s = s .removeprefix (self .symbol_prefix )
527548 value , symbol = _stencils .symbol_to_value (s )
528549 addend = 0
529550 case _:
530551 raise NotImplementedError (relocation )
531552 return _stencils .Hole (offset , kind , value , symbol , addend )
532553
533554
534- def get_target (host : str ) -> _COFF | _ELF | _MachO :
555+ def get_target (host : str ) -> _COFF32 | _COFF64 | _ELF | _MachO :
535556 """Build a _Target for the given host "triple" and options."""
536557 optimizer : type [_optimizers .Optimizer ]
537- target : _COFF | _ELF | _MachO
558+ target : _COFF32 | _COFF64 | _ELF | _MachO
538559 if re .fullmatch (r"aarch64-apple-darwin.*" , host ):
539560 condition = "defined(__aarch64__) && defined(__APPLE__)"
540561 optimizer = _optimizers .OptimizerAArch64
541- target = _MachO (host , condition , optimizer = optimizer , prefix = "_" )
562+ target = _MachO (host , condition , optimizer = optimizer )
542563 elif re .fullmatch (r"aarch64-pc-windows-msvc" , host ):
543564 args = ["-fms-runtime-lib=dll" , "-fplt" ]
544565 condition = "defined(_M_ARM64)"
545566 optimizer = _optimizers .OptimizerAArch64
546- target = _COFF (host , condition , args = args , optimizer = optimizer )
567+ target = _COFF64 (host , condition , args = args , optimizer = optimizer )
547568 elif re .fullmatch (r"aarch64-.*-linux-gnu" , host ):
548569 # -mno-outline-atomics: Keep intrinsics from being emitted.
549570 args = ["-fpic" , "-mno-outline-atomics" ]
@@ -555,16 +576,16 @@ def get_target(host: str) -> _COFF | _ELF | _MachO:
555576 args = ["-DPy_NO_ENABLE_SHARED" , "-Wno-ignored-attributes" ]
556577 optimizer = _optimizers .OptimizerX86
557578 condition = "defined(_M_IX86)"
558- target = _COFF (host , condition , args = args , optimizer = optimizer , prefix = "_" )
579+ target = _COFF32 (host , condition , args = args , optimizer = optimizer )
559580 elif re .fullmatch (r"x86_64-apple-darwin.*" , host ):
560581 condition = "defined(__x86_64__) && defined(__APPLE__)"
561582 optimizer = _optimizers .OptimizerX86
562- target = _MachO (host , condition , optimizer = optimizer , prefix = "_" )
583+ target = _MachO (host , condition , optimizer = optimizer )
563584 elif re .fullmatch (r"x86_64-pc-windows-msvc" , host ):
564585 args = ["-fms-runtime-lib=dll" ]
565586 condition = "defined(_M_X64)"
566- optimizer = _optimizers .OptimizerX8664Windows
567- target = _COFF (host , condition , args = args , optimizer = optimizer )
587+ optimizer = _optimizers .OptimizerX86
588+ target = _COFF64 (host , condition , args = args , optimizer = optimizer )
568589 elif re .fullmatch (r"x86_64-.*-linux-gnu" , host ):
569590 args = ["-fno-pic" , "-mcmodel=medium" , "-mlarge-data-threshold=0" ]
570591 condition = "defined(__x86_64__) && defined(__linux__)"
0 commit comments