Revert r211866, r211895 and r211995, "Driver: use GNU::Link for the Generic_GCC toolchain". It broke users of Generic_GCC, cygwin and mingw32.

It reverts commits as follows:
  r211866: "Driver: use GNU::Link for the Generic_GCC toolchain"
  r211895: "Replace GetProgramPath("ld") with GetLinkerPath()."
  r211995: "Driver: add a cygwin linker tool"

llvm-svn: 211998
This commit is contained in:
NAKAMURA Takumi 2014-06-29 16:00:11 +00:00
parent 6189422f08
commit 557fb62e80
9 changed files with 21 additions and 283 deletions

View File

@ -1019,7 +1019,6 @@ def masm_EQ : Joined<["-"], "masm=">, Group<m_Group>, Flags<[DriverOption]>;
def mcmodel_EQ : Joined<["-"], "mcmodel=">, Group<m_Group>;
def mconstant_cfstrings : Flag<["-"], "mconstant-cfstrings">, Group<clang_ignored_m_Group>;
def mcpu_EQ : Joined<["-"], "mcpu=">, Group<m_Group>;
def mdll : Joined<["-"], "mdll">, Group<m_Group>, Flags<[DriverOption]>;
def mdynamic_no_pic : Joined<["-"], "mdynamic-no-pic">, Group<m_Group>;
def mfix_and_continue : Flag<["-"], "mfix-and-continue">, Group<clang_ignored_m_Group>;
def mieee_fp : Flag<["-"], "mieee-fp">, Group<clang_ignored_m_Group>;

View File

