fix-clang-driver-gcc-install-path-on-openembedded.patch 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
  2. index e56812145e6d..b02c228d40af 100644
  3. --- a/clang/lib/Driver/ToolChains/Gnu.cpp
  4. +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
  5. @@ -1650,18 +1650,29 @@ static void findRISCVMultilibs(const Driver &D,
  6. return findRISCVBareMetalMultilibs(D, TargetTriple, Path, Args, Result);
  7. FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
  8. - Multilib Ilp32 = makeMultilib("lib32/ilp32").flag("+m32").flag("+mabi=ilp32");
  9. - Multilib Ilp32f =
  10. + MultilibSet RISCVMultilibs;
  11. +
  12. + if (TargetTriple.getVendor() == llvm::Triple::OpenEmbedded) {
  13. + Multilib OpenEmbeddedIlp32d = makeMultilib("").flag("+m32").flag("+mabi=ilp32d");
  14. + Multilib OpenEmbeddedLp64d = makeMultilib("").flag("+m64").flag("+mabi=lp64d");
  15. + RISCVMultilibs =
  16. + MultilibSet()
  17. + .Either({OpenEmbeddedIlp32d, OpenEmbeddedLp64d})
  18. + .FilterOut(NonExistent);
  19. + } else {
  20. + Multilib Ilp32 = makeMultilib("lib32/ilp32").flag("+m32").flag("+mabi=ilp32");
  21. + Multilib Ilp32f =
  22. makeMultilib("lib32/ilp32f").flag("+m32").flag("+mabi=ilp32f");
  23. - Multilib Ilp32d =
  24. + Multilib Ilp32d =
  25. makeMultilib("lib32/ilp32d").flag("+m32").flag("+mabi=ilp32d");
  26. - Multilib Lp64 = makeMultilib("lib64/lp64").flag("+m64").flag("+mabi=lp64");
  27. - Multilib Lp64f = makeMultilib("lib64/lp64f").flag("+m64").flag("+mabi=lp64f");
  28. - Multilib Lp64d = makeMultilib("lib64/lp64d").flag("+m64").flag("+mabi=lp64d");
  29. - MultilibSet RISCVMultilibs =
  30. - MultilibSet()
  31. - .Either({Ilp32, Ilp32f, Ilp32d, Lp64, Lp64f, Lp64d})
  32. - .FilterOut(NonExistent);
  33. + Multilib Lp64 = makeMultilib("lib64/lp64").flag("+m64").flag("+mabi=lp64");
  34. + Multilib Lp64f = makeMultilib("lib64/lp64f").flag("+m64").flag("+mabi=lp64f");
  35. + Multilib Lp64d = makeMultilib("lib64/lp64d").flag("+m64").flag("+mabi=lp64d");
  36. + RISCVMultilibs =
  37. + MultilibSet()
  38. + .Either({Ilp32, Ilp32f, Ilp32d, Lp64, Lp64f, Lp64d})
  39. + .FilterOut(NonExistent);
  40. + }
  41. Multilib::flags_list Flags;
  42. bool IsRV64 = TargetTriple.getArch() == llvm::Triple::riscv64;
  43. @@ -2563,13 +2574,19 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
  44. continue; // Saw this path before; no need to look at it again.
  45. if (CandidateVersion.isOlderThan(4, 1, 1))
  46. continue;
  47. - if (CandidateVersion <= Version)
  48. + if (CandidateVersion < Version)
  49. continue;
  50. if (!ScanGCCForMultilibs(TargetTriple, Args, LI->path(),
  51. NeedsBiarchSuffix))
  52. continue;
  53. + // We might have found existing directory with GCCVersion, but it
  54. + // might not have GCC libraries we are looking for (i.e. return an
  55. + // empty Mulilibs)
  56. + if (Multilibs.size() == 0)
  57. + continue;
  58. +
  59. Version = CandidateVersion;
  60. GCCTriple.setTriple(CandidateTriple);
  61. // FIXME: We hack together the directory name here instead of