[clang-tools-extra] Support target names with dots in more utilities (PR #65812)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 13 13:54:49 PDT 2023
https://github.com/dankm updated https://github.com/llvm/llvm-project/pull/65812:
>From a42cbcc0731725929c60ba4c1fd5254ae5e46613 Mon Sep 17 00:00:00 2001
From: Dan McGregor <dan.mcgregor at usask.ca>
Date: Mon, 14 Aug 2023 18:44:08 -0600
Subject: [PATCH] Support: hoist lld's executable name code to Path
Instead of using custom code to find the program name throughout
the codebase, write one function as a path helper to consistently
determine the program name. This globally correctly finds target
names with dots in them (ie freebsd13.2).
---
lld/COFF/Driver.cpp | 2 +-
lld/Common/Args.cpp | 6 ------
lld/ELF/Driver.cpp | 2 +-
lld/MachO/Driver.cpp | 2 +-
lld/include/lld/Common/Args.h | 2 --
lld/wasm/Driver.cpp | 2 +-
llvm/include/llvm/Support/Path.h | 15 +++++++++++++++
llvm/lib/Support/Path.cpp | 8 ++++++++
llvm/tools/llvm-ar/llvm-ar.cpp | 3 ++-
llvm/tools/llvm-cov/llvm-cov.cpp | 2 +-
llvm/tools/llvm-driver/llvm-driver.cpp | 2 +-
llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 2 +-
llvm/tools/llvm-objdump/llvm-objdump.cpp | 2 +-
llvm/tools/llvm-rc/llvm-rc.cpp | 2 +-
llvm/tools/llvm-readobj/llvm-readobj.cpp | 2 +-
llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | 2 +-
16 files changed, 36 insertions(+), 20 deletions(-)
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index d7476e91e03e384..03a63bf3a306b4d 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -68,7 +68,7 @@ bool link(ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS,
auto *ctx = new COFFLinkerContext;
ctx->e.initialize(stdoutOS, stderrOS, exitEarly, disableOutput);
- ctx->e.logName = args::getFilenameWithoutExe(args[0]);
+ ctx->e.logName = sys::path::program_name(args[0]);
ctx->e.errorLimitExceededMsg = "too many errors emitted, stopping now"
" (use /errorlimit:0 to see all errors)";
diff --git a/lld/Common/Args.cpp b/lld/Common/Args.cpp
index 48c934df3a2c931..b02d023fe19aeb5 100644
--- a/lld/Common/Args.cpp
+++ b/lld/Common/Args.cpp
@@ -85,9 +85,3 @@ std::vector<StringRef> lld::args::getLines(MemoryBufferRef mb) {
}
return ret;
}
-
-StringRef lld::args::getFilenameWithoutExe(StringRef path) {
- if (path.ends_with_insensitive(".exe"))
- return sys::path::stem(path);
- return sys::path::filename(path);
-}
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 9219314111610d1..0eef7bbf1baa213 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -143,7 +143,7 @@ bool link(ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS,
SharedFile::vernauxNum = 0;
};
- ctx->e.logName = args::getFilenameWithoutExe(args[0]);
+ ctx->e.logName = sys::path::program_name(args[0]);
ctx->e.errorLimitExceededMsg = "too many errors emitted, stopping now (use "
"--error-limit=0 to see all errors)";
diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp
index 00ff3439a043be9..ed0b66d4b2ec6ba 100644
--- a/lld/MachO/Driver.cpp
+++ b/lld/MachO/Driver.cpp
@@ -1428,7 +1428,7 @@ bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
InputFile::resetIdCount();
};
- ctx->e.logName = args::getFilenameWithoutExe(argsArr[0]);
+ ctx->e.logName = sys::path::program_name(argsArr[0]);
MachOOptTable parser;
InputArgList args = parser.parse(argsArr.slice(1));
diff --git a/lld/include/lld/Common/Args.h b/lld/include/lld/Common/Args.h
index 60f83fbbbf1a3c9..8822707a6a1f212 100644
--- a/lld/include/lld/Common/Args.h
+++ b/lld/include/lld/Common/Args.h
@@ -38,8 +38,6 @@ uint64_t getZOptionValue(llvm::opt::InputArgList &args, int id, StringRef key,
std::vector<StringRef> getLines(MemoryBufferRef mb);
-StringRef getFilenameWithoutExe(StringRef path);
-
} // namespace args
} // namespace lld
diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index c2f5f0185781f36..f13aa520f35b100 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -89,7 +89,7 @@ bool link(ArrayRef<const char *> args, llvm::raw_ostream &stdoutOS,
auto *ctx = new CommonLinkerContext;
ctx->e.initialize(stdoutOS, stderrOS, exitEarly, disableOutput);
- ctx->e.logName = args::getFilenameWithoutExe(args[0]);
+ ctx->e.logName = sys::path::program_name(args[0]);
ctx->e.errorLimitExceededMsg = "too many errors emitted, stopping now (use "
"-error-limit=0 to see all errors)";
diff --git a/llvm/include/llvm/Support/Path.h b/llvm/include/llvm/Support/Path.h
index ce69f32b6cc81ba..405fdc03e020851 100644
--- a/llvm/include/llvm/Support/Path.h
+++ b/llvm/include/llvm/Support/Path.h
@@ -390,6 +390,21 @@ StringRef stem(StringRef path, Style style = Style::native);
/// @result The extension of \a path.
StringRef extension(StringRef path, Style style = Style::native);
+/// Get the program's name
+///
+/// If the path ends with the string .exe, returns the stem of
+/// \a path. Otherwise returns the filename of \a path.
+///
+/// @code
+/// /foo/prog.exe => prog
+/// /bar/prog => prog
+/// /foo/prog1.2 => prog1.2
+/// @endcode
+///
+/// @param path Input path.
+/// @result The filename of \a path. Without any .exe component
+StringRef program_name(StringRef path, Style style = Style::native);
+
/// Check whether the given char is a path separator on the host OS.
///
/// @param value a character
diff --git a/llvm/lib/Support/Path.cpp b/llvm/lib/Support/Path.cpp
index 7a57c104ef10e7b..5940c99f203c771 100644
--- a/llvm/lib/Support/Path.cpp
+++ b/llvm/lib/Support/Path.cpp
@@ -600,6 +600,14 @@ StringRef extension(StringRef path, Style style) {
return fname.substr(pos);
}
+StringRef program_name(StringRef path, Style style) {
+ // In the future this may need to be extended to other
+ // program suffixes.
+ if (path.ends_with_insensitive(".exe"))
+ return stem(path, style);
+ return filename(path, style);
+}
+
bool is_separator(char value, Style style) {
if (value == '/')
return true;
diff --git a/llvm/tools/llvm-ar/llvm-ar.cpp b/llvm/tools/llvm-ar/llvm-ar.cpp
index 9889ad9de627d51..68b79cb007d1e98 100644
--- a/llvm/tools/llvm-ar/llvm-ar.cpp
+++ b/llvm/tools/llvm-ar/llvm-ar.cpp
@@ -1508,7 +1508,8 @@ int llvm_ar_main(int argc, char **argv, const llvm::ToolContext &) {
llvm::InitializeAllTargetMCs();
llvm::InitializeAllAsmParsers();
- Stem = sys::path::stem(ToolName);
+ Stem = sys::path::program_name(ToolName);
+
auto Is = [](StringRef Tool) {
// We need to recognize the following filenames.
//
diff --git a/llvm/tools/llvm-cov/llvm-cov.cpp b/llvm/tools/llvm-cov/llvm-cov.cpp
index 5ada55789b24677..e0b9e75f57c441f 100644
--- a/llvm/tools/llvm-cov/llvm-cov.cpp
+++ b/llvm/tools/llvm-cov/llvm-cov.cpp
@@ -59,7 +59,7 @@ int main(int argc, const char **argv) {
InitLLVM X(argc, argv);
// If argv[0] is or ends with 'gcov', always be gcov compatible
- if (sys::path::stem(argv[0]).ends_with_insensitive("gcov"))
+ if (sys::path::program_name(argv[0]).ends_with_insensitive("gcov"))
return gcovMain(argc, argv);
// Check if we are invoking a specific tool command.
diff --git a/llvm/tools/llvm-driver/llvm-driver.cpp b/llvm/tools/llvm-driver/llvm-driver.cpp
index a0f1ca831d93b6a..ffb3bc0f3a6fdc3 100644
--- a/llvm/tools/llvm-driver/llvm-driver.cpp
+++ b/llvm/tools/llvm-driver/llvm-driver.cpp
@@ -48,7 +48,7 @@ static int findTool(int Argc, char **Argv, const char *Argv0) {
return 0;
}
- StringRef Stem = sys::path::stem(ToolName);
+ StringRef Stem = sys::path::program_name(ToolName);
auto Is = [=](StringRef Tool) {
auto IsImpl = [=](StringRef Stem) {
auto I = Stem.rfind_insensitive(Tool);
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 2afa97601f5cfd8..9c51958198cb109 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -74,7 +74,7 @@ static ErrorSuccess reportWarning(Error E) {
}
static Expected<DriverConfig> getDriverConfig(ArrayRef<const char *> Args) {
- StringRef Stem = sys::path::stem(ToolName);
+ StringRef Stem = sys::path::program_name(ToolName);
auto Is = [=](StringRef Tool) {
// We need to recognize the following filenames:
//
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index e4e1ceb9b3f97f6..f6a8417afd72c26 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -3297,7 +3297,7 @@ int llvm_objdump_main(int argc, char **argv, const llvm::ToolContext &) {
std::unique_ptr<CommonOptTable> T;
OptSpecifier Unknown, HelpFlag, HelpHiddenFlag, VersionFlag;
- StringRef Stem = sys::path::stem(ToolName);
+ StringRef Stem = sys::path::program_name(ToolName);
auto Is = [=](StringRef Tool) {
// We need to recognize the following filenames:
//
diff --git a/llvm/tools/llvm-rc/llvm-rc.cpp b/llvm/tools/llvm-rc/llvm-rc.cpp
index b955347f2a8646e..2f93a4931f55a6e 100644
--- a/llvm/tools/llvm-rc/llvm-rc.cpp
+++ b/llvm/tools/llvm-rc/llvm-rc.cpp
@@ -276,7 +276,7 @@ void preprocess(StringRef Src, StringRef Dst, const RcOptions &Opts,
}
static std::pair<bool, std::string> isWindres(llvm::StringRef Argv0) {
- StringRef ProgName = llvm::sys::path::stem(Argv0);
+ StringRef ProgName = sys::path::program_name(Argv0);
// x86_64-w64-mingw32-windres -> x86_64-w64-mingw32, windres
// llvm-rc -> "", llvm-rc
// aarch64-w64-mingw32-llvm-windres-10.exe -> aarch64-w64-mingw32, llvm-windres
diff --git a/llvm/tools/llvm-readobj/llvm-readobj.cpp b/llvm/tools/llvm-readobj/llvm-readobj.cpp
index ca633ceff90800e..2735d31202c6e70 100644
--- a/llvm/tools/llvm-readobj/llvm-readobj.cpp
+++ b/llvm/tools/llvm-readobj/llvm-readobj.cpp
@@ -657,7 +657,7 @@ int llvm_readobj_main(int argc, char **argv, const llvm::ToolContext &) {
return 0;
}
- if (sys::path::stem(argv[0]).contains("readelf"))
+ if (sys::path::filename(argv[0]).contains("readelf"))
opts::Output = opts::GNU;
parseOptions(Args);
diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
index 78a0e6772f3fb36..e06a4a0b8fa4827 100644
--- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -432,7 +432,7 @@ int llvm_symbolizer_main(int argc, char **argv, const llvm::ToolContext &) {
sys::InitializeCOMRAII COM(sys::COMThreadingMode::MultiThreaded);
ToolName = argv[0];
- bool IsAddr2Line = sys::path::stem(ToolName).contains("addr2line");
+ bool IsAddr2Line = sys::path::filename(ToolName).contains("addr2line");
BumpPtrAllocator A;
StringSaver Saver(A);
SymbolizerOptTable Tbl;
More information about the cfe-commits
mailing list