@ -2023,9 +2023,6 @@ const ToolChain &Driver::getToolChain(const ArgList &Args,
else
TC = new toolchains::Generic_GCC(*this, Target, Args);
break;
case llvm::Triple::Cygnus:
TC = new toolchains::Cygwin(*this, Target, Args);
break;
case llvm::Triple::MSVC:
case llvm::Triple::UnknownEnvironment:
TC = new toolchains::Windows(*this, Target, Args);

View File

@ -2102,7 +2102,7 @@ Tool *Generic_GCC::buildAssembler() const {
}
Tool *Generic_GCC::buildLinker() const {
return new tools::gnutools::Link(*this);
return new tools::gcc::Link(*this);
}
void Generic_GCC::printVerboseInfo(raw_ostream &OS) const {
@ -3476,17 +3476,6 @@ Tool *DragonFly::buildLinker() const {
return new tools::dragonfly::Link(*this);
}
/// Cygwin toolchain
Cygwin::Cygwin(const Driver &D, const llvm::Triple &Triple,
const llvm::opt::ArgList &Args)
: Generic_GCC(D, Triple, Args) {
ToolChain::path_list &LibPaths = getFilePaths();
LibPaths.push_back("/usr/lib");
}
Tool *Cygwin::buildLinker() const {
return new tools::cygwin::Link(*this);
}
/// XCore tool chain
XCore::XCore(const Driver &D, const llvm::Triple &Triple,

View File

@ -744,14 +744,6 @@ protected:
Tool *buildAssembler() const override;
};
class LLVM_LIBRARY_VISIBILITY Cygwin : public Generic_GCC {
public:
Cygwin(const Driver &D, const llvm::Triple &Triple,
const llvm::opt::ArgList &Args);
protected:
Tool *buildLinker() const override;
};
class LLVM_LIBRARY_VISIBILITY XCore : public ToolChain {
public:

View File

@ -7060,13 +7060,11 @@ void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfoList &Inputs,
const ArgList &Args,
const char *LinkingOutput) const {
const toolchains::Linux& LinuxToolChain =
const toolchains::Linux& ToolChain =
static_cast<const toolchains::Linux&>(getToolChain());
const auto &ToolChain = getToolChain();
const Driver &D = ToolChain.getDriver();
const llvm::Triple &TT = ToolChain.getTriple();
const bool isAndroid = TT.getEnvironment() == llvm::Triple::Android;
const bool IsLinux = TT.isOSLinux();
const bool isAndroid =
ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
const bool IsPIE =
!Args.hasArg(options::OPT_shared) &&
!Args.hasArg(options::OPT_static) &&
@ -7098,9 +7096,8 @@ void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
if (Args.hasArg(options::OPT_s))
CmdArgs.push_back("-s");
if (IsLinux)
for (const auto &Opt : LinuxToolChain.ExtraOpts)
CmdArgs.push_back(Opt.c_str());
for (const auto &Opt : ToolChain.ExtraOpts)
CmdArgs.push_back(Opt.c_str());
if (!Args.hasArg(options::OPT_static)) {
CmdArgs.push_back("--eh-frame-hdr");
@ -7167,17 +7164,16 @@ void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
}
}
if (IsLinux)
if (ToolChain.getArch() == llvm::Triple::arm ||
ToolChain.getArch() == llvm::Triple::armeb ||
ToolChain.getArch() == llvm::Triple::thumb ||
ToolChain.getArch() == llvm::Triple::thumbeb ||
(!Args.hasArg(options::OPT_static) &&
!Args.hasArg(options::OPT_shared))) {
CmdArgs.push_back("-dynamic-linker");
CmdArgs.push_back(Args.MakeArgString(
D.DyldPrefix + getLinuxDynamicLinker(Args, LinuxToolChain)));
}
if (ToolChain.getArch() == llvm::Triple::arm ||
ToolChain.getArch() == llvm::Triple::armeb ||
ToolChain.getArch() == llvm::Triple::thumb ||
ToolChain.getArch() == llvm::Triple::thumbeb ||
(!Args.hasArg(options::OPT_static) &&
!Args.hasArg(options::OPT_shared))) {
CmdArgs.push_back("-dynamic-linker");
CmdArgs.push_back(Args.MakeArgString(
D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
}
CmdArgs.push_back("-o");
CmdArgs.push_back(Output.getFilename());
@ -7309,176 +7305,7 @@ void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
}
}
const char *Exec =
IsLinux ? LinuxToolChain.Linker.c_str()
: Args.MakeArgString(ToolChain.GetLinkerPath());
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
}
void cygwin::Link::AddLibGCC(const ArgList &Args, ArgStringList &CmdArgs) const {
if (Args.hasArg(options::OPT_static) ||
Args.hasArg(options::OPT_static_libgcc)) {
CmdArgs.push_back("-lgcc");
CmdArgs.push_back("-lgcc_eh");
} else {
CmdArgs.push_back("-lgcc_s");
CmdArgs.push_back("-lgcc");
}
}
void cygwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output,
const InputInfoList &Inputs,
const llvm::opt::ArgList &Args,
const char *LinkingOutput) const {
static const char *WrappedSymbols[] = {
"_Znwj",
"_Znaj",
"_ZdlPv",
"_ZdaPv",
"_ZnwjRKSt9nothrow_t",
"_ZnajRKSt9nothrow_t",
"_ZdlPvRKSt9nothrow_t",
"_ZdaPvRKSt9nothrow_t",
};
const auto &ToolChain = getToolChain();
ArgStringList CmdArgs;
// Silence warning for "clang -g foo.o -o foo"
Args.ClaimAllArgs(options::OPT_g_Group);
// and "clang -emit-llvm foo.o -o foo"
Args.ClaimAllArgs(options::OPT_emit_llvm);
// and for "clang -w foo.o -o foo". Other warning options are already
// handled somewhere else.
Args.ClaimAllArgs(options::OPT_w);
// FIXME: -mwindows should pass --subsystem windows
// FIXME: -mconsole should pass --subsystem console
// FIXME: this can be disabled via -mno-use-libstdc-wrappers
for (const auto &Symbol : WrappedSymbols) {
CmdArgs.push_back("--wrap");
CmdArgs.push_back(Symbol);
}
if (Args.hasArg(options::OPT_shared))
CmdArgs.push_back("--shared");
else if (Args.hasArg(options::OPT_mdll))
CmdArgs.push_back("--dll");
if (Args.hasArg(options::OPT_static))
CmdArgs.push_back("-Bstatic");
else
CmdArgs.push_back("-Bdynamic");
if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
CmdArgs.push_back("--enable-auto-image-base");
CmdArgs.push_back("-e");
CmdArgs.push_back("__cygwin_dll_entry@12");
}
CmdArgs.push_back("--dll-search-prefix=cyg");
if (Args.hasArg(options::OPT_rdynamic))
CmdArgs.push_back("--export-all-symbols");
if (!Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_mdll)) {
CmdArgs.push_back("--large-address-aware");
CmdArgs.push_back("--tsaware");
}
if (Args.hasArg(options::OPT_pie))
CmdArgs.push_back("-pie");
AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Args.AddAllArgs(CmdArgs, options::OPT_e);
// FIXME: add -N, -n flags
Args.AddLastArg(CmdArgs, options::OPT_r);
Args.AddLastArg(CmdArgs, options::OPT_s);
Args.AddLastArg(CmdArgs, options::OPT_t);
Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
if (!Args.hasArg(options::OPT_nostdlib) &&
!Args.hasArg(options::OPT_nostartfiles)) {
if (!Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_mdll)) {
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
if (Args.hasArg(options::OPT_pg))
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("gcrt0.o")));
}
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
}
Args.AddAllArgs(CmdArgs, options::OPT_L);
// FIXME: support mudflap: wrap the following:
// -fmudflap || -fmudflapth:
// static const char *WrappedStaticSymbols[] = {
// "malloc", "free", "calloc", "realloc", "mmap", "mmap64", "munmap",
// "alloca",
// };
// -fmudflapth:
// static const char *WrappedStaticSymbols[] = {
// "pthread_create",
// };
// -fmudflap || -fmudflapth:
// static const char *WrappedSymbols[] = {
// "main",
// };
for (const auto &Path : ToolChain.getFilePaths())
CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
CmdArgs.push_back("-o");
CmdArgs.push_back(Output.getFilename());
// FIXME: support -freopen, -ftree-parallelize-loops=*
// FIXME: support itm (-fgnu-tm)
// FIXME: support mudflap (-fmudflap || -fmudflapth) ? -export-dynamic : ""
if (Args.hasArg(options::OPT_fsplit_stack))
CmdArgs.push_back("--wrap=pthread_create");
if (Args.hasArg(options::OPT_fprofile_arcs) ||
Args.hasArg(options::OPT_fprofile_generate) ||
Args.hasArg(options::OPT_coverage))
CmdArgs.push_back("-lgcov");
if (!Args.hasArg(options::OPT_nostdlib)) {
if (!Args.hasArg(options::OPT_nodefaultlibs)) {
// FIXME: support asan, tsan
if (Args.hasArg(options::OPT_fstack_protector) ||
Args.hasArg(options::OPT_fstack_protector_all)) {
CmdArgs.push_back("-lssp_nonshared");
CmdArgs.push_back("-lssp");
}
AddLibGCC(Args, CmdArgs);
if (Args.hasArg(options::OPT_pg))
CmdArgs.push_back("-lgmon");
CmdArgs.push_back("-lcygwin");
// FIXME: -mwindows: -lgdi32 -lcomdlg32
CmdArgs.push_back("-ladvapi32");
CmdArgs.push_back("-lshell32");
CmdArgs.push_back("-luser32");
CmdArgs.push_back("-lkernel32");
AddLibGCC(Args, CmdArgs);
}
if (!Args.hasArg(options::OPT_nostartfiles)) {
ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
}
}
Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
C.addCommand(new Command(JA, *this, Exec, CmdArgs));
C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
}
void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,

