From 2b063246acbbd646b9a15c9ed852db6f1573a370 Mon Sep 17 00:00:00 2001 From: Joerg Sonnenberger Date: Sun, 2 Feb 2014 22:47:37 +0000 Subject: [PATCH] Handle compat support for EABI/old APCS compatibility on NetBSD/ARM. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@200665 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Driver/ToolChains.cpp | 21 ++++++++++++++++++++- lib/Driver/Tools.cpp | 17 +++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 2a1521f7c6..1b447e41e6 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -2230,8 +2230,27 @@ NetBSD::NetBSD(const Driver &D, const llvm::Triple& Triple, const ArgList &Args) // doesn't work. // FIXME: It'd be nicer to test if this directory exists, but I'm not sure // what all logic is needed to emulate the '=' prefix here. - if (Triple.getArch() == llvm::Triple::x86) + switch (Triple.getArch()) { + case llvm::Triple::x86: getFilePaths().push_back("=/usr/lib/i386"); + break; + case llvm::Triple::arm: + case llvm::Triple::thumb: + switch (Triple.getEnvironment()) { + case llvm::Triple::EABI: + case llvm::Triple::EABIHF: + case llvm::Triple::GNUEABI: + case llvm::Triple::GNUEABIHF: + getFilePaths().push_back("=/usr/lib/eabi"); + break; + default: + getFilePaths().push_back("=/usr/lib/oabi"); + break; + } + break; + default: + break; + } getFilePaths().push_back("=/usr/lib"); } diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index d477a6a413..cc0f7795ad 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -6117,6 +6117,23 @@ void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("elf_i386"); } + // On ARM, the linker can generate either EABI or the older APCS. + // Instruct it to use the correct emulation. + if (getToolChain().getArch() == llvm::Triple::arm) { + CmdArgs.push_back("-m"); + switch (getToolChain().getTriple().getEnvironment()) { + case llvm::Triple::EABI: + case llvm::Triple::EABIHF: + case llvm::Triple::GNUEABI: + case llvm::Triple::GNUEABIHF: + CmdArgs.push_back("armelf_nbsd_eabi"); + break; + default: + CmdArgs.push_back("armelf_nbsd"); + break; + } + } + if (Output.isFilename()) { CmdArgs.push_back("-o"); CmdArgs.push_back(Output.getFilename()); -- 2.40.0