Consolidate default Clang argument handling (#6545)

This unifies the default Clang arguments between the `clang` subcommand,
the `link` subcommand, and the `ClangInvocation` built for C++ interop.

This sets the stage to integrate either pre-built or on-demand runtimes
flags for both of these. However, this PR should have very little
practical difference. The biggest functional change is wrapping the
default arguments in flags to allow unused flags so that we can build a
collection of flags viable across compile and link.
This commit is contained in:
Chandler Carruth
2026-01-03 17:35:29 +00:00
committed by GitHub
parent e545929386
commit e7eb3b7b5a
10 changed files with 131 additions and 85 deletions
-36
View File
@@ -38,36 +38,6 @@ The linked file name. The output is always a linked binary.
codegen_options.Build(b);
}
static void AddOSFlags(llvm::StringRef target,
llvm::SmallVectorImpl<llvm::StringRef>& args) {
llvm::Triple triple(target);
switch (triple.getOS()) {
case llvm::Triple::Darwin:
case llvm::Triple::MacOSX:
// On macOS we need to set the sysroot to a viable SDK. Currently, this
// hard codes the path to be the unversioned symlink. The prefix is also
// hard coded in Homebrew and so this seems likely to work reasonably
// well. Homebrew and I suspect the Xcode Clang both have this hard coded
// at build time, so this seems reasonably safe but we can revisit if/when
// needed.
args.push_back(
"--sysroot=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk");
// We also need to insist on a modern linker, otherwise the driver tries
// too old and deprecated flags. The specific number here comes from an
// inspection of the Clang driver source code to understand where features
// were enabled, and this appears to be the latest version to control
// driver behavior.
//
// TODO: We should replace this with use of `lld` eventually.
args.push_back("-mlinker-version=705");
break;
default:
// By default, just let the Clang driver handle everything.
break;
}
}
static constexpr CommandLine::CommandInfo SubcommandInfo = {
.name = "link",
.help = R"""(
@@ -99,9 +69,6 @@ auto LinkSubcommand::Run(DriverEnv& driver_env) -> DriverResult {
llvm::formatv("--target={0}", options_.codegen_options.target).str();
clang_args.push_back(target_arg);
// Use LLD, which we provide in our install directory, for linking.
clang_args.push_back("-fuse-ld=lld");
// Disable linking the C++ standard library until can build and ship it as
// part of the Carbon toolchain. This clearly won't work once we get into
// interop, but for now it avoids spurious failures and distraction. The plan
@@ -110,9 +77,6 @@ auto LinkSubcommand::Run(DriverEnv& driver_env) -> DriverResult {
// TODO: Replace this when ready.
clang_args.push_back("-nostdlib++");
// Add OS-specific flags based on the target.
AddOSFlags(options_.codegen_options.target, clang_args);
clang_args.push_back("-o");
clang_args.push_back(options_.output_filename);
clang_args.append(options_.object_filenames.begin(),