summaryrefslogtreecommitdiffstats
path: root/recipes-devtools/clang/clang/0001-driver-Add-musl-ldso-support.patch
blob: 89eb0b8c1c6bb787562f899dea5e7f3b45886983 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
From 2b8900f80027da90a41043f8d428c208cb6fdae2 Mon Sep 17 00:00:00 2001
From: Khem Raj <raj.khem@gmail.com>
Date: Wed, 30 Mar 2016 19:56:10 -0700
Subject: [PATCH] driver: Add musl ldso support

Linux/musl libc implementation has different ldso
this needs to take effect when target arch is detected
as a musl based Linux platform

Signed-off-by: Khem Raj <raj.khem@gmail.com>
---
 lib/Driver/Tools.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 42 insertions(+), 5 deletions(-)

diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp
index e45c5c5..34237c4 100644
--- a/lib/Driver/Tools.cpp
+++ b/lib/Driver/Tools.cpp
@@ -8953,6 +8953,47 @@ static std::string getLinuxDynamicLinker(const ArgList &Args,
       return "/system/bin/linker64";
     else
       return "/system/bin/linker";
+  } else if (ToolChain.getTriple().isLinuxMuslEnvironment()) {
+    switch (Arch) {
+      case llvm::Triple::x86:
+        return "/lib/ld-musl-i386.so.1";
+      case llvm::Triple::x86_64:
+        if (ToolChain.getTriple().getEnvironment() == llvm::Triple::MUSLX32)
+          return "/lib/ld-musl-x32.so.1";
+        else
+          return "/lib/ld-musl-x86_64.so.1";
+      case llvm::Triple::aarch64:
+        return "/lib/ld-musl-aarch64.so.1";
+      case llvm::Triple::aarch64_be:
+        return "/lib/ld-musl-aarch64_be.so.1";
+      case llvm::Triple::ppc:
+        return "/lib/ld-musl-powerpc.so.1";
+      case llvm::Triple::ppc64:
+        return "/lib/ld-musl-powerpc64.so.1";
+      case llvm::Triple::arm:
+      case llvm::Triple::thumb:
+        if(arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
+          return "/lib/ld-musl-armhf.so.1";
+        else
+          return "/lib/ld-musl-arm.so.1";
+      case llvm::Triple::armeb:
+      case llvm::Triple::thumbeb:
+        if(arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
+          return "/lib/ld-musl-armebhf.so.1";
+        else
+          return "/lib/ld-musl-armeb.so.1";
+      case llvm::Triple::mips:
+        return "/lib/ld-musl-mips.so.1";
+      case llvm::Triple::mipsel:
+        return "/lib/ld-musl-mipsel.so.1";
+      case llvm::Triple::mips64:
+        return "/lib/ld-musl-mips64.so.1";
+      case llvm::Triple::mips64el:
+        return "/lib/ld-musl-mipsel64el.so.1";
+      default:
+        llvm_unreachable("unsupported musl architecture");
+        break;
+    }
   } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
              Arch == llvm::Triple::sparcel)
     return "/lib/ld-linux.so.2";
@@ -8981,11 +9022,7 @@ static std::string getLinuxDynamicLinker(const ArgList &Args,
     bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
     if (mips::isUCLibc(Args))
       LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
-    else if (!ToolChain.getTriple().hasEnvironment()) {
-      bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
-                (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
-      LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
-    } else
+    else
       LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
 
     return (LibDir + "/" + LibName).str();
-- 
2.8.2