dankm created this revision. Herald added subscribers: pengfei, krytarowski, arichardson, emaste. Herald added a project: All. dankm added reviewers: echristo, zarko. dankm added a comment. dankm published this revision for review. Herald added subscribers: cfe-commits, MaskRay. Herald added a project: clang.
I'd like comments on this approach to handle target names with a . in them. My assumption is that the way it was done (by finding the filename stem) was to strip any ".exe" string on Windows, but there may be other reasons. The gcc compatible driver has support for selecting an alternative target based on the driver's executable name, for instance x86_64-unknown-linux-gnu-clang will set the target to linux on x86_64. Previously, this failed when the target contains a minor version, for example x86_64-unknown-freebsd13.1, so instead of finding the file's stem, use the whole file name, but strip off any '.exe' from the tail. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D135284 Files: clang/lib/Driver/ToolChain.cpp Index: clang/lib/Driver/ToolChain.cpp =================================================================== --- clang/lib/Driver/ToolChain.cpp +++ clang/lib/Driver/ToolChain.cpp @@ -198,7 +198,7 @@ /// Normalize the program name from argv[0] by stripping the file extension if /// present and lower-casing the string on Windows. static std::string normalizeProgramName(llvm::StringRef Argv0) { - std::string ProgName = std::string(llvm::sys::path::stem(Argv0)); + std::string ProgName = std::string(llvm::sys::path::filename(Argv0)); if (is_style_windows(llvm::sys::path::Style::native)) { // Transform to lowercase for case insensitive file systems. std::transform(ProgName.begin(), ProgName.end(), ProgName.begin(), @@ -217,6 +217,13 @@ // added via -target as implicit first argument. const DriverSuffix *DS = FindDriverSuffix(ProgName, Pos); + if (!DS && ProgName.endswith(".exe")) { + // Try again after stripping the executable suffix: + // clang++.exe -> clang++ + ProgName = ProgName.drop_back(StringRef(".exe").size()); + DS = FindDriverSuffix(ProgName, Pos); + } + if (!DS) { // Try again after stripping any trailing version number: // clang++3.5 -> clang++
Index: clang/lib/Driver/ToolChain.cpp =================================================================== --- clang/lib/Driver/ToolChain.cpp +++ clang/lib/Driver/ToolChain.cpp @@ -198,7 +198,7 @@ /// Normalize the program name from argv[0] by stripping the file extension if /// present and lower-casing the string on Windows. static std::string normalizeProgramName(llvm::StringRef Argv0) { - std::string ProgName = std::string(llvm::sys::path::stem(Argv0)); + std::string ProgName = std::string(llvm::sys::path::filename(Argv0)); if (is_style_windows(llvm::sys::path::Style::native)) { // Transform to lowercase for case insensitive file systems. std::transform(ProgName.begin(), ProgName.end(), ProgName.begin(), @@ -217,6 +217,13 @@ // added via -target as implicit first argument. const DriverSuffix *DS = FindDriverSuffix(ProgName, Pos); + if (!DS && ProgName.endswith(".exe")) { + // Try again after stripping the executable suffix: + // clang++.exe -> clang++ + ProgName = ProgName.drop_back(StringRef(".exe").size()); + DS = FindDriverSuffix(ProgName, Pos); + } + if (!DS) { // Try again after stripping any trailing version number: // clang++3.5 -> clang++
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits