diff options
author | John Baldwin <jhb@FreeBSD.org> | 2018-06-27 00:02:16 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2018-06-27 00:02:16 +0000 |
commit | 839cbc855e4fef4b9c815ee1cb90efd682c21eeb (patch) | |
tree | bfd22783c6e6d61ba2ef4b4a6c7eeb3d07d214ba /clang/lib/Driver/ToolChains/FreeBSD.cpp | |
parent | d7e126c491fe3552e9845a8b274103379824323c (diff) | |
download | bcm5719-llvm-839cbc855e4fef4b9c815ee1cb90efd682c21eeb.tar.gz bcm5719-llvm-839cbc855e4fef4b9c815ee1cb90efd682c21eeb.zip |
[mips] Explicitly specify the linker emulation for MIPS on FreeBSD.
FreeBSD's mips64 builds O32 binaries for /usr/lib32 by default and
thus needs to be able to link O32 binaries which requires an explicit
linker emulation. Go ahead and list all the linker emulation variants
for MIPS so that any supported MIPS ABI binary can be linked by any
linker supporting MIPS.
Reviewed By: atanasyan
Differential Revision: https://reviews.llvm.org/D48507
llvm-svn: 335691
Diffstat (limited to 'clang/lib/Driver/ToolChains/FreeBSD.cpp')
-rw-r--r-- | clang/lib/Driver/ToolChains/FreeBSD.cpp | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/clang/lib/Driver/ToolChains/FreeBSD.cpp b/clang/lib/Driver/ToolChains/FreeBSD.cpp index b6c4e8fdd91..9626ea906f1 100644 --- a/clang/lib/Driver/ToolChains/FreeBSD.cpp +++ b/clang/lib/Driver/ToolChains/FreeBSD.cpp @@ -165,16 +165,39 @@ void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("--enable-new-dtags"); } - // When building 32-bit code on FreeBSD/amd64, we have to explicitly - // instruct ld in the base system to link 32-bit code. - if (Arch == llvm::Triple::x86) { + // Explicitly set the linker emulation for platforms that might not + // be the default emulation for the linker. + switch (Arch) { + case llvm::Triple::x86: CmdArgs.push_back("-m"); CmdArgs.push_back("elf_i386_fbsd"); - } - - if (Arch == llvm::Triple::ppc) { + break; + case llvm::Triple::ppc: CmdArgs.push_back("-m"); CmdArgs.push_back("elf32ppc_fbsd"); + break; + case llvm::Triple::mips: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf32btsmip_fbsd"); + break; + case llvm::Triple::mipsel: + CmdArgs.push_back("-m"); + CmdArgs.push_back("elf32ltsmip_fbsd"); + break; + case llvm::Triple::mips64: + CmdArgs.push_back("-m"); + if (tools::mips::hasMipsAbiArg(Args, "n32")) + CmdArgs.push_back("elf32btsmipn32_fbsd"); + else + CmdArgs.push_back("elf64btsmip_fbsd"); + break; + case llvm::Triple::mips64el: + CmdArgs.push_back("-m"); + if (tools::mips::hasMipsAbiArg(Args, "n32")) + CmdArgs.push_back("elf32ltsmipn32_fbsd"); + else + CmdArgs.push_back("elf64ltsmip_fbsd"); + break; } if (Arg *A = Args.getLastArg(options::OPT_G)) { |