clang-tool-chain 1.0.43__py3-none-any.whl → 1.0.44__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- clang_tool_chain/__version__.py +1 -1
- clang_tool_chain/execution/arg_transformers.py +43 -13
- clang_tool_chain/linker/lld.py +63 -26
- {clang_tool_chain-1.0.43.dist-info → clang_tool_chain-1.0.44.dist-info}/METADATA +1 -1
- {clang_tool_chain-1.0.43.dist-info → clang_tool_chain-1.0.44.dist-info}/RECORD +8 -8
- {clang_tool_chain-1.0.43.dist-info → clang_tool_chain-1.0.44.dist-info}/WHEEL +0 -0
- {clang_tool_chain-1.0.43.dist-info → clang_tool_chain-1.0.44.dist-info}/entry_points.txt +0 -0
- {clang_tool_chain-1.0.43.dist-info → clang_tool_chain-1.0.44.dist-info}/licenses/LICENSE +0 -0
clang_tool_chain/__version__.py
CHANGED
|
@@ -209,9 +209,10 @@ class LLDLinkerTransformer(ArgumentTransformer):
|
|
|
209
209
|
|
|
210
210
|
Priority: 200 (runs after SDK but before ABI)
|
|
211
211
|
|
|
212
|
-
This transformer adds
|
|
213
|
-
|
|
214
|
-
-
|
|
212
|
+
This transformer adds -fuse-ld=lld linker flag. The clang driver
|
|
213
|
+
automatically dispatches to the correct linker binary:
|
|
214
|
+
- macOS: ld64.lld (Mach-O linker)
|
|
215
|
+
- Linux: ld.lld (ELF linker)
|
|
215
216
|
|
|
216
217
|
It also translates GNU ld flags to ld64.lld equivalents on macOS:
|
|
217
218
|
- --no-undefined -> -undefined error
|
|
@@ -293,11 +294,16 @@ class ASANRuntimeTransformer(ArgumentTransformer):
|
|
|
293
294
|
This transformer ensures proper ASAN runtime linking on Linux:
|
|
294
295
|
- Detects -fsanitize=address flag
|
|
295
296
|
- Adds -shared-libasan to use shared runtime library
|
|
297
|
+
- Adds -Wl,--allow-shlib-undefined when building shared libraries with ASAN
|
|
296
298
|
- Prevents undefined symbol errors during linking
|
|
297
299
|
|
|
298
300
|
The shared runtime library (libclang_rt.asan.so) contains the full
|
|
299
301
|
ASAN implementation, while the static wrapper library only contains stubs.
|
|
300
302
|
|
|
303
|
+
When building shared libraries with sanitizers, the library may have undefined
|
|
304
|
+
symbols that will be provided by the sanitizer runtime when loaded. LLD by
|
|
305
|
+
default enforces no undefined symbols, so we need to allow them explicitly.
|
|
306
|
+
|
|
301
307
|
Environment Variables:
|
|
302
308
|
CLANG_TOOL_CHAIN_NO_SHARED_ASAN: Set to '1' to disable shared ASAN
|
|
303
309
|
"""
|
|
@@ -306,7 +312,9 @@ class ASANRuntimeTransformer(ArgumentTransformer):
|
|
|
306
312
|
return 250
|
|
307
313
|
|
|
308
314
|
def transform(self, args: list[str], context: ToolContext) -> list[str]:
|
|
309
|
-
"""Add -shared-libasan when using ASAN on Linux."""
|
|
315
|
+
"""Add -shared-libasan and --allow-shlib-undefined when using ASAN on Linux."""
|
|
316
|
+
import sys
|
|
317
|
+
|
|
310
318
|
# Only applies to Linux clang/clang++
|
|
311
319
|
if context.platform_name != "linux" or context.tool_name not in ("clang", "clang++"):
|
|
312
320
|
return args
|
|
@@ -316,19 +324,41 @@ class ASANRuntimeTransformer(ArgumentTransformer):
|
|
|
316
324
|
if not has_asan:
|
|
317
325
|
return args
|
|
318
326
|
|
|
327
|
+
result = list(args)
|
|
328
|
+
injected_flags = []
|
|
329
|
+
|
|
319
330
|
# Check if user disabled shared ASAN
|
|
320
|
-
if os.environ.get("CLANG_TOOL_CHAIN_NO_SHARED_ASAN")
|
|
331
|
+
if os.environ.get("CLANG_TOOL_CHAIN_NO_SHARED_ASAN") != "1":
|
|
332
|
+
# Check if -shared-libasan already present
|
|
333
|
+
if "-shared-libasan" not in args:
|
|
334
|
+
# Add -shared-libasan to use shared runtime library
|
|
335
|
+
# This prevents undefined symbol errors during linking
|
|
336
|
+
logger.info("Adding -shared-libasan for ASAN runtime linking on Linux")
|
|
337
|
+
result = ["-shared-libasan"] + result
|
|
338
|
+
injected_flags.append("-shared-libasan")
|
|
339
|
+
else:
|
|
321
340
|
logger.debug("Shared ASAN disabled via CLANG_TOOL_CHAIN_NO_SHARED_ASAN=1")
|
|
322
|
-
return args
|
|
323
341
|
|
|
324
|
-
# Check if
|
|
325
|
-
|
|
326
|
-
|
|
342
|
+
# Check if building a shared library with ASAN
|
|
343
|
+
# Shared libraries need to allow undefined symbols that will be provided
|
|
344
|
+
# by the sanitizer runtime when the runner loads them
|
|
345
|
+
is_shared_lib = "-shared" in args
|
|
346
|
+
if is_shared_lib:
|
|
347
|
+
# Check if --allow-shlib-undefined already present
|
|
348
|
+
has_allow_shlib_undefined = any("--allow-shlib-undefined" in arg for arg in args)
|
|
349
|
+
if not has_allow_shlib_undefined:
|
|
350
|
+
logger.info("Adding -Wl,--allow-shlib-undefined for shared library with ASAN")
|
|
351
|
+
result = ["-Wl,--allow-shlib-undefined"] + result
|
|
352
|
+
injected_flags.append("-Wl,--allow-shlib-undefined")
|
|
353
|
+
|
|
354
|
+
# Warn on stderr if we injected flags
|
|
355
|
+
if injected_flags:
|
|
356
|
+
print(
|
|
357
|
+
f"clang-tool-chain: note: automatically injected sanitizer flags: {' '.join(injected_flags)}",
|
|
358
|
+
file=sys.stderr,
|
|
359
|
+
)
|
|
327
360
|
|
|
328
|
-
|
|
329
|
-
# This prevents undefined symbol errors during linking
|
|
330
|
-
logger.info("Adding -shared-libasan for ASAN runtime linking on Linux")
|
|
331
|
-
return ["-shared-libasan"] + args
|
|
361
|
+
return result
|
|
332
362
|
|
|
333
363
|
|
|
334
364
|
class RPathTransformer(ArgumentTransformer):
|
clang_tool_chain/linker/lld.py
CHANGED
|
@@ -35,11 +35,12 @@ def _llvm_supports_ld64_lld_flag() -> bool:
|
|
|
35
35
|
"""
|
|
36
36
|
Check if the current platform's LLVM version supports -fuse-ld=ld64.lld.
|
|
37
37
|
|
|
38
|
-
The -fuse-ld=ld64.lld
|
|
39
|
-
|
|
38
|
+
Note: The clang driver does NOT recognize -fuse-ld=ld64.lld as a valid option.
|
|
39
|
+
This function exists for backward compatibility but always returns False in practice
|
|
40
|
+
because -fuse-ld=lld should be used instead (clang auto-dispatches to ld64.lld on Darwin).
|
|
40
41
|
|
|
41
42
|
Returns:
|
|
42
|
-
True if LLVM >= 21.x
|
|
43
|
+
True if LLVM >= 21.x (but we always fall back to -fuse-ld=lld anyway)
|
|
43
44
|
"""
|
|
44
45
|
from ..platform.detection import get_platform_info
|
|
45
46
|
|
|
@@ -272,6 +273,39 @@ def _user_specified_lld_on_macos(args: list[str]) -> bool:
|
|
|
272
273
|
return "-fuse-ld=lld" in args_str or "-fuse-ld=ld64.lld" in args_str
|
|
273
274
|
|
|
274
275
|
|
|
276
|
+
def _user_specified_ld64_lld(args: list[str]) -> bool:
|
|
277
|
+
"""
|
|
278
|
+
Check if the user explicitly specified -fuse-ld=ld64.lld.
|
|
279
|
+
|
|
280
|
+
This is used to emit a warning that the flag will be auto-converted
|
|
281
|
+
to -fuse-ld=lld since clang driver doesn't recognize ld64.lld.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
args: Command-line arguments
|
|
285
|
+
|
|
286
|
+
Returns:
|
|
287
|
+
True if user specified -fuse-ld=ld64.lld
|
|
288
|
+
"""
|
|
289
|
+
return any("-fuse-ld=ld64.lld" in arg for arg in args)
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
def _convert_ld64_lld_to_lld(args: list[str]) -> list[str]:
|
|
293
|
+
"""
|
|
294
|
+
Convert -fuse-ld=ld64.lld to -fuse-ld=lld in arguments.
|
|
295
|
+
|
|
296
|
+
The clang driver does not recognize -fuse-ld=ld64.lld as a valid option.
|
|
297
|
+
This function converts it to -fuse-ld=lld which the driver recognizes
|
|
298
|
+
and automatically dispatches to ld64.lld on Darwin targets.
|
|
299
|
+
|
|
300
|
+
Args:
|
|
301
|
+
args: Original compiler arguments
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
Modified arguments with -fuse-ld=ld64.lld replaced by -fuse-ld=lld
|
|
305
|
+
"""
|
|
306
|
+
return [arg.replace("-fuse-ld=ld64.lld", "-fuse-ld=lld") for arg in args]
|
|
307
|
+
|
|
308
|
+
|
|
275
309
|
# pyright: reportUnusedFunction=false
|
|
276
310
|
def _add_lld_linker_if_needed(platform_name: str, args: list[str]) -> list[str]:
|
|
277
311
|
"""
|
|
@@ -284,9 +318,10 @@ def _add_lld_linker_if_needed(platform_name: str, args: list[str]) -> list[str]:
|
|
|
284
318
|
- Faster linking performance
|
|
285
319
|
- Uniform toolchain across all platforms
|
|
286
320
|
|
|
287
|
-
Platform-specific
|
|
288
|
-
-
|
|
289
|
-
-
|
|
321
|
+
Platform-specific behavior:
|
|
322
|
+
- Uses -fuse-ld=lld on all platforms (clang driver auto-dispatches)
|
|
323
|
+
- macOS: Clang driver finds ld64.lld (Mach-O linker)
|
|
324
|
+
- Linux: Clang driver finds ld.lld (ELF linker)
|
|
290
325
|
|
|
291
326
|
The function is skipped when:
|
|
292
327
|
- User sets CLANG_TOOL_CHAIN_USE_SYSTEM_LD=1
|
|
@@ -302,14 +337,25 @@ def _add_lld_linker_if_needed(platform_name: str, args: list[str]) -> list[str]:
|
|
|
302
337
|
args: Original compiler arguments
|
|
303
338
|
|
|
304
339
|
Returns:
|
|
305
|
-
Modified arguments with
|
|
340
|
+
Modified arguments with -fuse-ld=lld flag prepended if needed
|
|
306
341
|
"""
|
|
307
342
|
# On macOS, if user explicitly specified LLD, we still need to translate flags
|
|
308
343
|
# and ensure ld64.lld symlink exists, even though we don't inject the -fuse-ld flag ourselves
|
|
309
344
|
if platform_name == "darwin" and _user_specified_lld_on_macos(args):
|
|
310
345
|
logger.debug("User specified LLD on macOS, translating GNU ld flags to ld64.lld equivalents")
|
|
311
|
-
# Ensure ld64.lld symlink exists for
|
|
346
|
+
# Ensure ld64.lld symlink exists for lld to dispatch to Mach-O mode
|
|
312
347
|
_ensure_ld64_lld_symlink()
|
|
348
|
+
|
|
349
|
+
# Check if user specified -fuse-ld=ld64.lld (which is not a valid clang driver option)
|
|
350
|
+
# and emit a warning about the auto-conversion to -fuse-ld=lld
|
|
351
|
+
if _user_specified_ld64_lld(args):
|
|
352
|
+
print(
|
|
353
|
+
"[clang-tool-chain] Warning: -fuse-ld=ld64.lld is not a valid clang driver option. "
|
|
354
|
+
"Auto-converting to -fuse-ld=lld (clang driver auto-dispatches to ld64.lld on Darwin).",
|
|
355
|
+
file=sys.stderr,
|
|
356
|
+
)
|
|
357
|
+
args = _convert_ld64_lld_to_lld(args)
|
|
358
|
+
|
|
313
359
|
return _translate_linker_flags_for_macos_lld(args)
|
|
314
360
|
|
|
315
361
|
if not _should_force_lld(platform_name, args):
|
|
@@ -320,22 +366,13 @@ def _add_lld_linker_if_needed(platform_name: str, args: list[str]) -> list[str]:
|
|
|
320
366
|
# On macOS, translate GNU ld flags to ld64.lld equivalents
|
|
321
367
|
if platform_name == "darwin":
|
|
322
368
|
args = _translate_linker_flags_for_macos_lld(args)
|
|
369
|
+
# Ensure ld64.lld symlink exists for lld to dispatch to Mach-O mode
|
|
370
|
+
_ensure_ld64_lld_symlink()
|
|
323
371
|
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
version = _get_llvm_version_for_platform()
|
|
332
|
-
version_str = f"{version[0]}.{version[1]}.{version[2]}"
|
|
333
|
-
print(
|
|
334
|
-
f"[clang-tool-chain] LLVM {version_str} does not support -fuse-ld=ld64.lld, "
|
|
335
|
-
f"using -fuse-ld=lld instead (lld auto-detects Mach-O from target)",
|
|
336
|
-
file=sys.stderr,
|
|
337
|
-
)
|
|
338
|
-
return ["-fuse-ld=lld"] + args
|
|
339
|
-
else:
|
|
340
|
-
# Linux uses standard lld
|
|
341
|
-
return ["-fuse-ld=lld"] + args
|
|
372
|
+
# Always use -fuse-ld=lld on all platforms.
|
|
373
|
+
# Note: -fuse-ld=ld64.lld is NOT a valid clang driver option.
|
|
374
|
+
# The clang driver only recognizes generic names like "lld", "gold", "bfd".
|
|
375
|
+
# When -fuse-ld=lld is used, clang automatically dispatches to:
|
|
376
|
+
# - Darwin: ld64.lld (Mach-O linker)
|
|
377
|
+
# - Linux: ld.lld (ELF linker)
|
|
378
|
+
return ["-fuse-ld=lld"] + args
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clang-tool-chain
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.44
|
|
4
4
|
Summary: Clang Tool Chain - C/C++ compilation toolchain utilities
|
|
5
5
|
Project-URL: Homepage, https://github.com/zackees/clang-tool-chain
|
|
6
6
|
Project-URL: Repository, https://github.com/zackees/clang-tool-chain
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
clang_tool_chain/__init__.py,sha256=w3f1hdA72SH-WsfwesNTQbTeiXIlhV8ignySXrV3SfU,23
|
|
2
|
-
clang_tool_chain/__version__.py,sha256=
|
|
2
|
+
clang_tool_chain/__version__.py,sha256=VyBCcvXR6mMibUFhauoR0iyFq2jth9ReImF-qE_frUY,72
|
|
3
3
|
clang_tool_chain/archive.py,sha256=t3reh7cm5XP2rhTqfRIDAQZv5XQq7SsstyiROYg8wFA,27697
|
|
4
4
|
clang_tool_chain/archive_cache.py,sha256=5ZmlwXIJZDcrDFkTbdgBQYN9sulGn0WyI6qwWqC4HEU,6806
|
|
5
5
|
clang_tool_chain/checksums.py,sha256=KFXeAeDz5ZlcZVOxsHDpNDCrm9UDoJ8bMA4PeNhuzdA,9868
|
|
@@ -37,7 +37,7 @@ clang_tool_chain/deployment/so_deployer.py,sha256=9mRKcJUXKV-8vXWJGdsUkB5cTPWjmT
|
|
|
37
37
|
clang_tool_chain/directives/__init__.py,sha256=MJDNYL_MD2MF0HFsrTsSTX645bYo6vtjq2pOTtfykaU,198
|
|
38
38
|
clang_tool_chain/directives/parser.py,sha256=6J7mO1JtvuHkkKS0Xges5b_jT9b3uTF6ULI0ZiwGAdw,11179
|
|
39
39
|
clang_tool_chain/execution/__init__.py,sha256=wSYnlGmfTlaUPEKwW6PgwlxKTti6Wa5yyVjXVipdpcY,875
|
|
40
|
-
clang_tool_chain/execution/arg_transformers.py,sha256=
|
|
40
|
+
clang_tool_chain/execution/arg_transformers.py,sha256=vN-1T1mfD61Mg-P2B6hOQeLdD1RZA3l1pmNBbJSzo-g,19750
|
|
41
41
|
clang_tool_chain/execution/build.py,sha256=PCtHw31WXbjCp2K_qaf1liaCiIjD49036cknqdQyhJM,13040
|
|
42
42
|
clang_tool_chain/execution/build_pipeline.py,sha256=piqh7P2-GR0mVOik3OUGRFqWFIRr8LQM3PU7TcBsujk,17622
|
|
43
43
|
clang_tool_chain/execution/core.py,sha256=7CJ0azznC5lq5bw8amk2kwCIN2I_OnDiKytpapkvrdY,25273
|
|
@@ -57,7 +57,7 @@ clang_tool_chain/installers/iwyu.py,sha256=9aAhdGtOTY6BrLuPtladY8Y2mz1i7FjgbMxZf
|
|
|
57
57
|
clang_tool_chain/installers/lldb.py,sha256=FpG8NMNQk8PoNfg6aeU_plmSQrVET7zo-pTvoK8z838,2261
|
|
58
58
|
clang_tool_chain/installers/nodejs.py,sha256=5N07rotgmCfUaDm1uJfBlIAFKC1iTpgZT0HBRuoYwKI,9343
|
|
59
59
|
clang_tool_chain/linker/__init__.py,sha256=ghzDFpZ2-gPmdDO6K05C7yNbY6pZLANPuUks9TaQwVY,537
|
|
60
|
-
clang_tool_chain/linker/lld.py,sha256=
|
|
60
|
+
clang_tool_chain/linker/lld.py,sha256=08qkvoK4-8yACm34GfZzp3vM8rZYHCv_M9fjUeSetd0,13826
|
|
61
61
|
clang_tool_chain/platform/__init__.py,sha256=WkV9Y25ua0mtzEGcsIxF-qExtroSTAMKkcElWuQF2BE,342
|
|
62
62
|
clang_tool_chain/platform/detection.py,sha256=PLHyUfmQ5xuohhpz0KSXJWK3d0u0fCsjx1DbM8f1CxQ,5470
|
|
63
63
|
clang_tool_chain/platform/paths.py,sha256=K0IjeVwbmgPlAWQO8mS3r1WS4C2dN6IYrSqPpckeT5c,6088
|
|
@@ -67,8 +67,8 @@ clang_tool_chain/sdk/windows.py,sha256=8zMLAoFz2OKMz-w6Kqxr3A-6Cofto2VWZvCvRi7kn
|
|
|
67
67
|
clang_tool_chain/testing/__init__.py,sha256=-sYqOOCuTV_u-MkmExrD4uKdTHG4RmMwR3D1kIG281Q,208
|
|
68
68
|
clang_tool_chain/testing/diagnostic_runner.py,sha256=mnmFUEOQulY3-Ggu6hKVGZwjrKQNmV6kY80PRTUu2qU,5293
|
|
69
69
|
clang_tool_chain/testing/diagnostic_tests.py,sha256=GmtKWrDcddZTpx9_yIKfhRAy6YOde8dj7SksCWVEME4,6019
|
|
70
|
-
clang_tool_chain-1.0.
|
|
71
|
-
clang_tool_chain-1.0.
|
|
72
|
-
clang_tool_chain-1.0.
|
|
73
|
-
clang_tool_chain-1.0.
|
|
74
|
-
clang_tool_chain-1.0.
|
|
70
|
+
clang_tool_chain-1.0.44.dist-info/METADATA,sha256=SjvdkUZlqBEHGRSpfaWoAys6sGSSOkH3_b9BdvKFOd0,50425
|
|
71
|
+
clang_tool_chain-1.0.44.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
72
|
+
clang_tool_chain-1.0.44.dist-info/entry_points.txt,sha256=DBfnqZJzHFoO6rldGY3ESaX-z2ydAvIueUPM9ss9M-w,2728
|
|
73
|
+
clang_tool_chain-1.0.44.dist-info/licenses/LICENSE,sha256=51FO1oc2pZbQNI0v0_THnznnZIF4iFgawG1xnQ58kKo,10997
|
|
74
|
+
clang_tool_chain-1.0.44.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|