Hi eugenis, samsonov, ddunbar,
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).
http://llvm-reviews.chandlerc.com/D2740
Files:
lib/Driver/Tools.cpp
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -1738,6 +1738,18 @@
return TC.getArchName();
}
+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));
+}
+
static void addProfileRTLinux(
const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
@@ -6690,7 +6702,19 @@
CmdArgs.push_back("-lrt");
}
- AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
+ // Make use of compiler-rt if --rtlib option is used
+ ToolChain::RuntimeLibType RLT = ToolChain.GetRuntimeLibType(Args);
+
+ switch(RLT) {
+ case ToolChain::RLT_CompilerRT:
+ addClangRTLinux(ToolChain, Args, CmdArgs);
+ break;
+ case ToolChain::RLT_Libgcc:
+ AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
+ break;
+ default:
+ llvm_unreachable("Unknown RT-Lib type");
+ }
if (Args.hasArg(options::OPT_pthread) ||
Args.hasArg(options::OPT_pthreads) || OpenMP)
@@ -6700,8 +6724,12 @@
if (Args.hasArg(options::OPT_static))
CmdArgs.push_back("--end-group");
- else
+ else if (RLT == ToolChain::RLT_Libgcc)
AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
+ else if (RLT == ToolChain::RLT_CompilerRT)
+ addClangRTLinux(ToolChain, Args, CmdArgs);
+ else
+ llvm_unreachable("Unknown RT-Lib type");
}
if (!Args.hasArg(options::OPT_nostartfiles)) {
Index: lib/Driver/Tools.cpp
===================================================================
--- lib/Driver/Tools.cpp
+++ lib/Driver/Tools.cpp
@@ -1738,6 +1738,18 @@
return TC.getArchName();
}
+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));
+}
+
static void addProfileRTLinux(
const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
@@ -6690,7 +6702,19 @@
CmdArgs.push_back("-lrt");
}
- AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
+ // Make use of compiler-rt if --rtlib option is used
+ ToolChain::RuntimeLibType RLT = ToolChain.GetRuntimeLibType(Args);
+
+ switch(RLT) {
+ case ToolChain::RLT_CompilerRT:
+ addClangRTLinux(ToolChain, Args, CmdArgs);
+ break;
+ case ToolChain::RLT_Libgcc:
+ AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
+ break;
+ default:
+ llvm_unreachable("Unknown RT-Lib type");
+ }
if (Args.hasArg(options::OPT_pthread) ||
Args.hasArg(options::OPT_pthreads) || OpenMP)
@@ -6700,8 +6724,12 @@
if (Args.hasArg(options::OPT_static))
CmdArgs.push_back("--end-group");
- else
+ else if (RLT == ToolChain::RLT_Libgcc)
AddLibgcc(ToolChain.getTriple(), D, CmdArgs, Args);
+ else if (RLT == ToolChain::RLT_CompilerRT)
+ addClangRTLinux(ToolChain, Args, CmdArgs);
+ else
+ llvm_unreachable("Unknown RT-Lib type");
}
if (!Args.hasArg(options::OPT_nostartfiles)) {
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits