@@ -44,7 +44,8 @@ class _Target(typing.Generic[_S, _R]):
44
44
_ : dataclasses .KW_ONLY
45
45
args : typing .Sequence [str ] = ()
46
46
optimizer : type [_optimizers .Optimizer ] = _optimizers .Optimizer
47
- prefix : str = ""
47
+ label_prefix : typing .ClassVar [str ]
48
+ symbol_prefix : typing .ClassVar [str ]
48
49
stable : bool = False
49
50
debug : bool = False
50
51
verbose : bool = False
@@ -172,7 +173,9 @@ async def _compile(
172
173
* shlex .split (self .cflags ),
173
174
]
174
175
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 ()
176
179
args_o = [f"--target={ self .triple } " , "-c" , "-o" , f"{ o } " , f"{ s } " ]
177
180
await _llvm .run ("clang" , args_o , echo = self .verbose )
178
181
return await self ._parse (o )
@@ -274,7 +277,7 @@ def _handle_section(
274
277
symbol = wrapped_symbol ["Symbol" ]
275
278
offset = base + symbol ["Value" ]
276
279
name = symbol ["Name" ]
277
- name = name .removeprefix (self .prefix )
280
+ name = name .removeprefix (self .symbol_prefix )
278
281
if name not in group .symbols :
279
282
group .symbols [name ] = value , offset
280
283
for wrapped_relocation in section ["Relocations" ]:
@@ -285,9 +288,9 @@ def _handle_section(
285
288
def _unwrap_dllimport (self , name : str ) -> tuple [_stencils .HoleValue , str | None ]:
286
289
if name .startswith ("__imp_" ):
287
290
name = name .removeprefix ("__imp_" )
288
- name = name .removeprefix (self .prefix )
291
+ name = name .removeprefix (self .symbol_prefix )
289
292
return _stencils .HoleValue .GOT , name
290
- name = name .removeprefix (self .prefix )
293
+ name = name .removeprefix (self .symbol_prefix )
291
294
return _stencils .symbol_to_value (name )
292
295
293
296
def _handle_relocation (
@@ -335,9 +338,24 @@ def _handle_relocation(
335
338
return _stencils .Hole (offset , kind , value , symbol , addend )
336
339
337
340
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
+
338
353
class _ELF (
339
354
_Target [_schema .ELFSection , _schema .ELFRelocation ]
340
355
): # pylint: disable = too-few-public-methods
356
+ label_prefix = ".L"
357
+ symbol_prefix = ""
358
+
341
359
def _handle_section (
342
360
self , section : _schema .ELFSection , group : _stencils .StencilGroup
343
361
) -> None :
@@ -374,7 +392,7 @@ def _handle_section(
374
392
symbol = wrapped_symbol ["Symbol" ]
375
393
offset = len (stencil .body ) + symbol ["Value" ]
376
394
name = symbol ["Name" ]["Name" ]
377
- name = name .removeprefix (self .prefix )
395
+ name = name .removeprefix (self .symbol_prefix )
378
396
group .symbols [name ] = value , offset
379
397
stencil .body .extend (section ["SectionData" ]["Bytes" ])
380
398
assert not section ["Relocations" ]
@@ -409,7 +427,7 @@ def _handle_relocation(
409
427
},
410
428
}:
411
429
offset += base
412
- s = s .removeprefix (self .prefix )
430
+ s = s .removeprefix (self .symbol_prefix )
413
431
value , symbol = _stencils .HoleValue .GOT , s
414
432
case {
415
433
"Addend" : addend ,
@@ -418,7 +436,7 @@ def _handle_relocation(
418
436
"Type" : {"Name" : kind },
419
437
}:
420
438
offset += base
421
- s = s .removeprefix (self .prefix )
439
+ s = s .removeprefix (self .symbol_prefix )
422
440
value , symbol = _stencils .symbol_to_value (s )
423
441
case _:
424
442
raise NotImplementedError (relocation )
@@ -428,17 +446,20 @@ def _handle_relocation(
428
446
class _MachO (
429
447
_Target [_schema .MachOSection , _schema .MachORelocation ]
430
448
): # pylint: disable = too-few-public-methods
449
+ label_prefix = "L"
450
+ symbol_prefix = "_"
451
+
431
452
def _handle_section (
432
453
self , section : _schema .MachOSection , group : _stencils .StencilGroup
433
454
) -> None :
434
455
assert section ["Address" ] >= len (group .code .body )
435
456
assert "SectionData" in section
436
457
flags = {flag ["Name" ] for flag in section ["Attributes" ]["Flags" ]}
437
458
name = section ["Name" ]["Value" ]
438
- name = name .removeprefix (self .prefix )
459
+ name = name .removeprefix (self .symbol_prefix )
439
460
if "Debug" in flags :
440
461
return
441
- if "SomeInstructions " in flags :
462
+ if "PureInstructions " in flags :
442
463
value = _stencils .HoleValue .CODE
443
464
stencil = group .code
444
465
start_address = 0
@@ -459,7 +480,7 @@ def _handle_section(
459
480
symbol = wrapped_symbol ["Symbol" ]
460
481
offset = symbol ["Value" ] - start_address
461
482
name = symbol ["Name" ]["Name" ]
462
- name = name .removeprefix (self .prefix )
483
+ name = name .removeprefix (self .symbol_prefix )
463
484
group .symbols [name ] = value , offset
464
485
assert "Relocations" in section
465
486
for wrapped_relocation in section ["Relocations" ]:
@@ -484,7 +505,7 @@ def _handle_relocation(
484
505
},
485
506
}:
486
507
offset += base
487
- s = s .removeprefix (self .prefix )
508
+ s = s .removeprefix (self .symbol_prefix )
488
509
value , symbol = _stencils .HoleValue .GOT , s
489
510
addend = 0
490
511
case {
@@ -493,7 +514,7 @@ def _handle_relocation(
493
514
"Type" : {"Name" : "X86_64_RELOC_GOT" | "X86_64_RELOC_GOT_LOAD" as kind },
494
515
}:
495
516
offset += base
496
- s = s .removeprefix (self .prefix )
517
+ s = s .removeprefix (self .symbol_prefix )
497
518
value , symbol = _stencils .HoleValue .GOT , s
498
519
addend = (
499
520
int .from_bytes (raw [offset : offset + 4 ], "little" , signed = True ) - 4
@@ -508,7 +529,7 @@ def _handle_relocation(
508
529
"Type" : {"Name" : "X86_64_RELOC_BRANCH" | "X86_64_RELOC_SIGNED" as kind },
509
530
}:
510
531
offset += base
511
- s = s .removeprefix (self .prefix )
532
+ s = s .removeprefix (self .symbol_prefix )
512
533
value , symbol = _stencils .symbol_to_value (s )
513
534
addend = (
514
535
int .from_bytes (raw [offset : offset + 4 ], "little" , signed = True ) - 4
@@ -523,27 +544,27 @@ def _handle_relocation(
523
544
"Type" : {"Name" : kind },
524
545
}:
525
546
offset += base
526
- s = s .removeprefix (self .prefix )
547
+ s = s .removeprefix (self .symbol_prefix )
527
548
value , symbol = _stencils .symbol_to_value (s )
528
549
addend = 0
529
550
case _:
530
551
raise NotImplementedError (relocation )
531
552
return _stencils .Hole (offset , kind , value , symbol , addend )
532
553
533
554
534
- def get_target (host : str ) -> _COFF | _ELF | _MachO :
555
+ def get_target (host : str ) -> _COFF32 | _COFF64 | _ELF | _MachO :
535
556
"""Build a _Target for the given host "triple" and options."""
536
557
optimizer : type [_optimizers .Optimizer ]
537
- target : _COFF | _ELF | _MachO
558
+ target : _COFF32 | _COFF64 | _ELF | _MachO
538
559
if re .fullmatch (r"aarch64-apple-darwin.*" , host ):
539
560
condition = "defined(__aarch64__) && defined(__APPLE__)"
540
561
optimizer = _optimizers .OptimizerAArch64
541
- target = _MachO (host , condition , optimizer = optimizer , prefix = "_" )
562
+ target = _MachO (host , condition , optimizer = optimizer )
542
563
elif re .fullmatch (r"aarch64-pc-windows-msvc" , host ):
543
564
args = ["-fms-runtime-lib=dll" , "-fplt" ]
544
565
condition = "defined(_M_ARM64)"
545
566
optimizer = _optimizers .OptimizerAArch64
546
- target = _COFF (host , condition , args = args , optimizer = optimizer )
567
+ target = _COFF64 (host , condition , args = args , optimizer = optimizer )
547
568
elif re .fullmatch (r"aarch64-.*-linux-gnu" , host ):
548
569
# -mno-outline-atomics: Keep intrinsics from being emitted.
549
570
args = ["-fpic" , "-mno-outline-atomics" ]
@@ -555,16 +576,16 @@ def get_target(host: str) -> _COFF | _ELF | _MachO:
555
576
args = ["-DPy_NO_ENABLE_SHARED" , "-Wno-ignored-attributes" ]
556
577
optimizer = _optimizers .OptimizerX86
557
578
condition = "defined(_M_IX86)"
558
- target = _COFF (host , condition , args = args , optimizer = optimizer , prefix = "_" )
579
+ target = _COFF32 (host , condition , args = args , optimizer = optimizer )
559
580
elif re .fullmatch (r"x86_64-apple-darwin.*" , host ):
560
581
condition = "defined(__x86_64__) && defined(__APPLE__)"
561
582
optimizer = _optimizers .OptimizerX86
562
- target = _MachO (host , condition , optimizer = optimizer , prefix = "_" )
583
+ target = _MachO (host , condition , optimizer = optimizer )
563
584
elif re .fullmatch (r"x86_64-pc-windows-msvc" , host ):
564
585
args = ["-fms-runtime-lib=dll" ]
565
586
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 )
568
589
elif re .fullmatch (r"x86_64-.*-linux-gnu" , host ):
569
590
args = ["-fno-pic" , "-mcmodel=medium" , "-mlarge-data-threshold=0" ]
570
591
condition = "defined(__x86_64__) && defined(__linux__)"
0 commit comments