diff options
Diffstat (limited to 'clang/lib/Driver')
-rw-r--r-- | clang/lib/Driver/Driver.cpp | 3 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains.cpp | 13 | ||||
-rw-r--r-- | clang/lib/Driver/ToolChains.h | 8 | ||||
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 205 | ||||
-rw-r--r-- | clang/lib/Driver/Tools.h | 18 |
5 files changed, 17 insertions, 230 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 7ef19ce60fa..a18312a84fa 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -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); diff --git a/clang/lib/Driver/ToolChains.cpp b/clang/lib/Driver/ToolChains.cpp index 4efc9a10782..d02c84d315b 100644 --- a/clang/lib/Driver/ToolChains.cpp +++ b/clang/lib/Driver/ToolChains.cpp @@ -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, diff --git a/clang/lib/Driver/ToolChains.h b/clang/lib/Driver/ToolChains.h index 66d7eef53ad..8931aec7899 100644 --- a/clang/lib/Driver/ToolChains.h +++ b/clang/lib/Driver/ToolChains.h @@ -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: diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 24d4bf90a9b..2955489b1e3 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -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, diff --git a/clang/lib/Driver/Tools.h b/clang/lib/Driver/Tools.h index 708715e4fd1..c4e6d6c8298 100644 --- a/clang/lib/Driver/Tools.h +++ b/clang/lib/Driver/Tools.h @@ -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 { |