forked from OSchip/llvm-project
Driver: unify compiler-rt component selection
Unify the component handling for compiler-rt. The components are regularly named, built up from: ${LIBRARY_PREFIX}clang_rt.${component}-${arch}[-${environment}]${LIBRARY_SUFFIX} Unify the handling for all the various components, into a single path to link against the various components in a number of places. This reduces duplication of the clang_rt library name construction logic. llvm-svn: 225013
This commit is contained in:
parent
2e46ebe56f
commit
6815094f9b
|
@ -2119,22 +2119,30 @@ static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
|
||||||
return Res;
|
return Res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SmallString<128> getCompilerRT(const ToolChain &TC, StringRef Component,
|
||||||
|
bool Shared = false,
|
||||||
|
const char *Env = "") {
|
||||||
|
bool IsOSWindows = TC.getTriple().isOSWindows();
|
||||||
|
StringRef Arch = getArchNameForCompilerRTLib(TC);
|
||||||
|
const char *Prefix = IsOSWindows ? "" : "lib";
|
||||||
|
const char *Suffix =
|
||||||
|
Shared ? (IsOSWindows ? ".dll" : ".so") : (IsOSWindows ? ".lib" : ".a");
|
||||||
|
|
||||||
|
SmallString<128> Path = getCompilerRTLibDir(TC);
|
||||||
|
llvm::sys::path::append(Path, Prefix + Twine("clang_rt.") + Component + "-" +
|
||||||
|
Arch + Env + Suffix);
|
||||||
|
|
||||||
|
return Path;
|
||||||
|
}
|
||||||
|
|
||||||
// This adds the static libclang_rt.builtins-arch.a directly to the command line
|
// This adds the static libclang_rt.builtins-arch.a directly to the command line
|
||||||
// FIXME: Make sure we can also emit shared objects if they're requested
|
// FIXME: Make sure we can also emit shared objects if they're requested
|
||||||
// and available, check for possible errors, etc.
|
// and available, check for possible errors, etc.
|
||||||
static void addClangRT(const ToolChain &TC, const ArgList &Args,
|
static void addClangRT(const ToolChain &TC, const ArgList &Args,
|
||||||
ArgStringList &CmdArgs) {
|
ArgStringList &CmdArgs) {
|
||||||
bool IsOSWindows = TC.getTriple().isOSWindows();
|
CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "builtins")));
|
||||||
StringRef Arch = getArchNameForCompilerRTLib(TC);
|
|
||||||
const char *Prefix = IsOSWindows ? "" : "lib";
|
|
||||||
const char *Suffix = IsOSWindows ? ".lib" : ".a";
|
|
||||||
|
|
||||||
SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
|
if (!TC.getTriple().isOSWindows()) {
|
||||||
llvm::sys::path::append(LibClangRT,
|
|
||||||
Prefix + Twine("clang_rt.builtins-") + Arch + Suffix);
|
|
||||||
|
|
||||||
CmdArgs.push_back(Args.MakeArgString(LibClangRT));
|
|
||||||
if (!IsOSWindows) {
|
|
||||||
// FIXME: why do we link against gcc when we are using compiler-rt?
|
// FIXME: why do we link against gcc when we are using compiler-rt?
|
||||||
CmdArgs.push_back("-lgcc_s");
|
CmdArgs.push_back("-lgcc_s");
|
||||||
if (TC.getDriver().CCCIsCXX())
|
if (TC.getDriver().CCCIsCXX())
|
||||||
|
@ -2152,38 +2160,22 @@ static void addProfileRT(const ToolChain &TC, const ArgList &Args,
|
||||||
Args.hasArg(options::OPT_coverage)))
|
Args.hasArg(options::OPT_coverage)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SmallString<128> LibProfile = getCompilerRTLibDir(TC);
|
CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, "profile")));
|
||||||
llvm::sys::path::append(LibProfile, Twine("libclang_rt.profile-") +
|
|
||||||
getArchNameForCompilerRTLib(TC) +
|
|
||||||
".a");
|
|
||||||
|
|
||||||
CmdArgs.push_back(Args.MakeArgString(LibProfile));
|
|
||||||
}
|
|
||||||
|
|
||||||
static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
|
|
||||||
StringRef Sanitizer,
|
|
||||||
bool Shared) {
|
|
||||||
// Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
|
|
||||||
// (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
|
|
||||||
const char *EnvSuffix =
|
|
||||||
TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
|
|
||||||
SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
|
|
||||||
llvm::sys::path::append(LibSanitizer,
|
|
||||||
Twine("libclang_rt.") + Sanitizer + "-" +
|
|
||||||
getArchNameForCompilerRTLib(TC) + EnvSuffix +
|
|
||||||
(Shared ? ".so" : ".a"));
|
|
||||||
return LibSanitizer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
|
static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
|
||||||
ArgStringList &CmdArgs, StringRef Sanitizer,
|
ArgStringList &CmdArgs, StringRef Sanitizer,
|
||||||
bool IsShared) {
|
bool IsShared) {
|
||||||
SmallString<128> LibSanitizer = getSanitizerRTLibName(TC, Sanitizer, IsShared);
|
const char *Env = TC.getTriple().getEnvironment() == llvm::Triple::Android
|
||||||
|
? "-android"
|
||||||
|
: "";
|
||||||
|
|
||||||
// Static runtimes must be forced into executable, so we wrap them in
|
// Static runtimes must be forced into executable, so we wrap them in
|
||||||
// whole-archive.
|
// whole-archive.
|
||||||
if (!IsShared)
|
if (!IsShared)
|
||||||
CmdArgs.push_back("-whole-archive");
|
CmdArgs.push_back("-whole-archive");
|
||||||
CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
|
CmdArgs.push_back(Args.MakeArgString(getCompilerRT(TC, Sanitizer, IsShared,
|
||||||
|
Env)));
|
||||||
if (!IsShared)
|
if (!IsShared)
|
||||||
CmdArgs.push_back("-no-whole-archive");
|
CmdArgs.push_back("-no-whole-archive");
|
||||||
}
|
}
|
||||||
|
@ -2193,10 +2185,9 @@ static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
|
||||||
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
|
static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
|
||||||
ArgStringList &CmdArgs,
|
ArgStringList &CmdArgs,
|
||||||
StringRef Sanitizer) {
|
StringRef Sanitizer) {
|
||||||
SmallString<128> LibSanitizer = getSanitizerRTLibName(TC, Sanitizer, false);
|
SmallString<128> SanRT = getCompilerRT(TC, Sanitizer);
|
||||||
if (llvm::sys::fs::exists(LibSanitizer + ".syms")) {
|
if (llvm::sys::fs::exists(SanRT + ".syms")) {
|
||||||
CmdArgs.push_back(
|
CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
|
||||||
Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Reference in New Issue