0034-clang-Fix-how-driver-finds-GCC-installation-path-on.patch 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. From 515de929ba778d5d3b47448647ce5d33f873ea6d Mon Sep 17 00:00:00 2001
  2. From: Jun Yuan Tan <junyuan.tan@starfivetech.com>
  3. Date: Tue, 9 Nov 2021 11:10:42 +0800
  4. Subject: [PATCH 34/34] 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. Rebased to LLVM 14.0.0 by Jun Yuan Tan
  22. Signed-off-by: David Abdurachmanov <david.abdurachmanov@sifive.com>
  23. Signed-off-by: Khem Raj <raj.khem@gmail.com>
  24. Signed-off-by: Jun Yuan Tan <junyuan.tan@starfivetech.com>
  25. ---
  26. clang/lib/Driver/ToolChains/Gnu.cpp | 33 +++++++++++++++++++----------
  27. 1 file changed, 22 insertions(+), 11 deletions(-)
  28. diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp
  29. index fc65d92e8ea0..fc99318e757d 100644
  30. --- a/clang/lib/Driver/ToolChains/Gnu.cpp
  31. +++ b/clang/lib/Driver/ToolChains/Gnu.cpp
  32. @@ -1652,18 +1652,29 @@ static void findRISCVMultilibs(const Driver &D,
  33. return findRISCVBareMetalMultilibs(D, TargetTriple, Path, Args, Result);
  34. FilterNonExistent NonExistent(Path, "/crtbegin.o", D.getVFS());
  35. - Multilib Ilp32 = makeMultilib("lib32/ilp32").flag("+m32").flag("+mabi=ilp32");
  36. - Multilib Ilp32f =
  37. + MultilibSet RISCVMultilibs;
  38. +
  39. + if (TargetTriple.getVendor() == llvm::Triple::OpenEmbedded) {
  40. + Multilib OpenEmbeddedIlp32d = makeMultilib("").flag("+m32").flag("+mabi=ilp32d");
  41. + Multilib OpenEmbeddedLp64d = makeMultilib("").flag("+m64").flag("+mabi=lp64d");
  42. + RISCVMultilibs =
  43. + MultilibSet()
  44. + .Either({OpenEmbeddedIlp32d, OpenEmbeddedLp64d})
  45. + .FilterOut(NonExistent);
  46. + } else {
  47. + Multilib Ilp32 = makeMultilib("lib32/ilp32").flag("+m32").flag("+mabi=ilp32");
  48. + Multilib Ilp32f =
  49. makeMultilib("lib32/ilp32f").flag("+m32").flag("+mabi=ilp32f");
  50. - Multilib Ilp32d =
  51. + Multilib Ilp32d =
  52. makeMultilib("lib32/ilp32d").flag("+m32").flag("+mabi=ilp32d");
  53. - Multilib Lp64 = makeMultilib("lib64/lp64").flag("+m64").flag("+mabi=lp64");
  54. - Multilib Lp64f = makeMultilib("lib64/lp64f").flag("+m64").flag("+mabi=lp64f");
  55. - Multilib Lp64d = makeMultilib("lib64/lp64d").flag("+m64").flag("+mabi=lp64d");
  56. - MultilibSet RISCVMultilibs =
  57. - MultilibSet()
  58. - .Either({Ilp32, Ilp32f, Ilp32d, Lp64, Lp64f, Lp64d})
  59. - .FilterOut(NonExistent);
  60. + Multilib Lp64 = makeMultilib("lib64/lp64").flag("+m64").flag("+mabi=lp64");
  61. + Multilib Lp64f = makeMultilib("lib64/lp64f").flag("+m64").flag("+mabi=lp64f");
  62. + Multilib Lp64d = makeMultilib("lib64/lp64d").flag("+m64").flag("+mabi=lp64d");
  63. + RISCVMultilibs =
  64. + MultilibSet()
  65. + .Either({Ilp32, Ilp32f, Ilp32d, Lp64, Lp64f, Lp64d})
  66. + .FilterOut(NonExistent);
  67. + }
  68. Multilib::flags_list Flags;
  69. bool IsRV64 = TargetTriple.getArch() == llvm::Triple::riscv64;
  70. @@ -2566,7 +2577,7 @@ void Generic_GCC::GCCInstallationDetector::ScanLibDirForGCCTriple(
  71. continue; // Saw this path before; no need to look at it again.
  72. if (CandidateVersion.isOlderThan(4, 1, 1))
  73. continue;
  74. - if (CandidateVersion <= Version)
  75. + if (CandidateVersion < Version)
  76. continue;
  77. if (!ScanGCCForMultilibs(TargetTriple, Args, LI->path(),
  78. --
  79. 2.33.1