//===--- Tools.cpp - Tools Implementations ------------------------------*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "Tools.h" #include "clang/Driver/Arg.h" #include "clang/Driver/ArgList.h" #include "clang/Driver/Compilation.h" #include "clang/Driver/Job.h" #include "clang/Driver/HostInfo.h" #include "clang/Driver/Option.h" #include "clang/Driver/ToolChain.h" #include "clang/Driver/Util.h" #include "llvm/ADT/SmallVector.h" #include "InputInfo.h" using namespace clang::driver; using namespace clang::driver::tools; void Clang::ConstructJob(Compilation &C, const JobAction &JA, Job &Dest, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &TCArgs, const char *LinkingOutput) const { ArgStringList CmdArgs; for (InputInfoList::const_iterator it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { const InputInfo &II = *it; if (II.isPipe()) CmdArgs.push_back("-"); else CmdArgs.push_back(II.getInputFilename()); } if (Output.isPipe()) { CmdArgs.push_back("-o"); CmdArgs.push_back("-"); } else if (const char *N = Output.getInputFilename()) { CmdArgs.push_back("-o"); CmdArgs.push_back(N); } Dest.addCommand(new Command("clang", CmdArgs)); } void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA, Job &Dest, const InputInfo &Output, const InputInfoList &Inputs, const ArgList &TCArgs, const char *LinkingOutput) const { ArgStringList CmdArgs; for (ArgList::const_iterator it = TCArgs.begin(), ie = TCArgs.end(); it != ie; ++it) { Arg *A = *it; if (A->getOption().hasForwardToGCC()) A->render(TCArgs, CmdArgs); } RenderExtraToolArgs(CmdArgs); // If using a driver driver, force the arch. if (getToolChain().getHost().useDriverDriver()) { CmdArgs.push_back("-arch"); CmdArgs.push_back(getToolChain().getArchName().c_str()); } if (Output.isPipe()) { CmdArgs.push_back("-o"); CmdArgs.push_back("-"); } else if (const char *N = Output.getInputFilename()) { CmdArgs.push_back("-o"); CmdArgs.push_back(N); } else CmdArgs.push_back("-fsyntax-only"); // Only pass -x if gcc will understand it; otherwise hope gcc // understands the suffix correctly. The main use case this would go // wrong in is for linker inputs if they happened to have an odd // suffix; really the only way to get this to happen is a command // like '-x foobar a.c' which will treat a.c like a linker input. // // FIXME: For the linker case specifically, can we safely convert // inputs into '-Wl,' options? for (InputInfoList::const_iterator it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) { const InputInfo &II = *it; if (types::canTypeBeUserSpecified(II.getType())) { CmdArgs.push_back("-x"); CmdArgs.push_back(types::getTypeName(II.getType())); } if (II.isPipe()) CmdArgs.push_back("-"); else // FIXME: Linker inputs CmdArgs.push_back(II.getInputFilename()); } Dest.addCommand(new Command("gcc", CmdArgs)); } void gcc::Preprocess::RenderExtraToolArgs(ArgStringList &CmdArgs) const { CmdArgs.push_back("-E"); } void gcc::Precompile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { // The type is good enough. } void gcc::Compile::RenderExtraToolArgs(ArgStringList &CmdArgs) const { CmdArgs.push_back("-S"); } void gcc::Assemble::RenderExtraToolArgs(ArgStringList &CmdArgs) const { CmdArgs.push_back("-c"); } void gcc::Link::RenderExtraToolArgs(ArgStringList &CmdArgs) const { // The types are (hopefully) good enough. }