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.
@@ -1,3 +1,3 @@
1
1
  """Version information for clang-tool-chain."""
2
2
 
3
- __version__ = "1.0.43"
3
+ __version__ = "1.0.44"
@@ -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 platform-specific linker flags:
213
- - macOS: -fuse-ld=ld64.lld (explicit Mach-O linker, LLVM 21.x+)
214
- - Linux: -fuse-ld=lld (standard ELF linker)
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") == "1":
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 -shared-libasan already present
325
- if "-shared-libasan" in args:
326
- return args
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
- # Add -shared-libasan to use shared runtime library
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):
@@ -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 flag is only recognized by LLVM 21.x and later.
39
- Earlier versions require -fuse-ld=lld (which auto-detects Mach-O from target).
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, False otherwise.
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 linker flags:
288
- - macOS: Uses -fuse-ld=ld64.lld (explicit Mach-O variant required by LLVM 21.x+)
289
- - Linux: Uses -fuse-ld=lld (standard ELF linker)
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 platform-specific -fuse-ld flag prepended if needed
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 user-specified -fuse-ld=ld64.lld
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
- # Check LLVM version to determine the correct linker flag
325
- if _llvm_supports_ld64_lld_flag():
326
- # LLVM 21.x+ supports explicit -fuse-ld=ld64.lld
327
- _ensure_ld64_lld_symlink()
328
- return ["-fuse-ld=ld64.lld"] + args
329
- else:
330
- # LLVM < 21.x: rewrite to -fuse-ld=lld with compatibility notice
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.43
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=6gmxA-SFNIuF2QL2LcQn3fYERY3gD95uxieCn2hdE7o,72
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=YkGqz_vbfNE-yFXHnzZREbS1T545AfQcV0DJTkU59YM,18254
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=J8XXtz0DaabnNFReSJCXgk37NloUvrIkjp5TzIZ7Tg8,12468
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.43.dist-info/METADATA,sha256=BEMrWFJ8AIyAAdlb5v0CfKWkfKr1I-BNYkzoNAv2H6w,50425
71
- clang_tool_chain-1.0.43.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
72
- clang_tool_chain-1.0.43.dist-info/entry_points.txt,sha256=DBfnqZJzHFoO6rldGY3ESaX-z2ydAvIueUPM9ss9M-w,2728
73
- clang_tool_chain-1.0.43.dist-info/licenses/LICENSE,sha256=51FO1oc2pZbQNI0v0_THnznnZIF4iFgawG1xnQ58kKo,10997
74
- clang_tool_chain-1.0.43.dist-info/RECORD,,
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,,