|  | //===--- Minix.cpp - Minix ToolChain Implementations ------------*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "Minix.h" | 
|  | #include "InputInfo.h" | 
|  | #include "CommonArgs.h" | 
|  | #include "clang/Basic/VirtualFileSystem.h" | 
|  | #include "clang/Driver/Compilation.h" | 
|  | #include "clang/Driver/Driver.h" | 
|  | #include "clang/Driver/Options.h" | 
|  | #include "llvm/Option/ArgList.h" | 
|  |  | 
|  | using namespace clang::driver; | 
|  | using namespace clang; | 
|  | using namespace llvm::opt; | 
|  |  | 
|  | void tools::minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | const InputInfo &Output, | 
|  | const InputInfoList &Inputs, | 
|  | const ArgList &Args, | 
|  | const char *LinkingOutput) const { | 
|  | claimNoWarnArgs(Args); | 
|  | ArgStringList CmdArgs; | 
|  |  | 
|  | Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler); | 
|  |  | 
|  | CmdArgs.push_back("-o"); | 
|  | CmdArgs.push_back(Output.getFilename()); | 
|  |  | 
|  | for (const auto &II : Inputs) | 
|  | CmdArgs.push_back(II.getFilename()); | 
|  |  | 
|  | const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as")); | 
|  | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
|  | } | 
|  |  | 
|  | void tools::minix::Linker::ConstructJob(Compilation &C, const JobAction &JA, | 
|  | const InputInfo &Output, | 
|  | const InputInfoList &Inputs, | 
|  | const ArgList &Args, | 
|  | const char *LinkingOutput) const { | 
|  | const Driver &D = getToolChain().getDriver(); | 
|  | ArgStringList CmdArgs; | 
|  |  | 
|  | if (Output.isFilename()) { | 
|  | CmdArgs.push_back("-o"); | 
|  | CmdArgs.push_back(Output.getFilename()); | 
|  | } else { | 
|  | assert(Output.isNothing() && "Invalid output."); | 
|  | } | 
|  |  | 
|  | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
|  | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); | 
|  | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); | 
|  | CmdArgs.push_back( | 
|  | Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); | 
|  | CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o"))); | 
|  | } | 
|  |  | 
|  | Args.AddAllArgs(CmdArgs, | 
|  | {options::OPT_L, options::OPT_T_Group, options::OPT_e}); | 
|  |  | 
|  | AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs, JA); | 
|  |  | 
|  | getToolChain().addProfileRTLibs(Args, CmdArgs); | 
|  |  | 
|  | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) { | 
|  | if (D.CCCIsCXX()) { | 
|  | getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); | 
|  | CmdArgs.push_back("-lm"); | 
|  | } | 
|  | } | 
|  |  | 
|  | if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) { | 
|  | if (Args.hasArg(options::OPT_pthread)) | 
|  | CmdArgs.push_back("-lpthread"); | 
|  | CmdArgs.push_back("-lc"); | 
|  | CmdArgs.push_back("-lCompilerRT-Generic"); | 
|  | CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib"); | 
|  | CmdArgs.push_back( | 
|  | Args.MakeArgString(getToolChain().GetFilePath("crtend.o"))); | 
|  | } | 
|  |  | 
|  | const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath()); | 
|  | C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs)); | 
|  | } | 
|  |  | 
|  | /// Minix - Minix tool chain which can call as(1) and ld(1) directly. | 
|  |  | 
|  | toolchains::Minix::Minix(const Driver &D, const llvm::Triple &Triple, | 
|  | const ArgList &Args) | 
|  | : Generic_ELF(D, Triple, Args) { | 
|  | getFilePaths().push_back(getDriver().Dir + "/../lib"); | 
|  | getFilePaths().push_back("/usr/lib"); | 
|  | } | 
|  |  | 
|  | Tool *toolchains::Minix::buildAssembler() const { | 
|  | return new tools::minix::Assembler(*this); | 
|  | } | 
|  |  | 
|  | Tool *toolchains::Minix::buildLinker() const { | 
|  | return new tools::minix::Linker(*this); | 
|  | } |