View File

@ -457,24 +457,6 @@ namespace gnutools {
const char *LinkingOutput) const override;
};
}
namespace cygwin {
class LLVM_LIBRARY_VISIBILITY Link : public Tool {
public:
Link(const ToolChain &TC) : Tool("cygwin::Link", "linker", TC) {}
bool hasIntegratedCPP() const override { return false; }
bool isLinkJob() const override { return true; }
void ConstructJob(Compilation &C, const JobAction &JA,
const InputInfo &Output, const InputInfoList &Inputs,
const llvm::opt::ArgList &Args,
const char *LinkingOutput) const override;
private:
void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
};
}
/// minix -- Directly call GNU Binutils assembler and linker
namespace minix {
class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {

View File

@ -2,7 +2,7 @@
// RUN: %clang -target i386-unknown-unknown -ccc-print-bindings -no-integrated-as %s 2>&1 | FileCheck %s --check-prefix=CHECK01
// CHECK01: "clang", inputs: ["{{.*}}bindings.c"], output: "{{.*}}.s"
// CHECK01: "GNU::Assemble", inputs: ["{{.*}}.s"], output: "{{.*}}.o"
// CHECK01: "GNU::Link", inputs: ["{{.*}}.o"], output: "a.out"
// CHECK01: "gcc::Link", inputs: ["{{.*}}.o"], output: "a.out"
// Clang control options

View File

@ -1,48 +0,0 @@
// RUN: %clang -### -target i686-windows-cygnus %s 2>&1 \
// RUN: | FileCheck %s -check-prefix CHECK-EXE -check-prefix CHECK
// RUN: %clang -shared -### -target i686-windows-cygnus %s 2>&1 \
// RUN: | FileCheck %s -check-prefix CHECK-SHARED -check-prefix CHECK
// RUN: %clang -static -### -target i686-windows-cygnus %s 2>&1 \
// RUN: | FileCheck %s -check-prefix CHECK-STATIC -check-prefix CHECK
// CHECK: "{{.*}}ld"
// CHECK: "--wrap" "_Znwj"
// CHECK: "--wrap" "_Znaj"
// CHECK: "--wrap" "_ZdlPv"
// CHECK: "--wrap" "_ZdaPv"
// CHECK: "--wrap" "_ZnwjRKSt9nothrow_t"
// CHECK: "--wrap" "_ZnajRKSt9nothrow_t"
// CHECK: "--wrap" "_ZdlPvRKSt9nothrow_t"
// CHECK: "--wrap" "_ZdaPvRKSt9nothrow_t"
// CHECK-SHARED: "--shared"
// CHECK-STATIC: "-Bstatic"
// CHECK-DYNAMIC: "-Bdynamic"
// CHECK-EXE: "-Bdynamic"
// CHECK-SHARED: "--enable-auto-image-base"
// CHECK-SHARED: "-e" "__cygwin_dll_entry@12"
// CHECK: "--dll-search-prefix=cyg"
// CHECK-EXE: "--large-address-aware"
// CHECK-STATIC: "--large-address-aware"
// CHECK-EXE: "--tsaware"
// CHECK-STATIC: "--tsaware"
// CHECK: .o"
// CHECK-EXE: crt0.o"
// CHECK-STATIC: crt0.o"
// CHECK: crtbegin.o"
// CHECK: "-L/usr/lib"
// CHECK: "-o"
// CHECK-EXE: "-lgcc_s"
// CHECK: "-lgcc"
// CHECK-STATIC: "-lgcc_eh"
// CHECK: "-lcygwin"
// CHECK: "-ladvapi32"
// CHECK: "-lshell32"
// CHECK: "-luser32"
// CHECK: "-lkernel32"
// CHECK-EXE: "-lgcc_s"
// CHECK: "-lgcc"
// CHECK-STATIC: "-lgcc_eh"
// CHECK: crtend.o"

View File

@ -17,14 +17,14 @@
// CHECK: as{{[^"]*}}"
// CHECK: "-o" "{{[^"]+}}.o"
//
// gnu-ld
// CHECK: ld{{[^"]*}}"
// gcc-ld
// CHECK: gcc{{[^"]*}}"
// CHECK-NOT: "-mlinker-version=10"
// CHECK-NOT: "-Xclang"
// CHECK-NOT: "foo-bar"
// CHECK-NOT: "-Wall"
// CHECK-NOT: "-Wdocumentation"
// CHECK-NOT: "-march"
// CHECK: -march
// CHECK-NOT: "-mlinker-version=10"
// CHECK-NOT: "-Xclang"
// CHECK-NOT: "foo-bar"