[clang] [clang][Driver] Support simplified triple versions for config files (PR #111387)
Bo Anderson via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 7 07:50:51 PDT 2024
https://github.com/Bo98 created https://github.com/llvm/llvm-project/pull/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.
>From 88dd0d33147a7f46a3c9df4aed28ad4e47ef597c Mon Sep 17 00:00:00 2001
From: Bo Anderson <mail at boanderson.me>
Date: Mon, 7 Oct 2024 15:44:23 +0100
Subject: [PATCH] [clang][Driver] Support simplified triple versions for config
files
---
clang/lib/Driver/Driver.cpp | 53 +++++++++++++++++++++++---------
clang/test/Driver/config-file3.c | 23 ++++++++++++++
2 files changed, 62 insertions(+), 14 deletions(-)
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index a5d43bdac23735..26aa7f67842ce9 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -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.
@@ -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
@@ -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:
@@ -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;
@@ -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,
diff --git a/clang/test/Driver/config-file3.c b/clang/test/Driver/config-file3.c
index a0b8062c60ce52..395c31ce04b6b8 100644
--- a/clang/test/Driver/config-file3.c
+++ b/clang/test/Driver/config-file3.c
@@ -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
More information about the cfe-commits
mailing list