0026-clang-Fix-how-driver-finds-GCC-installation-path-on-.patch 4.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. From 1801fad99e1dedbe8d40931b18c37d326a1d532c Mon Sep 17 00:00:00 2001
  2. From: David Abdurachmanov <david.abdurachmanov@sifive.com>
  3. Date: Wed, 20 Oct 2021 17:30:36 -0700
  4. Subject: [PATCH] clang: Fix how driver finds GCC installation path on
  5. OpenEmbedded
  6. Fix how Clang Driver finds GCC installation path on OpenEmbedded
  7. - For RISCV (riscv{32,64}) we define new two multi-lib options without any
  8. subdirectories (e.g., lib32/ilp32d or lib64/lp64d). OpenEmbedded GCC
  9. builds don't use them.
  10. - Modify how Clang Driver finds GCC installation path. This is important
  11. because GCC files on OpenEmbedded are in two different directories:
  12. (1) /usr/bin/../lib/gcc/riscv64-oe-linux/9.2.0
  13. (2) /usr/lib/riscv64-oe-linux/9.2.0
  14. Clang Driver will check (1) first. The directory exist, but will produce
  15. no valid multi-libs and there will be no multi-lib selected. (2) contains
  16. actual GCC run-time objects/libraries, but because the path has exact
  17. same GCC version (9.2.0) it will be skipped.
  18. We modify the approach by allowing to check other directories with the same
  19. GCC version. We also avoid picking GCC installation path if it results in
  20. an empty multi-lib list.
  21. Upstream-Status: Pending
  22. Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
  23. Signed-off-by: Khem Raj <raj.khem@gmail.com>
  24. ---
  25. clang/lib/Driver/ToolChains/Gnu.cpp | 39 +++++++++++++++++++++--------
  26. 1 file changed, 28 insertions(+), 11 deletions(-)
  27. diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
  28. index 80a21d58c86c..77f5c3f58a8b 100644
  29. --- a/clang/lib/Driver/ToolChains/Gnu.cpp
  30. +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
  31. @@ -1748,18 +1748,29 @@ static void findRISCVMultilibs(const Driver &D,
  32. return findRISCVBareMetalMultilibs(D, TargetTriple, Path, Args, Result);
  33. FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
  34. - Multilib Ilp32 = makeMultilib("lib32/ilp32").flag("+m32").flag("+mabi=ilp32");
  35. - Multilib Ilp32f =
  36. + MultilibSet RISCVMultilibs;
  37. +
  38. + if (TargetTriple.getVendor() == llvm::Triple::OpenEmbedded) {
  39. + Multilib OpenEmbeddedIlp32d = makeMultilib("").flag("+m32").flag("+mabi=ilp32d");
  40. + Multilib OpenEmbeddedLp64d = makeMultilib("").flag("+m64").flag("+mabi=lp64d");
  41. + RISCVMultilibs =
  42. + MultilibSet()
  43. + .Either({OpenEmbeddedIlp32d, OpenEmbeddedLp64d})
  44. + .FilterOut(NonExistent);
  45. + } else {
  46. + Multilib Ilp32 = makeMultilib("lib32/ilp32").flag("+m32").flag("+mabi=ilp32");
  47. + Multilib Ilp32f =
  48. makeMultilib("lib32/ilp32f").flag("+m32").flag("+mabi=ilp32f");
  49. - Multilib Ilp32d =
  50. + Multilib Ilp32d =
  51. makeMultilib("lib32/ilp32d").flag("+m32").flag("+mabi=ilp32d");
  52. - Multilib Lp64 = makeMultilib("lib64/lp64").flag("+m64").flag("+mabi=lp64");
  53. - Multilib Lp64f = makeMultilib("lib64/lp64f").flag("+m64").flag("+mabi=lp64f");
  54. - Multilib Lp64d = makeMultilib("lib64/lp64d").flag("+m64").flag("+mabi=lp64d");
  55. - MultilibSet RISCVMultilibs =
  56. - MultilibSet()
  57. - .Either({Ilp32, Ilp32f, Ilp32d, Lp64, Lp64f, Lp64d})
  58. - .FilterOut(NonExistent);
  59. + Multilib Lp64 = makeMultilib("lib64/lp64").flag("+m64").flag("+mabi=lp64");
  60. + Multilib Lp64f = makeMultilib("lib64/lp64f").flag("+m64").flag("+mabi=lp64f");
  61. + Multilib Lp64d = makeMultilib("lib64/lp64d").flag("+m64").flag("+mabi=lp64d");
  62. + RISCVMultilibs =
  63. + MultilibSet()
  64. + .Either({Ilp32, Ilp32f, Ilp32d, Lp64, Lp64f, Lp64d})
  65. + .FilterOut(NonExistent);
  66. + }
  67. Multilib::flags_list Flags;
  68. bool IsRV64 = TargetTriple.getArch() == llvm::Triple::riscv64;
  69. @@ -2713,13 +2724,19 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
  70. continue; // Saw this path before; no need to look at it again.
  71. if (CandidateVersion.isOlderThan(4, 1, 1))
  72. continue;
  73. - if (CandidateVersion <= Version)
  74. + if (CandidateVersion < Version)
  75. continue;
  76. if (!ScanGCCForMultilibs(TargetTriple, Args, LI->path(),
  77. NeedsBiarchSuffix))
  78. continue;
  79. + // We might have found existing directory with GCCVersion, but it
  80. + // might not have GCC libraries we are looking for (i.e. return an
  81. + // empty Mulilibs)
  82. + if (Multilibs.size() == 0)
  83. + continue;
  84. +
  85. Version = CandidateVersion;
  86. GCCTriple.setTriple(CandidateTriple);
  87. // FIXME: We hack together the directory name here instead of