forked from OSchip/llvm-project
parent
a2630db16a
commit
e6dcfaf127
|
@ -20,6 +20,8 @@ def err_drv_unknown_stdin_type : Error<
|
|||
def err_drv_unknown_language : Error<"language not recognized: '%0'">;
|
||||
def err_drv_invalid_arch_name : Error<
|
||||
"invalid arch name '%0'">;
|
||||
def err_drv_invalid_linker_name : Error<
|
||||
"invalid linker name in argument '%0'">;
|
||||
def err_drv_invalid_rtlib_name : Error<
|
||||
"invalid runtime library name in argument '%0'">;
|
||||
def err_drv_unsupported_rtlib_for_platform : Error<
|
||||
|
|
|
@ -1434,7 +1434,8 @@ def fprofile_dir : Joined<["-"], "fprofile-dir=">, Group<clang_ignored_f_Group>;
|
|||
|
||||
defm profile_use : BooleanFFlag<"profile-use">, Group<clang_ignored_f_Group>;
|
||||
def fprofile_use_EQ : Joined<["-"], "fprofile-use=">, Group<clang_ignored_f_Group>;
|
||||
def fuse_ld_EQ : Joined<["-"], "fuse-ld=">, Group<clang_ignored_f_Group>;
|
||||
def fuse_ld_EQ : Joined<["-", "--"], "fuse-ld=">, Group<f_Group>,
|
||||
HelpText<"The suffix of the linker to use (e.g. bfd for ld.bfd).">;
|
||||
|
||||
defm align_functions : BooleanFFlag<"align-functions">, Group<clang_ignored_f_Group>;
|
||||
def falign_functions_EQ : Joined<["-"], "falign-functions=">, Group<clang_ignored_f_Group>;
|
||||
|
|
|
@ -126,6 +126,9 @@ public:
|
|||
|
||||
path_list &getProgramPaths() { return ProgramPaths; }
|
||||
const path_list &getProgramPaths() const { return ProgramPaths; }
|
||||
/// Returns the linker path, respecting the -fuse-ld= argument to determine
|
||||
/// the linker suffix or name.
|
||||
std::string GetLinkerPath() const;
|
||||
|
||||
const SanitizerArgs& getSanitizerArgs() const;
|
||||
|
||||
|
|
|
@ -146,6 +146,28 @@ std::string ToolChain::GetProgramPath(const char *Name) const {
|
|||
return D.GetProgramPath(Name, *this);
|
||||
}
|
||||
|
||||
std::string ToolChain::GetLinkerPath() const {
|
||||
if (Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
|
||||
StringRef Value = A->getValue();
|
||||
// If we're passed -fuse-ld= with no argument, or with the argument ld,
|
||||
// then use whatever the default system linker is.
|
||||
if (Value.empty() || Value == "ld")
|
||||
return GetProgramPath("ld");
|
||||
std::string LinkerName = Value.str();
|
||||
std::string LD("ld.");
|
||||
LD += LinkerName;
|
||||
std::string LinkerPath = GetProgramPath(LD.c_str());
|
||||
bool Exists;
|
||||
if (!llvm::sys::fs::exists(LinkerPath, Exists) && Exists)
|
||||
return LinkerPath;
|
||||
getDriver().Diag(diag::err_drv_invalid_linker_name)
|
||||
<< A->getAsString(Args);
|
||||
return "";
|
||||
}
|
||||
return GetProgramPath("ld");
|
||||
}
|
||||
|
||||
|
||||
types::ID ToolChain::LookupTypeForExtension(const char *Ext) const {
|
||||
return types::lookupTypeForExtension(Ext);
|
||||
}
|
||||
|
|
|
@ -5184,7 +5184,7 @@ void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
|
||||
|
||||
const char *Exec =
|
||||
Args.MakeArgString(getToolChain().GetProgramPath("ld"));
|
||||
Args.MakeArgString(getToolChain().GetLinkerPath());
|
||||
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
|
||||
}
|
||||
|
||||
|
@ -5296,7 +5296,7 @@ void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
|
||||
|
||||
const char *Exec =
|
||||
Args.MakeArgString(getToolChain().GetProgramPath("ld"));
|
||||
Args.MakeArgString(getToolChain().GetLinkerPath());
|
||||
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
|
||||
}
|
||||
|
||||
|
@ -5447,7 +5447,7 @@ void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
}
|
||||
|
||||
const char *Exec =
|
||||
Args.MakeArgString(getToolChain().GetProgramPath("ld"));
|
||||
Args.MakeArgString(getToolChain().GetLinkerPath());
|
||||
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
|
||||
}
|
||||
|
||||
|
@ -5587,7 +5587,7 @@ void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
}
|
||||
|
||||
const char *Exec =
|
||||
Args.MakeArgString(getToolChain().GetProgramPath("ld"));
|
||||
Args.MakeArgString(getToolChain().GetLinkerPath());
|
||||
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
|
||||
}
|
||||
|
||||
|
@ -5838,7 +5838,7 @@ void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
addProfileRT(ToolChain, Args, CmdArgs, ToolChain.getTriple());
|
||||
|
||||
const char *Exec =
|
||||
Args.MakeArgString(ToolChain.GetProgramPath("ld"));
|
||||
Args.MakeArgString(getToolChain().GetLinkerPath());
|
||||
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
|
||||
}
|
||||
|
||||
|
@ -5992,7 +5992,7 @@ void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
|
||||
addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
|
||||
|
||||
const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
|
||||
const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
|
||||
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
|
||||
}
|
||||
|
||||
|
@ -6503,7 +6503,7 @@ void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
|
||||
}
|
||||
|
||||
const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
|
||||
const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
|
||||
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
|
||||
}
|
||||
|
||||
|
@ -6687,7 +6687,7 @@ void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
addProfileRT(getToolChain(), Args, CmdArgs, getToolChain().getTriple());
|
||||
|
||||
const char *Exec =
|
||||
Args.MakeArgString(getToolChain().GetProgramPath("ld"));
|
||||
Args.MakeArgString(getToolChain().GetLinkerPath());
|
||||
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
// RUN: %clang %s -### 2>&1 | FileCheck %s
|
||||
// CHECK: ld
|
||||
// RUN: %clang -fuse-ld=bfd --sysroot=%S/Inputs/basic_freebsd_tree \
|
||||
// RUN: -B%S/Inputs/basic_freebsd_tree %s -### 2>&1 | \
|
||||
// RUN: FileCheck -check-prefix=CHECK-BFD %s
|
||||
// CHECK-BFD: ld.bfd
|
||||
// RUN: %clang -fuse-ld=gold --sysroot=%S/Inputs/basic_freebsd_tree \
|
||||
// RUN: -B%S/Inputs/basic_freebsd_tree %s -### 2>&1 | \
|
||||
// RUN: FileCheck -check-prefix=CHECK-GOLD %s
|
||||
// CHECK-GOLD: ld.gold
|
||||
// RUN: %clang -fuse-ld=plib --sysroot=%S/Inputs/basic_freebsd_tree \
|
||||
// RUN: -B%S/Inputs/basic_freebsd_tree %s -### 2>&1 | \
|
||||
// RUN: FileCheck -check-prefix=CHECK-PLIB %s
|
||||
// CHECK-PLIB: error: invalid linker name
|
Loading…
Reference in New Issue