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

Reply via email to