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

Currently, the config file system loads the full target triple, e.g.
`arm64-apple-darwin23.6.0.cfg`.

This is however not very useful as this is a moving target. In the case
of macOS, that target moves every ~2 months.

We can improve this by adding fallbacks that simplify the version
component of the triple. This pull request adds support for loading
`arm64-apple-darwin23.cfg` and `arm64-apple-darwin.cfg`. See the
included test for a demonstration on how it works.
This commit is contained in:
Bo Anderson
2024-12-12 12:04:57 +00:00
committed by GitHub
parent 2be41e7aee
commit 0cbdad4bd2
2 changed files with 62 additions and 14 deletions

View File

@@ -1165,6 +1165,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.
@@ -1176,7 +1204,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
@@ -1187,15 +1215,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:
@@ -1210,21 +1236,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;
@@ -1236,8 +1262,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,

View File

@@ -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:'
//
// 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