Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[clang][Driver] Support simplified triple versions for config files #111387

Merged
merged 1 commit into from
Dec 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 39 additions & 14 deletions clang/lib/Driver/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1147,6 +1147,34 @@ bool Driver::loadConfigFiles() {
return false;
}

static bool findTripleConfigFile(llvm::cl::ExpansionContext &ExpCtx,
SmallString<128> &ConfigFilePath,
llvm::Triple Triple, std::string Suffix) {
// First, try the full unmodified triple.
if (ExpCtx.findConfigFile(Triple.str() + Suffix, ConfigFilePath))
return true;

// Don't continue if we didn't find a parsable version in the triple.
VersionTuple OSVersion = Triple.getOSVersion();
if (!OSVersion.getMinor().has_value())
return false;

std::string BaseOSName = Triple.getOSTypeName(Triple.getOS()).str();

// Next try strip the version to only include the major component.
// e.g. arm64-apple-darwin23.6.0 -> arm64-apple-darwin23
if (OSVersion.getMajor() != 0) {
Triple.setOSName(BaseOSName + llvm::utostr(OSVersion.getMajor()));
if (ExpCtx.findConfigFile(Triple.str() + Suffix, ConfigFilePath))
return true;
}

// Finally, try without any version suffix at all.
// e.g. arm64-apple-darwin23.6.0 -> arm64-apple-darwin
Triple.setOSName(BaseOSName);
return ExpCtx.findConfigFile(Triple.str() + Suffix, ConfigFilePath);
}

bool Driver::loadDefaultConfigFiles(llvm::cl::ExpansionContext &ExpCtx) {
// Disable default config if CLANG_NO_DEFAULT_CONFIG is set to a non-empty
// value.
Expand All @@ -1158,7 +1186,7 @@ bool Driver::loadDefaultConfigFiles(llvm::cl::ExpansionContext &ExpCtx) {
return false;

std::string RealMode = getExecutableForDriverMode(Mode);
std::string Triple;
llvm::Triple Triple;

// If name prefix is present, no --target= override was passed via CLOptions
// and the name prefix is not a valid triple, force it for backwards
Expand All @@ -1169,15 +1197,13 @@ bool Driver::loadDefaultConfigFiles(llvm::cl::ExpansionContext &ExpCtx) {
llvm::Triple PrefixTriple{ClangNameParts.TargetPrefix};
if (PrefixTriple.getArch() == llvm::Triple::UnknownArch ||
PrefixTriple.isOSUnknown())
Triple = PrefixTriple.str();
Triple = PrefixTriple;
}

// Otherwise, use the real triple as used by the driver.
if (Triple.empty()) {
llvm::Triple RealTriple =
computeTargetTriple(*this, TargetTriple, *CLOptions);
Triple = RealTriple.str();
assert(!Triple.empty());
if (Triple.str().empty()) {
Triple = computeTargetTriple(*this, TargetTriple, *CLOptions);
assert(!Triple.str().empty());
}

// Search for config files in the following order:
Expand All @@ -1192,21 +1218,21 @@ bool Driver::loadDefaultConfigFiles(llvm::cl::ExpansionContext &ExpCtx) {

// Try loading <triple>-<mode>.cfg, and return if we find a match.
SmallString<128> CfgFilePath;
std::string CfgFileName = Triple + '-' + RealMode + ".cfg";
if (ExpCtx.findConfigFile(CfgFileName, CfgFilePath))
if (findTripleConfigFile(ExpCtx, CfgFilePath, Triple,
"-" + RealMode + ".cfg"))
return readConfigFile(CfgFilePath, ExpCtx);

bool TryModeSuffix = !ClangNameParts.ModeSuffix.empty() &&
ClangNameParts.ModeSuffix != RealMode;
if (TryModeSuffix) {
CfgFileName = Triple + '-' + ClangNameParts.ModeSuffix + ".cfg";
if (ExpCtx.findConfigFile(CfgFileName, CfgFilePath))
if (findTripleConfigFile(ExpCtx, CfgFilePath, Triple,
"-" + ClangNameParts.ModeSuffix + ".cfg"))
return readConfigFile(CfgFilePath, ExpCtx);
}

// Try loading <mode>.cfg, and return if loading failed. If a matching file
// was not found, still proceed on to try <triple>.cfg.
CfgFileName = RealMode + ".cfg";
std::string CfgFileName = RealMode + ".cfg";
if (ExpCtx.findConfigFile(CfgFileName, CfgFilePath)) {
if (readConfigFile(CfgFilePath, ExpCtx))
return true;
Expand All @@ -1218,8 +1244,7 @@ bool Driver::loadDefaultConfigFiles(llvm::cl::ExpansionContext &ExpCtx) {
}

// Try loading <triple>.cfg and return if we find a match.
CfgFileName = Triple + ".cfg";
if (ExpCtx.findConfigFile(CfgFileName, CfgFilePath))
if (findTripleConfigFile(ExpCtx, CfgFilePath, Triple, ".cfg"))
return readConfigFile(CfgFilePath, ExpCtx);

// If we were unable to find a config file deduced from executable name,
Expand Down
23 changes: 23 additions & 0 deletions clang/test/Driver/config-file3.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,3 +226,26 @@
//
// RUN: HOME=%S/Inputs/config %clang -### --config-user-dir=~ -v 2>&1 | FileCheck %s --check-prefix=CHECK-TILDE
// CHECK-TILDE: User configuration file directory: {{.*}}/Inputs/config

//--- Fallback to stripping OS versions
//
// RUN: touch %t/testdmode/x86_64-apple-darwin23.6.0-clang.cfg
// RUN: touch %t/testdmode/x86_64-apple-darwin23-clang.cfg
// RUN: touch %t/testdmode/x86_64-apple-darwin-clang.cfg
// RUN: %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN --implicit-check-not 'Configuration file:'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prefer --target=. -target has been deprecated for a long time.

No need to have ^//$ lines.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It actually spells -target for Darwin.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to have ^//$ lines.

The whole file already has it, so this is just matching the style. Is the preferred approach to match the file's style or to use the newer style for new tests (and maybe go back an update old tests in a cleanup PR at some point)?

//
// DARWIN: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin23.6.0-clang.cfg

//--- DARWIN + no full version
//
// RUN: rm %t/testdmode/x86_64-apple-darwin23.6.0-clang.cfg
// RUN: %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN-MAJOR --implicit-check-not 'Configuration file:'
//
// DARWIN-MAJOR: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin23-clang.cfg

//--- DARWIN + no version
//
// RUN: rm %t/testdmode/x86_64-apple-darwin23-clang.cfg
// RUN: %clang -target x86_64-apple-darwin23.6.0 --config-system-dir=%t/testdmode --config-user-dir= -no-canonical-prefixes --version 2>&1 | FileCheck %s -check-prefix DARWIN-VERSIONLESS --implicit-check-not 'Configuration file:'
//
// DARWIN-VERSIONLESS: Configuration file: {{.*}}/testdmode/x86_64-apple-darwin-clang.cfg
Loading