mirror of
https://github.com/intel/llvm.git
synced 2026-01-25 19:44:38 +08:00
[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:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user