[Driver] Support object files in addition to static and shared libraries in compiler-rt

This change introduces support for object files in addition to static
and shared libraries which were already supported which requires
changing the type of the argument from boolean to an enum.

Differential Revision: https://reviews.llvm.org/D56044

llvm-svn: 355891
This commit is contained in:
Petr Hosek 2019-03-12 02:12:48 +00:00
parent e8475f78e2
commit 930d46a2ef
6 changed files with 47 additions and 20 deletions

View File

@ -104,6 +104,8 @@ public:
RM_Disabled,
};
enum FileType { FT_Object, FT_Static, FT_Shared };
private:
friend class RegisterEffectiveTriple;
@ -371,11 +373,11 @@ public:
virtual std::string getCompilerRT(const llvm::opt::ArgList &Args,
StringRef Component,
bool Shared = false) const;
FileType Type = ToolChain::FT_Static) const;
const char *getCompilerRTArgString(const llvm::opt::ArgList &Args,
StringRef Component,
bool Shared = false) const;
const char *
getCompilerRTArgString(const llvm::opt::ArgList &Args, StringRef Component,
FileType Type = ToolChain::FT_Static) const;
// Returns <ResourceDir>/lib/<OSName>/<arch>. This is used by runtimes (such
// as OpenMP) to find arch-specific libraries.

View File

@ -362,16 +362,27 @@ std::string ToolChain::getCompilerRTPath() const {
}
std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
bool Shared) const {
FileType Type) const {
const llvm::Triple &TT = getTriple();
bool IsITANMSVCWindows =
TT.isWindowsMSVCEnvironment() || TT.isWindowsItaniumEnvironment();
const char *Prefix = IsITANMSVCWindows ? "" : "lib";
const char *Suffix = Shared ? (Triple.isOSWindows() ? ".lib" : ".so")
: (IsITANMSVCWindows ? ".lib" : ".a");
if (Shared && Triple.isWindowsGNUEnvironment())
Suffix = ".dll.a";
const char *Prefix =
IsITANMSVCWindows || Type == ToolChain::FT_Object ? "" : "lib";
const char *Suffix;
switch (Type) {
case ToolChain::FT_Object:
Suffix = IsITANMSVCWindows ? ".obj" : ".o";
break;
case ToolChain::FT_Static:
Suffix = IsITANMSVCWindows ? ".lib" : ".a";
break;
case ToolChain::FT_Shared:
Suffix = Triple.isOSWindows()
? (Triple.isWindowsGNUEnvironment() ? ".dll.a" : ".lib")
: ".so";
break;
}
for (const auto &LibPath : getLibraryPaths()) {
SmallString<128> P(LibPath);
@ -390,8 +401,8 @@ std::string ToolChain::getCompilerRT(const ArgList &Args, StringRef Component,
const char *ToolChain::getCompilerRTArgString(const llvm::opt::ArgList &Args,
StringRef Component,
bool Shared) const {
return Args.MakeArgString(getCompilerRT(Args, Component, Shared));
FileType Type) const {
return Args.MakeArgString(getCompilerRT(Args, Component, Type));
}
std::string ToolChain::getArchSpecificLibPath() const {

View File

@ -535,7 +535,8 @@ static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
// Wrap any static runtimes that must be forced into executable in
// whole-archive.
if (IsWhole) CmdArgs.push_back("--whole-archive");
CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
CmdArgs.push_back(TC.getCompilerRTArgString(
Args, Sanitizer, IsShared ? ToolChain::FT_Shared : ToolChain::FT_Static));
if (IsWhole) CmdArgs.push_back("--no-whole-archive");
if (IsShared) {

View File

@ -248,8 +248,8 @@ void tools::MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
if (Sanitize.needsAsanRt()) {
// MinGW always links against a shared MSVCRT.
CmdArgs.push_back(
TC.getCompilerRTArgString(Args, "asan_dynamic", true));
CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dynamic",
ToolChain::FT_Shared));
CmdArgs.push_back(
TC.getCompilerRTArgString(Args, "asan_dynamic_runtime_thunk"));
CmdArgs.push_back(Args.MakeArgString("--require-defined"));

View File

@ -118,11 +118,23 @@ void MipsLLVMToolChain::AddCXXStdlibLibArgs(const ArgList &Args,
std::string MipsLLVMToolChain::getCompilerRT(const ArgList &Args,
StringRef Component,
bool Shared) const {
FileType Type) const {
SmallString<128> Path(getDriver().ResourceDir);
llvm::sys::path::append(Path, SelectedMultilib.osSuffix(), "lib" + LibSuffix,
getOS());
llvm::sys::path::append(Path, Twine("libclang_rt." + Component + "-" +
"mips" + (Shared ? ".so" : ".a")));
const char *Suffix;
switch (Type) {
case ToolChain::FT_Object:
Suffix = ".o";
break;
case ToolChain::FT_Static:
Suffix = ".a";
break;
case ToolChain::FT_Shared:
Suffix = ".so";
break;
}
llvm::sys::path::append(
Path, Twine("libclang_rt." + Component + "-" + "mips" + Suffix));
return Path.str();
}

View File

@ -37,8 +37,9 @@ public:
void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
llvm::opt::ArgStringList &CmdArgs) const override;
std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
bool Shared = false) const override;
std::string
getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
FileType Type = ToolChain::FT_Static) const override;
std::string computeSysRoot() const override;