vgvassilev wrote:
Can you test:
```
diff --git a/clang/lib/Interpreter/Interpreter.cpp
b/clang/lib/Interpreter/Interpreter.cpp
index 763d298b052f..4551c7bbfced 100644
--- a/clang/lib/Interpreter/Interpreter.cpp
+++ b/clang/lib/Interpreter/Interpreter.cpp
@@ -275,14 +275,12 @@ llvm::Error
IncrementalExecutorBuilder::UpdateOrcRuntimePath(
if (!IsOutOfProcess)
return llvm::Error::success();
- // Candidate runtime filenames to look for (tweak as appropriate).
static constexpr std::array<const char *, 3> OrcRTLibNames = {
"liborc_rt.a",
"liborc_rt_osx.a",
"liborc_rt-x86_64.a",
};
- // Return the first file found inside 'Base' (Base may be a directory).
auto findInDir = [&](llvm::StringRef Base) -> std::optional<std::string> {
if (Base.empty())
return std::nullopt;
@@ -296,51 +294,56 @@ llvm::Error
IncrementalExecutorBuilder::UpdateOrcRuntimePath(
};
const clang::driver::Driver &D = C.getDriver();
-
+ const clang::driver::ToolChain &TC = C.getDefaultToolChain();
llvm::SmallVector<std::string, 8> triedPaths;
- // Prefer Driver::ResourceDir-derived locations:
- // ResourceDir is typically: <prefix>/lib/clang/<version>
+ // Ask the ToolChain for its runtime paths first.
+ for (auto RuntimePath :
+ {TC.getRuntimePath(), std::make_optional(TC.getCompilerRTPath())}) {
+ if (RuntimePath) {
+ if (auto Found = findInDir(*RuntimePath)) {
+ OrcRuntimePath = *Found;
+ return llvm::Error::success();
+ }
+ triedPaths.emplace_back(*RuntimePath);
+ }
+ }
+
+ // ResourceDir-derived locations fallback
if (!D.ResourceDir.empty()) {
llvm::SmallString<256> Resource(D.ResourceDir);
-
- // Directly searching ResourceDir is cheap and sometimes sufficient.
- if (auto F = findInDir(Resource)) {
- OrcRuntimePath = *F;
- return llvm::Error::success();
+ // Check ResourceDir and ResourceDir/lib
+ for (auto P : {Resource.str().str(), (Resource + "/lib").str()}) {
+ if (auto F = findInDir(P)) {
+ OrcRuntimePath = *F;
+ return llvm::Error::success();
+ }
+ triedPaths.emplace_back(std::string(P));
}
- triedPaths.emplace_back(std::string(Resource.str()));
-
- // Build <prefix>/lib/clang/<version>/lib. Resource already contains
- // .../clang/<version>)
- llvm::SmallString<256> ClangLibDir(Resource);
- // ClangLibDir currently: <prefix>/lib/clang/<version>
- // We want: <prefix>/lib/clang/<version>/lib
- llvm::sys::path::append(ClangLibDir, "lib");
- if (auto F = findInDir(ClangLibDir)) {
+
+ // Platform-specific subdirectory (Fixes Solaris "sunos" issue)
+ llvm::StringRef OSName = TC.getOSLibName();
+
+ llvm::SmallString<256> PlatformPath(Resource);
+ llvm::sys::path::append(PlatformPath, "lib", OSName);
+ if (auto F = findInDir(PlatformPath)) {
OrcRuntimePath = *F;
return llvm::Error::success();
}
- triedPaths.emplace_back(std::string(ClangLibDir.str()));
+ triedPaths.emplace_back(std::string(PlatformPath.str()));
- // Walk up to <prefix>/lib and search there and common variants.
+ // 4. Corrected Formal Path (Prefix/lib/clang/Version/lib)
llvm::SmallString<256> PrefixLib = Resource;
llvm::sys::path::remove_filename(PrefixLib); // remove <version>
- llvm::sys::path::remove_filename(PrefixLib); // remove clang
- if (!PrefixLib.empty()) {
- if (auto F = findInDir(PrefixLib)) {
- OrcRuntimePath = *F;
- return llvm::Error::success();
- }
- triedPaths.emplace_back(std::string(PrefixLib.str()));
+ llvm::sys::path::remove_filename(PrefixLib); // remove 'clang'
+ // PrefixLib is now <prefix>/lib
- // Also check <prefix>/<libdir_basename>/clang/<version>/lib if present
in
- // this environment. We extract version from the original ResourceDir
- // filename (the '<version>' component).
- llvm::SmallString<64> Version =
- llvm::sys::path::filename(llvm::StringRef(Resource));
+ if (!PrefixLib.empty()) {
+ llvm::SmallString<64> Version = llvm::sys::path::filename(Resource);
llvm::SmallString<256> FormalClangLib = PrefixLib;
- llvm::sys::path::append(FormalClangLib, "lib", "clang", Version, "lib");
+ // Note: PrefixLib already ends in 'lib', so we append
'clang/Version/lib'
+ llvm::sys::path::append(FormalClangLib, "clang", Version, "lib");
+
if (auto F = findInDir(FormalClangLib)) {
OrcRuntimePath = *F;
return llvm::Error::success();
@@ -349,20 +352,6 @@ llvm::Error
IncrementalExecutorBuilder::UpdateOrcRuntimePath(
}
}
- // ToolChain runtime/compiler-rt locations (if available).
- const clang::driver::ToolChain &TC = C.getDefaultToolChain();
- for (auto RuntimePath :
- {TC.getRuntimePath(), std::make_optional(TC.getCompilerRTPath())}) {
- if (RuntimePath && TC.getVFS().exists(*RuntimePath)) {
- if (auto Found = findInDir(*RuntimePath)) {
- OrcRuntimePath = *Found;
- return llvm::Error::success();
- } else {
- triedPaths.emplace_back(*RuntimePath);
- }
- }
- }
-
// If we reached here, nothing was found. Build a helpful error string.
std::string Joined;
for (size_t i = 0; i < triedPaths.size(); ++i) {
```
https://github.com/llvm/llvm-project/pull/175322
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits