diff options
| author | Renato Golin <renato.golin@linaro.org> | 2014-02-13 10:01:16 +0000 | 
|---|---|---|
| committer | Renato Golin <renato.golin@linaro.org> | 2014-02-13 10:01:16 +0000 | 
| commit | c4b4924a13293c2ddd299a2eed7dc9c6479715d5 (patch) | |
| tree | 8fa7f930f730e9271d9ead8609a1e64d96133e18 | |
| parent | f6cb35abb4ded28fb54a232e90e440e08ca8d727 (diff) | |
| download | bcm5719-llvm-c4b4924a13293c2ddd299a2eed7dc9c6479715d5.tar.gz bcm5719-llvm-c4b4924a13293c2ddd299a2eed7dc9c6479715d5.zip  | |
Add EXPERIMENTAL --rtlib=compiler-rt to GNU Clang
This commit is not strictly correct nor accounts for all uses (shared
objects, for example), but it allows one to test the compiler-rt library
on GNU targets.
Using this patch to run the test-suite has already shown me problems
on ARM. Since this is a Darwin-only flag, nobody is using it, so it
shouldn't be a problem.
I will need extension to deal with the shared cases, but since we're
not compiling libclang_rt.so, that's not yet applicable. Many other
problems will have to be fixed first in compiler-rt (such as removing
the 'arch' name from it and making it trully multi-arch, moving it to
the default lib directory, make both .a and .so variants, etc).
llvm-svn: 201307
| -rw-r--r-- | clang/lib/Driver/Tools.cpp | 39 | ||||
| -rw-r--r-- | clang/test/Driver/linux-ld.c | 40 | 
2 files changed, 77 insertions, 2 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index acd15ea38a6..5f64097fc24 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -1737,6 +1737,24 @@ static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {      return TC.getArchName();  } +// This adds the static libclang_rt.arch.a directly to the command line +// FIXME: Make sure we can also emit shared objects if they're requested +// and available, check for possible errors, etc. +static void addClangRTLinux( +    const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) { +  // The runtime is located in the Linux library directory and has name +  // "libclang_rt.<ArchName>.a". +  SmallString<128> LibProfile(TC.getDriver().ResourceDir); +  llvm::sys::path::append( +      LibProfile, "lib", "linux", +      Twine("libclang_rt.") + getArchNameForCompilerRTLib(TC) + ".a"); + +  CmdArgs.push_back(Args.MakeArgString(LibProfile)); +  CmdArgs.push_back("-lgcc_s"); +  if (TC.getDriver().CCCIsCXX()) +    CmdArgs.push_back("-lgcc_eh"); +} +  static void addProfileRTLinux(      const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {    if (!(Args.hasArg(options::OPT_fprofile_arcs) || @@ -6534,6 +6552,23 @@ static StringRef getLinuxDynamicLinker(const ArgList &Args,      return "/lib64/ld-linux-x86-64.so.2";  } +static void AddRunTimeLibs(const ToolChain &TC, const Driver &D, +                      ArgStringList &CmdArgs, const ArgList &Args) { +  // Make use of compiler-rt if --rtlib option is used +  ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args); + +  switch(RLT) { +  case ToolChain::RLT_CompilerRT: +    addClangRTLinux(TC, Args, CmdArgs); +    break; +  case ToolChain::RLT_Libgcc: +    AddLibgcc(TC.getTriple(), D, CmdArgs, Args); +    break; +  default: +    llvm_unreachable("Unknown RT-Lib type"); +  } +} +  void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,                                    const InputInfo &Output,                                    const InputInfoList &Inputs, @@ -6737,7 +6772,7 @@ void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,          CmdArgs.push_back("-lrt");        } -      AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args); +      AddRunTimeLibs(ToolChain, D, CmdArgs, Args);        if (Args.hasArg(options::OPT_pthread) ||            Args.hasArg(options::OPT_pthreads) || OpenMP) @@ -6748,7 +6783,7 @@ void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,        if (Args.hasArg(options::OPT_static))          CmdArgs.push_back("--end-group");        else -        AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args); +        AddRunTimeLibs(ToolChain, D, CmdArgs, Args);      }      if (!Args.hasArg(options::OPT_nostartfiles)) { diff --git a/clang/test/Driver/linux-ld.c b/clang/test/Driver/linux-ld.c index 2680f76b58a..2d1f8ed08c0 100644 --- a/clang/test/Driver/linux-ld.c +++ b/clang/test/Driver/linux-ld.c @@ -35,6 +35,46 @@  //  // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \  // RUN:     --target=x86_64-unknown-linux \ +// RUN:     --sysroot=%S/Inputs/basic_linux_tree \ +// RUN:     --rtlib=compiler-rt \ +// RUN:   | FileCheck --check-prefix=CHECK-LD-RT %s +// CHECK-LD-RT-NOT: warning: +// CHECK-LD-RT: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-LD-RT: "--eh-frame-hdr" +// CHECK-LD-RT: "-m" "elf_x86_64" +// CHECK-LD-RT: "-dynamic-linker" +// CHECK-LD-RT: "{{.*}}/usr/lib/gcc/x86_64-unknown-linux/4.6.0{{/|\\\\}}crtbegin.o" +// CHECK-LD-RT: "-L[[SYSROOT]]/usr/lib/gcc/x86_64-unknown-linux/4.6.0" +// CHECK-LD-RT: "-L[[SYSROOT]]/usr/lib/gcc/x86_64-unknown-linux/4.6.0/../../../../x86_64-unknown-linux/lib" +// CHECK-LD-RT: "-L[[SYSROOT]]/usr/lib/gcc/x86_64-unknown-linux/4.6.0/../../.." +// CHECK-LD-RT: "-L[[SYSROOT]]/lib" +// CHECK-LD-RT: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD-RT: libclang_rt.x86_64.a" "-lgcc_s" +// CHECK-LD-RT: "-lc" +// CHECK-LD-RT: libclang_rt.x86_64.a" "-lgcc_s" +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN:     --target=x86_64-unknown-linux \ +// RUN:     --sysroot=%S/Inputs/basic_linux_tree \ +// RUN:     --rtlib=libgcc \ +// RUN:   | FileCheck --check-prefix=CHECK-LD-GCC %s +// CHECK-LD-GCC-NOT: warning: +// CHECK-LD-GCC: "{{.*}}ld{{(.exe)?}}" "--sysroot=[[SYSROOT:[^"]+]]" +// CHECK-LD-GCC: "--eh-frame-hdr" +// CHECK-LD-GCC: "-m" "elf_x86_64" +// CHECK-LD-GCC: "-dynamic-linker" +// CHECK-LD-GCC: "{{.*}}/usr/lib/gcc/x86_64-unknown-linux/4.6.0{{/|\\\\}}crtbegin.o" +// CHECK-LD-GCC: "-L[[SYSROOT]]/usr/lib/gcc/x86_64-unknown-linux/4.6.0" +// CHECK-LD-GCC: "-L[[SYSROOT]]/usr/lib/gcc/x86_64-unknown-linux/4.6.0/../../../../x86_64-unknown-linux/lib" +// CHECK-LD-GCC: "-L[[SYSROOT]]/usr/lib/gcc/x86_64-unknown-linux/4.6.0/../../.." +// CHECK-LD-GCC: "-L[[SYSROOT]]/lib" +// CHECK-LD-GCC: "-L[[SYSROOT]]/usr/lib" +// CHECK-LD-GCC "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" +// CHECK-LD-GCC: "-lc" +// CHECK-LD-GCC: "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" +// +// RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ +// RUN:     --target=x86_64-unknown-linux \  // RUN:     -static-libgcc \  // RUN:     --sysroot=%S/Inputs/basic_linux_tree \  // RUN:   | FileCheck --check-prefix=CHECK-LD-64-STATIC-LIBGCC %s  | 

