diff options
author | Simon Atanasyan <simon@atanasyan.com> | 2018-10-15 22:43:23 +0000 |
---|---|---|
committer | Simon Atanasyan <simon@atanasyan.com> | 2018-10-15 22:43:23 +0000 |
commit | db81c7b9c964db39bbc42749dc30316dd9f58eb8 (patch) | |
tree | c9fba593b08f8f80346179749bcebd13840e15a0 /clang/lib/Driver/ToolChains/Linux.cpp | |
parent | 6d92ca61f918456726b67d124499cbf0595ba335 (diff) | |
download | bcm5719-llvm-db81c7b9c964db39bbc42749dc30316dd9f58eb8.tar.gz bcm5719-llvm-db81c7b9c964db39bbc42749dc30316dd9f58eb8.zip |
[mips] Fix handling of GNUABIN32 environment in a target triple
The `GNUABIN32` environment in a target triple implies using the N32
ABI. This patch adds support for this environment and switches on N32
ABI if necessary.
Patch by Patch by YunQiang Su.
Differential revision: https://reviews.llvm.org/D51464
llvm-svn: 344570
Diffstat (limited to 'clang/lib/Driver/ToolChains/Linux.cpp')
-rw-r--r-- | clang/lib/Driver/ToolChains/Linux.cpp | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/clang/lib/Driver/ToolChains/Linux.cpp b/clang/lib/Driver/ToolChains/Linux.cpp index 7df3da1c839..a02d10947b4 100644 --- a/clang/lib/Driver/ToolChains/Linux.cpp +++ b/clang/lib/Driver/ToolChains/Linux.cpp @@ -44,6 +44,9 @@ static std::string getMultiarchTriple(const Driver &D, llvm::Triple::EnvironmentType TargetEnvironment = TargetTriple.getEnvironment(); bool IsAndroid = TargetTriple.isAndroid(); + std::string Mips64Abi = "gnuabi64"; + if (TargetEnvironment == llvm::Triple::GNUABIN32) + Mips64Abi = "gnuabin32"; // For most architectures, just use whatever we have rather than trying to be // clever. @@ -112,18 +115,14 @@ static std::string getMultiarchTriple(const Driver &D, return "mipsel-linux-gnu"; break; case llvm::Triple::mips64: - if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnu")) - return "mips64-linux-gnu"; - if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-gnuabi64")) - return "mips64-linux-gnuabi64"; + if (D.getVFS().exists(SysRoot + "/lib/mips64-linux-" + Mips64Abi)) + return "mips64-linux-" + Mips64Abi; break; case llvm::Triple::mips64el: if (IsAndroid) return "mips64el-linux-android"; - if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnu")) - return "mips64el-linux-gnu"; - if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-gnuabi64")) - return "mips64el-linux-gnuabi64"; + if (D.getVFS().exists(SysRoot + "/lib/mips64el-linux-" + Mips64Abi)) + return "mips64el-linux-" + Mips64Abi; break; case llvm::Triple::ppc: if (D.getVFS().exists(SysRoot + "/lib/powerpc-linux-gnuspe")) @@ -702,6 +701,10 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs, const StringRef MIPS64ELMultiarchIncludeDirs[] = { "/usr/include/mips64el-linux-gnu", "/usr/include/mips64el-linux-gnuabi64"}; + const StringRef MIPSN32MultiarchIncludeDirs[] = { + "/usr/include/mips64-linux-gnuabin32"}; + const StringRef MIPSN32ELMultiarchIncludeDirs[] = { + "/usr/include/mips64el-linux-gnuabin32"}; const StringRef PPCMultiarchIncludeDirs[] = { "/usr/include/powerpc-linux-gnu", "/usr/include/powerpc-linux-gnuspe"}; @@ -748,10 +751,16 @@ void Linux::AddClangSystemIncludeArgs(const ArgList &DriverArgs, MultiarchIncludeDirs = MIPSELMultiarchIncludeDirs; break; case llvm::Triple::mips64: - MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs; + if (getTriple().getEnvironment() == llvm::Triple::GNUABIN32) + MultiarchIncludeDirs = MIPSN32MultiarchIncludeDirs; + else + MultiarchIncludeDirs = MIPS64MultiarchIncludeDirs; break; case llvm::Triple::mips64el: - MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs; + if (getTriple().getEnvironment() == llvm::Triple::GNUABIN32) + MultiarchIncludeDirs = MIPSN32ELMultiarchIncludeDirs; + else + MultiarchIncludeDirs = MIPS64ELMultiarchIncludeDirs; break; case llvm::Triple::ppc: MultiarchIncludeDirs = PPCMultiarchIncludeDirs; |