[cfe-commits] r168024 - in /cfe/trunk: include/clang/Driver/Driver.h include/clang/Driver/Types.h lib/Driver/Driver.cpp lib/Driver/ToolChains.cpp lib/Driver/Tools.cpp lib/Driver/Tools.h lib/Driver/Types.cpp lib/Driver/WindowsToolChain.cpp

32bitmicro root at 32bitmicro.com
Mon Nov 19 13:34:35 PST 2012


On 11/15/2012 10:11 PM, Douglas Gregor wrote:
> 
> On Nov 14, 2012, at 9:42 PM, Nick Lewycky <nlewycky at google.com> wrote:
> 
>> Please consider this for the clang 3.2 branch. It's a recent regression that will affect people trying to use clang as a drop-in replacement for gcc (myself, and I imagine the freebsd folks and clang/Debian project).
> 
> Approved.

Committed revision 168330 to 3.2 release branch

> 
> 	- Doug
> 
>> On 14 November 2012 21:36, Nick Lewycky <nicholas at mxc.ca> wrote:
>> Author: nicholas
>> Date: Wed Nov 14 23:36:36 2012
>> New Revision: 168024
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=168024&view=rev
>> Log:
>> Revert r167567, restoring the ability of clang to run gcc in cases where it
>> can't handle the input file type. This resulted in PR14338.
>>
>> Modified:
>>     cfe/trunk/include/clang/Driver/Driver.h
>>     cfe/trunk/include/clang/Driver/Types.h
>>     cfe/trunk/lib/Driver/Driver.cpp
>>     cfe/trunk/lib/Driver/ToolChains.cpp
>>     cfe/trunk/lib/Driver/Tools.cpp
>>     cfe/trunk/lib/Driver/Tools.h
>>     cfe/trunk/lib/Driver/Types.cpp
>>     cfe/trunk/lib/Driver/WindowsToolChain.cpp
>>
>> Modified: cfe/trunk/include/clang/Driver/Driver.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Driver.h?rev=168024&r1=168023&r2=168024&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Driver/Driver.h (original)
>> +++ cfe/trunk/include/clang/Driver/Driver.h Wed Nov 14 23:36:36 2012
>> @@ -363,6 +363,11 @@
>>    /// GCC goes to extra lengths here to be a bit more robust.
>>    std::string GetTemporaryPath(StringRef Prefix, const char *Suffix) const;
>>
>> +  /// ShouldUseClangCompilar - Should the clang compiler be used to
>> +  /// handle this action.
>> +  bool ShouldUseClangCompiler(const Compilation &C, const JobAction &JA,
>> +                              const llvm::Triple &ArchName) const;
>> +
>>    bool IsUsingLTO(const ArgList &Args) const;
>>
>>  private:
>>
>> Modified: cfe/trunk/include/clang/Driver/Types.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Types.h?rev=168024&r1=168023&r2=168024&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Driver/Types.h (original)
>> +++ cfe/trunk/include/clang/Driver/Types.h Wed Nov 14 23:36:36 2012
>> @@ -56,6 +56,9 @@
>>    /// types).
>>    bool canLipoType(ID Id);
>>
>> +  /// isAcceptedByClang - Can clang handle this input type.
>> +  bool isAcceptedByClang(ID Id);
>> +
>>    /// isCXX - Is this a "C++" input (C++ and Obj-C++ sources and headers).
>>    bool isCXX(ID Id);
>>
>>
>> Modified: cfe/trunk/lib/Driver/Driver.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=168024&r1=168023&r2=168024&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/Driver.cpp (original)
>> +++ cfe/trunk/lib/Driver/Driver.cpp Wed Nov 14 23:36:36 2012
>> @@ -1731,6 +1731,22 @@
>>    return *TC;
>>  }
>>
>> +bool Driver::ShouldUseClangCompiler(const Compilation &C, const JobAction &JA,
>> +                                    const llvm::Triple &Triple) const {
>> +  // Check if user requested no clang, or clang doesn't understand this type (we
>> +  // only handle single inputs for now).
>> +  if (JA.size() != 1 ||
>> +      !types::isAcceptedByClang((*JA.begin())->getType()))
>> +    return false;
>> +
>> +  // Otherwise make sure this is an action clang understands.
>> +  if (!isa<PreprocessJobAction>(JA) && !isa<PrecompileJobAction>(JA) &&
>> +      !isa<CompileJobAction>(JA))
>> +    return false;
>> +
>> +  return true;
>> +}
>> +
>>  /// GetReleaseVersion - Parse (([0-9]+)(.([0-9]+)(.([0-9]+)?))?)? and return the
>>  /// grouped values as integers. Numbers which are not provided are set to 0.
>>  ///
>>
>> Modified: cfe/trunk/lib/Driver/ToolChains.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains.cpp?rev=168024&r1=168023&r2=168024&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/ToolChains.cpp (original)
>> +++ cfe/trunk/lib/Driver/ToolChains.cpp Wed Nov 14 23:36:36 2012
>> @@ -177,6 +177,12 @@
>>  Tool &Darwin::SelectTool(const Compilation &C, const JobAction &JA,
>>                           const ActionList &Inputs) const {
>>    Action::ActionClass Key = JA.getKind();
>> +
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple())) {
>> +    // FIXME: This seems like a hacky way to choose clang frontend.
>> +    Key = Action::AnalyzeJobClass;
>> +  }
>> +
>>    bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
>>                                               options::OPT_no_integrated_as,
>>                                               IsIntegratedAssemblerDefault());
>> @@ -188,11 +194,13 @@
>>      case Action::BindArchClass:
>>        llvm_unreachable("Invalid tool kind.");
>>      case Action::PreprocessJobClass:
>> +      T = new tools::darwin::Preprocess(*this); break;
>>      case Action::AnalyzeJobClass:
>>      case Action::MigrateJobClass:
>> +      T = new tools::Clang(*this); break;
>>      case Action::PrecompileJobClass:
>>      case Action::CompileJobClass:
>> -      T = new tools::Clang(*this); break;
>> +      T = new tools::darwin::Compile(*this); break;
>>      case Action::AssembleJobClass: {
>>        if (UseIntegratedAs)
>>          T = new tools::ClangAs(*this);
>> @@ -1326,7 +1334,11 @@
>>  Tool &Generic_GCC::SelectTool(const Compilation &C,
>>                                const JobAction &JA,
>>                                const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>>
>>    Tool *&T = Tools[Key];
>>    if (!T) {
>> @@ -1335,11 +1347,14 @@
>>      case Action::BindArchClass:
>>        llvm_unreachable("Invalid tool kind.");
>>      case Action::PreprocessJobClass:
>> +      T = new tools::gcc::Preprocess(*this); break;
>>      case Action::PrecompileJobClass:
>> +      T = new tools::gcc::Precompile(*this); break;
>>      case Action::AnalyzeJobClass:
>>      case Action::MigrateJobClass:
>> -    case Action::CompileJobClass:
>>        T = new tools::Clang(*this); break;
>> +    case Action::CompileJobClass:
>> +      T = new tools::gcc::Compile(*this); break;
>>      case Action::AssembleJobClass:
>>        T = new tools::gcc::Assemble(*this); break;
>>      case Action::LinkJobClass:
>> @@ -1389,18 +1404,27 @@
>>  Tool &Hexagon_TC::SelectTool(const Compilation &C,
>>                               const JobAction &JA,
>>                               const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  //   if (JA.getKind () == Action::CompileJobClass)
>> +  //     Key = JA.getKind ();
>> +  //     else
>> +
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>> +  //   if ((JA.getKind () == Action::CompileJobClass)
>> +  //     && (JA.getType () != types::TY_LTO_BC)) {
>> +  //     Key = JA.getKind ();
>> +  //   }
>> +
>>    Tool *&T = Tools[Key];
>>    if (!T) {
>>      switch (Key) {
>>      case Action::InputClass:
>>      case Action::BindArchClass:
>>        assert(0 && "Invalid tool kind.");
>> -    case Action::PreprocessJobClass:
>> -    case Action::PrecompileJobClass:
>>      case Action::AnalyzeJobClass:
>> -    case Action::MigrateJobClass:
>> -    case Action::CompileJobClass:
>>        T = new tools::Clang(*this); break;
>>      case Action::AssembleJobClass:
>>        T = new tools::hexagon::Assemble(*this); break;
>> @@ -1484,7 +1508,12 @@
>>
>>  Tool &OpenBSD::SelectTool(const Compilation &C, const JobAction &JA,
>>                            const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>> +
>>    bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
>>                                               options::OPT_no_integrated_as,
>>                                               IsIntegratedAssemblerDefault());
>> @@ -1519,7 +1548,12 @@
>>
>>  Tool &Bitrig::SelectTool(const Compilation &C, const JobAction &JA,
>>                           const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>> +
>>    bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
>>                                               options::OPT_no_integrated_as,
>>                                               IsIntegratedAssemblerDefault());
>> @@ -1606,7 +1640,12 @@
>>
>>  Tool &FreeBSD::SelectTool(const Compilation &C, const JobAction &JA,
>>                            const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>> +
>>    bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
>>                                               options::OPT_no_integrated_as,
>>                                               IsIntegratedAssemblerDefault());
>> @@ -1650,7 +1689,12 @@
>>
>>  Tool &NetBSD::SelectTool(const Compilation &C, const JobAction &JA,
>>                           const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>> +
>>    bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
>>                                               options::OPT_no_integrated_as,
>>                                               IsIntegratedAssemblerDefault());
>> @@ -1685,7 +1729,11 @@
>>
>>  Tool &Minix::SelectTool(const Compilation &C, const JobAction &JA,
>>                          const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>>
>>    Tool *&T = Tools[Key];
>>    if (!T) {
>> @@ -1722,7 +1770,11 @@
>>
>>  Tool &AuroraUX::SelectTool(const Compilation &C, const JobAction &JA,
>>                             const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>>
>>    Tool *&T = Tools[Key];
>>    if (!T) {
>> @@ -1755,7 +1807,11 @@
>>
>>  Tool &Solaris::SelectTool(const Compilation &C, const JobAction &JA,
>>                             const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>>
>>    Tool *&T = Tools[Key];
>>    if (!T) {
>> @@ -2128,7 +2184,12 @@
>>
>>  Tool &Linux::SelectTool(const Compilation &C, const JobAction &JA,
>>                          const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>> +
>>    bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
>>                                               options::OPT_no_integrated_as,
>>                                               IsIntegratedAssemblerDefault());
>> @@ -2346,7 +2407,11 @@
>>
>>  Tool &DragonFly::SelectTool(const Compilation &C, const JobAction &JA,
>>                              const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>>
>>    Tool *&T = Tools[Key];
>>    if (!T) {
>>
>> Modified: cfe/trunk/lib/Driver/Tools.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=168024&r1=168023&r2=168024&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/Tools.cpp (original)
>> +++ cfe/trunk/lib/Driver/Tools.cpp Wed Nov 14 23:36:36 2012
>> @@ -257,7 +257,7 @@
>>                 A->getOption().matches(options::OPT_MM)) {
>>        DepFile = "-";
>>      } else {
>> -      DepFile = getDependencyFileName(Args, Inputs);
>> +      DepFile = darwin::CC1::getDependencyFileName(Args, Inputs);
>>        C.addFailureResultFile(DepFile);
>>      }
>>      CmdArgs.push_back("-dependency-file");
>> @@ -1713,10 +1713,10 @@
>>    // Set the main file name, so that debug info works even with
>>    // -save-temps.
>>    CmdArgs.push_back("-main-file-name");
>> -  CmdArgs.push_back(getBaseInputName(Args, Inputs));
>> +  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
>>
>>    // Some flags which affect the language (via preprocessor
>> -  // defines).
>> +  // defines). See darwin::CC1::AddCPPArgs.
>>    if (Args.hasArg(options::OPT_static))
>>      CmdArgs.push_back("-static-define");
>>
>> @@ -3636,14 +3636,38 @@
>>      .Default(llvm::Triple::UnknownArch);
>>  }
>>
>> -const char *Clang::getBaseInputName(const ArgList &Args,
>> -                                    const InputInfoList &Inputs) {
>> +const char *darwin::CC1::getCC1Name(types::ID Type) const {
>> +  switch (Type) {
>> +  default:
>> +    llvm_unreachable("Unexpected type for Darwin CC1 tool.");
>> +  case types::TY_Asm:
>> +  case types::TY_C: case types::TY_CHeader:
>> +  case types::TY_PP_C: case types::TY_PP_CHeader:
>> +    return "cc1";
>> +  case types::TY_ObjC: case types::TY_ObjCHeader:
>> +  case types::TY_PP_ObjC: case types::TY_PP_ObjC_Alias:
>> +  case types::TY_PP_ObjCHeader:
>> +    return "cc1obj";
>> +  case types::TY_CXX: case types::TY_CXXHeader:
>> +  case types::TY_PP_CXX: case types::TY_PP_CXXHeader:
>> +    return "cc1plus";
>> +  case types::TY_ObjCXX: case types::TY_ObjCXXHeader:
>> +  case types::TY_PP_ObjCXX: case types::TY_PP_ObjCXX_Alias:
>> +  case types::TY_PP_ObjCXXHeader:
>> +    return "cc1objplus";
>> +  }
>> +}
>> +
>> +void darwin::CC1::anchor() {}
>> +
>> +const char *darwin::CC1::getBaseInputName(const ArgList &Args,
>> +                                          const InputInfoList &Inputs) {
>>    return Args.MakeArgString(
>>      llvm::sys::path::filename(Inputs[0].getBaseInput()));
>>  }
>>
>> -const char *Clang::getBaseInputStem(const ArgList &Args,
>> -                                    const InputInfoList &Inputs) {
>> +const char *darwin::CC1::getBaseInputStem(const ArgList &Args,
>> +                                          const InputInfoList &Inputs) {
>>    const char *Str = getBaseInputName(Args, Inputs);
>>
>>    if (const char *End = strrchr(Str, '.'))
>> @@ -3652,8 +3676,9 @@
>>    return Str;
>>  }
>>
>> -const char *Clang::getDependencyFileName(const ArgList &Args,
>> -                                         const InputInfoList &Inputs) {
>> +const char *
>> +darwin::CC1::getDependencyFileName(const ArgList &Args,
>> +                                   const InputInfoList &Inputs) {
>>    // FIXME: Think about this more.
>>    std::string Res;
>>
>> @@ -3661,11 +3686,588 @@
>>      std::string Str(OutputOpt->getValue());
>>      Res = Str.substr(0, Str.rfind('.'));
>>    } else {
>> -    Res = getBaseInputStem(Args, Inputs);
>> +    Res = darwin::CC1::getBaseInputStem(Args, Inputs);
>>    }
>>    return Args.MakeArgString(Res + ".d");
>>  }
>>
>> +void darwin::CC1::RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const {
>> +  for (ArgStringList::iterator it = CmdArgs.begin(), ie = CmdArgs.end();
>> +       it != ie;) {
>> +
>> +    StringRef Option = *it;
>> +    bool RemoveOption = false;
>> +
>> +    // Erase both -fmodule-cache-path and its argument.
>> +    if (Option.equals("-fmodule-cache-path") && it+2 != ie) {
>> +      it = CmdArgs.erase(it, it+2);
>> +      ie = CmdArgs.end();
>> +      continue;
>> +    }
>> +
>> +    // Remove unsupported -f options.
>> +    if (Option.startswith("-f")) {
>> +      // Remove -f/-fno- to reduce the number of cases.
>> +      if (Option.startswith("-fno-"))
>> +        Option = Option.substr(5);
>> +      else
>> +        Option = Option.substr(2);
>> +      RemoveOption = llvm::StringSwitch<bool>(Option)
>> +        .Case("altivec", true)
>> +        .Case("modules", true)
>> +        .Case("diagnostics-show-note-include-stack", true)
>> +        .Default(false);
>> +    }
>> +
>> +    // Handle machine specific options.
>> +    if (Option.startswith("-m")) {
>> +      RemoveOption = llvm::StringSwitch<bool>(Option)
>> +        .Case("-mthumb", true)
>> +        .Case("-mno-thumb", true)
>> +        .Case("-mno-fused-madd", true)
>> +        .Case("-mlong-branch", true)
>> +        .Case("-mlongcall", true)
>> +        .Case("-mcpu=G4", true)
>> +        .Case("-mcpu=G5", true)
>> +        .Default(false);
>> +    }
>> +
>> +    // Handle warning options.
>> +    if (Option.startswith("-W")) {
>> +      // Remove -W/-Wno- to reduce the number of cases.
>> +      if (Option.startswith("-Wno-"))
>> +        Option = Option.substr(5);
>> +      else
>> +        Option = Option.substr(2);
>> +
>> +      RemoveOption = llvm::StringSwitch<bool>(Option)
>> +        .Case("address-of-temporary", true)
>> +        .Case("ambiguous-member-template", true)
>> +        .Case("analyzer-incompatible-plugin", true)
>> +        .Case("array-bounds", true)
>> +        .Case("array-bounds-pointer-arithmetic", true)
>> +        .Case("bind-to-temporary-copy", true)
>> +        .Case("bitwise-op-parentheses", true)
>> +        .Case("bool-conversions", true)
>> +        .Case("builtin-macro-redefined", true)
>> +        .Case("c++-hex-floats", true)
>> +        .Case("c++0x-compat", true)
>> +        .Case("c++0x-extensions", true)
>> +        .Case("c++0x-narrowing", true)
>> +        .Case("c++11-compat", true)
>> +        .Case("c++11-extensions", true)
>> +        .Case("c++11-narrowing", true)
>> +        .Case("conditional-uninitialized", true)
>> +        .Case("constant-conversion", true)
>> +        .Case("conversion-null", true)
>> +        .Case("CFString-literal", true)
>> +        .Case("constant-logical-operand", true)
>> +        .Case("custom-atomic-properties", true)
>> +        .Case("default-arg-special-member", true)
>> +        .Case("delegating-ctor-cycles", true)
>> +        .Case("delete-non-virtual-dtor", true)
>> +        .Case("deprecated-implementations", true)
>> +        .Case("deprecated-writable-strings", true)
>> +        .Case("distributed-object-modifiers", true)
>> +        .Case("duplicate-method-arg", true)
>> +        .Case("dynamic-class-memaccess", true)
>> +        .Case("enum-compare", true)
>> +        .Case("enum-conversion", true)
>> +        .Case("exit-time-destructors", true)
>> +        .Case("gnu", true)
>> +        .Case("gnu-designator", true)
>> +        .Case("header-hygiene", true)
>> +        .Case("idiomatic-parentheses", true)
>> +        .Case("ignored-qualifiers", true)
>> +        .Case("implicit-atomic-properties", true)
>> +        .Case("incompatible-pointer-types", true)
>> +        .Case("incomplete-implementation", true)
>> +        .Case("int-conversion", true)
>> +        .Case("initializer-overrides", true)
>> +        .Case("invalid-noreturn", true)
>> +        .Case("invalid-token-paste", true)
>> +        .Case("language-extension-token", true)
>> +        .Case("literal-conversion", true)
>> +        .Case("literal-range", true)
>> +        .Case("local-type-template-args", true)
>> +        .Case("logical-op-parentheses", true)
>> +        .Case("method-signatures", true)
>> +        .Case("microsoft", true)
>> +        .Case("mismatched-tags", true)
>> +        .Case("missing-method-return-type", true)
>> +        .Case("non-pod-varargs", true)
>> +        .Case("nonfragile-abi2", true)
>> +        .Case("null-arithmetic", true)
>> +        .Case("null-dereference", true)
>> +        .Case("out-of-line-declaration", true)
>> +        .Case("overriding-method-mismatch", true)
>> +        .Case("readonly-setter-attrs", true)
>> +        .Case("return-stack-address", true)
>> +        .Case("self-assign", true)
>> +        .Case("semicolon-before-method-body", true)
>> +        .Case("sentinel", true)
>> +        .Case("shift-overflow", true)
>> +        .Case("shift-sign-overflow", true)
>> +        .Case("sign-conversion", true)
>> +        .Case("sizeof-array-argument", true)
>> +        .Case("sizeof-pointer-memaccess", true)
>> +        .Case("string-compare", true)
>> +        .Case("super-class-method-mismatch", true)
>> +        .Case("tautological-compare", true)
>> +        .Case("typedef-redefinition", true)
>> +        .Case("typename-missing", true)
>> +        .Case("undefined-reinterpret-cast", true)
>> +        .Case("unknown-warning-option", true)
>> +        .Case("unnamed-type-template-args", true)
>> +        .Case("unneeded-internal-declaration", true)
>> +        .Case("unneeded-member-function", true)
>> +        .Case("unused-comparison", true)
>> +        .Case("unused-exception-parameter", true)
>> +        .Case("unused-member-function", true)
>> +        .Case("unused-result", true)
>> +        .Case("vector-conversions", true)
>> +        .Case("vla", true)
>> +        .Case("used-but-marked-unused", true)
>> +        .Case("weak-vtables", true)
>> +        .Default(false);
>> +    } // if (Option.startswith("-W"))
>> +    if (RemoveOption) {
>> +      it = CmdArgs.erase(it);
>> +      ie = CmdArgs.end();
>> +    } else {
>> +      ++it;
>> +    }
>> +  }
>> +}
>> +
>> +void darwin::CC1::AddCC1Args(const ArgList &Args,
>> +                             ArgStringList &CmdArgs) const {
>> +  const Driver &D = getToolChain().getDriver();
>> +
>> +  CheckCodeGenerationOptions(D, Args);
>> +
>> +  // Derived from cc1 spec.
>> +  if ((!Args.hasArg(options::OPT_mkernel) ||
>> +       (getDarwinToolChain().isTargetIPhoneOS() &&
>> +        !getDarwinToolChain().isIPhoneOSVersionLT(6, 0))) &&
>> +      !Args.hasArg(options::OPT_static) &&
>> +      !Args.hasArg(options::OPT_mdynamic_no_pic))
>> +    CmdArgs.push_back("-fPIC");
>> +
>> +  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
>> +      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
>> +    if (!Args.hasArg(options::OPT_fbuiltin_strcat))
>> +      CmdArgs.push_back("-fno-builtin-strcat");
>> +    if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
>> +      CmdArgs.push_back("-fno-builtin-strcpy");
>> +  }
>> +
>> +  if (Args.hasArg(options::OPT_g_Flag) &&
>> +      !Args.hasArg(options::OPT_fno_eliminate_unused_debug_symbols))
>> +    CmdArgs.push_back("-feliminate-unused-debug-symbols");
>> +}
>> +
>> +void darwin::CC1::AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
>> +                                    const InputInfoList &Inputs,
>> +                                    const ArgStringList &OutputArgs) const {
>> +  const Driver &D = getToolChain().getDriver();
>> +
>> +  // Derived from cc1_options spec.
>> +  if (Args.hasArg(options::OPT_fast) ||
>> +      Args.hasArg(options::OPT_fastf) ||
>> +      Args.hasArg(options::OPT_fastcp))
>> +    CmdArgs.push_back("-O3");
>> +
>> +  if (Arg *A = Args.getLastArg(options::OPT_pg))
>> +    if (Args.hasArg(options::OPT_fomit_frame_pointer))
>> +      D.Diag(diag::err_drv_argument_not_allowed_with)
>> +        << A->getAsString(Args) << "-fomit-frame-pointer";
>> +
>> +  AddCC1Args(Args, CmdArgs);
>> +
>> +  if (!Args.hasArg(options::OPT_Q))
>> +    CmdArgs.push_back("-quiet");
>> +
>> +  CmdArgs.push_back("-dumpbase");
>> +  CmdArgs.push_back(darwin::CC1::getBaseInputName(Args, Inputs));
>> +
>> +  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
>> +
>> +  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
>> +  Args.AddAllArgs(CmdArgs, options::OPT_a_Group);
>> +
>> +  // FIXME: The goal is to use the user provided -o if that is our
>> +  // final output, otherwise to drive from the original input
>> +  // name. Find a clean way to go about this.
>> +  if ((Args.hasArg(options::OPT_c) || Args.hasArg(options::OPT_S)) &&
>> +      Args.hasArg(options::OPT_o)) {
>> +    Arg *OutputOpt = Args.getLastArg(options::OPT_o);
>> +    CmdArgs.push_back("-auxbase-strip");
>> +    CmdArgs.push_back(OutputOpt->getValue());
>> +  } else {
>> +    CmdArgs.push_back("-auxbase");
>> +    CmdArgs.push_back(darwin::CC1::getBaseInputStem(Args, Inputs));
>> +  }
>> +
>> +  Args.AddAllArgs(CmdArgs, options::OPT_g_Group);
>> +
>> +  Args.AddAllArgs(CmdArgs, options::OPT_O);
>> +  // FIXME: -Wall is getting some special treatment. Investigate.
>> +  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
>> +  Args.AddLastArg(CmdArgs, options::OPT_w);
>> +  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
>> +                  options::OPT_trigraphs);
>> +  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
>> +    // Honor -std-default.
>> +    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
>> +                              "-std=", /*Joined=*/true);
>> +  }
>> +
>> +  if (Args.hasArg(options::OPT_v))
>> +    CmdArgs.push_back("-version");
>> +  if (Args.hasArg(options::OPT_pg) &&
>> +      getToolChain().SupportsProfiling())
>> +    CmdArgs.push_back("-p");
>> +  Args.AddLastArg(CmdArgs, options::OPT_p);
>> +
>> +  // The driver treats -fsyntax-only specially.
>> +  if (getToolChain().getTriple().getArch() == llvm::Triple::arm ||
>> +      getToolChain().getTriple().getArch() == llvm::Triple::thumb) {
>> +    // Removes -fbuiltin-str{cat,cpy}; these aren't recognized by cc1 but are
>> +    // used to inhibit the default -fno-builtin-str{cat,cpy}.
>> +    //
>> +    // FIXME: Should we grow a better way to deal with "removing" args?
>> +    for (arg_iterator it = Args.filtered_begin(options::OPT_f_Group,
>> +                                               options::OPT_fsyntax_only),
>> +           ie = Args.filtered_end(); it != ie; ++it) {
>> +      if (!(*it)->getOption().matches(options::OPT_fbuiltin_strcat) &&
>> +          !(*it)->getOption().matches(options::OPT_fbuiltin_strcpy)) {
>> +        (*it)->claim();
>> +        (*it)->render(Args, CmdArgs);
>> +      }
>> +    }
>> +  } else
>> +    Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
>> +
>> +  // Claim Clang only -f options, they aren't worth warning about.
>> +  Args.ClaimAllArgs(options::OPT_f_clang_Group);
>> +
>> +  Args.AddAllArgs(CmdArgs, options::OPT_undef);
>> +  if (Args.hasArg(options::OPT_Qn))
>> +    CmdArgs.push_back("-fno-ident");
>> +
>> +  // FIXME: This isn't correct.
>> +  //Args.AddLastArg(CmdArgs, options::OPT__help)
>> +  //Args.AddLastArg(CmdArgs, options::OPT__targetHelp)
>> +
>> +  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
>> +
>> +  // FIXME: Still don't get what is happening here. Investigate.
>> +  Args.AddAllArgs(CmdArgs, options::OPT__param);
>> +
>> +  if (Args.hasArg(options::OPT_fmudflap) ||
>> +      Args.hasArg(options::OPT_fmudflapth)) {
>> +    CmdArgs.push_back("-fno-builtin");
>> +    CmdArgs.push_back("-fno-merge-constants");
>> +  }
>> +
>> +  if (Args.hasArg(options::OPT_coverage)) {
>> +    CmdArgs.push_back("-fprofile-arcs");
>> +    CmdArgs.push_back("-ftest-coverage");
>> +  }
>> +
>> +  if (types::isCXX(Inputs[0].getType()))
>> +    CmdArgs.push_back("-D__private_extern__=extern");
>> +}
>> +
>> +void darwin::CC1::AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
>> +                                    const InputInfoList &Inputs,
>> +                                    const ArgStringList &OutputArgs) const {
>> +  // Derived from cpp_options
>> +  AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
>> +
>> +  CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
>> +
>> +  AddCC1Args(Args, CmdArgs);
>> +
>> +  // NOTE: The code below has some commonality with cpp_options, but
>> +  // in classic gcc style ends up sending things in different
>> +  // orders. This may be a good merge candidate once we drop pedantic
>> +  // compatibility.
>> +
>> +  Args.AddAllArgs(CmdArgs, options::OPT_m_Group);
>> +  Args.AddAllArgs(CmdArgs, options::OPT_std_EQ, options::OPT_ansi,
>> +                  options::OPT_trigraphs);
>> +  if (!Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
>> +    // Honor -std-default.
>> +    Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
>> +                              "-std=", /*Joined=*/true);
>> +  }
>> +  Args.AddAllArgs(CmdArgs, options::OPT_W_Group, options::OPT_pedantic_Group);
>> +  Args.AddLastArg(CmdArgs, options::OPT_w);
>> +
>> +  // The driver treats -fsyntax-only specially.
>> +  Args.AddAllArgs(CmdArgs, options::OPT_f_Group, options::OPT_fsyntax_only);
>> +
>> +  // Claim Clang only -f options, they aren't worth warning about.
>> +  Args.ClaimAllArgs(options::OPT_f_clang_Group);
>> +
>> +  if (Args.hasArg(options::OPT_g_Group) && !Args.hasArg(options::OPT_g0) &&
>> +      !Args.hasArg(options::OPT_fno_working_directory))
>> +    CmdArgs.push_back("-fworking-directory");
>> +
>> +  Args.AddAllArgs(CmdArgs, options::OPT_O);
>> +  Args.AddAllArgs(CmdArgs, options::OPT_undef);
>> +  if (Args.hasArg(options::OPT_save_temps))
>> +    CmdArgs.push_back("-fpch-preprocess");
>> +}
>> +
>> +void darwin::CC1::AddCPPUniqueOptionsArgs(const ArgList &Args,
>> +                                          ArgStringList &CmdArgs,
>> +                                          const InputInfoList &Inputs) const {
>> +  const Driver &D = getToolChain().getDriver();
>> +
>> +  CheckPreprocessingOptions(D, Args);
>> +
>> +  // Derived from cpp_unique_options.
>> +  // -{C,CC} only with -E is checked in CheckPreprocessingOptions().
>> +  Args.AddLastArg(CmdArgs, options::OPT_C);
>> +  Args.AddLastArg(CmdArgs, options::OPT_CC);
>> +  if (!Args.hasArg(options::OPT_Q))
>> +    CmdArgs.push_back("-quiet");
>> +  Args.AddAllArgs(CmdArgs, options::OPT_nostdinc);
>> +  Args.AddAllArgs(CmdArgs, options::OPT_nostdincxx);
>> +  Args.AddLastArg(CmdArgs, options::OPT_v);
>> +  Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F);
>> +  Args.AddLastArg(CmdArgs, options::OPT_P);
>> +
>> +  // FIXME: Handle %I properly.
>> +  if (getToolChain().getArch() == llvm::Triple::x86_64) {
>> +    CmdArgs.push_back("-imultilib");
>> +    CmdArgs.push_back("x86_64");
>> +  }
>> +
>> +  if (Args.hasArg(options::OPT_MD)) {
>> +    CmdArgs.push_back("-MD");
>> +    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
>> +  }
>> +
>> +  if (Args.hasArg(options::OPT_MMD)) {
>> +    CmdArgs.push_back("-MMD");
>> +    CmdArgs.push_back(darwin::CC1::getDependencyFileName(Args, Inputs));
>> +  }
>> +
>> +  Args.AddLastArg(CmdArgs, options::OPT_M);
>> +  Args.AddLastArg(CmdArgs, options::OPT_MM);
>> +  Args.AddAllArgs(CmdArgs, options::OPT_MF);
>> +  Args.AddLastArg(CmdArgs, options::OPT_MG);
>> +  Args.AddLastArg(CmdArgs, options::OPT_MP);
>> +  Args.AddAllArgs(CmdArgs, options::OPT_MQ);
>> +  Args.AddAllArgs(CmdArgs, options::OPT_MT);
>> +  if (!Args.hasArg(options::OPT_M) && !Args.hasArg(options::OPT_MM) &&
>> +      (Args.hasArg(options::OPT_MD) || Args.hasArg(options::OPT_MMD))) {
>> +    if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
>> +      CmdArgs.push_back("-MQ");
>> +      CmdArgs.push_back(OutputOpt->getValue());
>> +    }
>> +  }
>> +
>> +  Args.AddLastArg(CmdArgs, options::OPT_remap);
>> +  if (Args.hasArg(options::OPT_g3))
>> +    CmdArgs.push_back("-dD");
>> +  Args.AddLastArg(CmdArgs, options::OPT_H);
>> +
>> +  AddCPPArgs(Args, CmdArgs);
>> +
>> +  Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U, options::OPT_A);
>> +  Args.AddAllArgs(CmdArgs, options::OPT_i_Group);
>> +
>> +  for (InputInfoList::const_iterator
>> +         it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
>> +    const InputInfo &II = *it;
>> +
>> +    CmdArgs.push_back(II.getFilename());
>> +  }
>> +
>> +  Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
>> +                       options::OPT_Xpreprocessor);
>> +
>> +  if (Args.hasArg(options::OPT_fmudflap)) {
>> +    CmdArgs.push_back("-D_MUDFLAP");
>> +    CmdArgs.push_back("-include");
>> +    CmdArgs.push_back("mf-runtime.h");
>> +  }
>> +
>> +  if (Args.hasArg(options::OPT_fmudflapth)) {
>> +    CmdArgs.push_back("-D_MUDFLAP");
>> +    CmdArgs.push_back("-D_MUDFLAPTH");
>> +    CmdArgs.push_back("-include");
>> +    CmdArgs.push_back("mf-runtime.h");
>> +  }
>> +}
>> +
>> +void darwin::CC1::AddCPPArgs(const ArgList &Args,
>> +                             ArgStringList &CmdArgs) const {
>> +  // Derived from cpp spec.
>> +
>> +  if (Args.hasArg(options::OPT_static)) {
>> +    // The gcc spec is broken here, it refers to dynamic but
>> +    // that has been translated. Start by being bug compatible.
>> +
>> +    // if (!Args.hasArg(arglist.parser.dynamicOption))
>> +    CmdArgs.push_back("-D__STATIC__");
>> +  } else
>> +    CmdArgs.push_back("-D__DYNAMIC__");
>> +
>> +  if (Args.hasArg(options::OPT_pthread))
>> +    CmdArgs.push_back("-D_REENTRANT");
>> +}
>> +
>> +void darwin::Preprocess::ConstructJob(Compilation &C, const JobAction &JA,
>> +                                      const InputInfo &Output,
>> +                                      const InputInfoList &Inputs,
>> +                                      const ArgList &Args,
>> +                                      const char *LinkingOutput) const {
>> +  ArgStringList CmdArgs;
>> +
>> +  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
>> +
>> +  CmdArgs.push_back("-E");
>> +
>> +  if (Args.hasArg(options::OPT_traditional) ||
>> +      Args.hasArg(options::OPT_traditional_cpp))
>> +    CmdArgs.push_back("-traditional-cpp");
>> +
>> +  ArgStringList OutputArgs;
>> +  assert(Output.isFilename() && "Unexpected CC1 output.");
>> +  OutputArgs.push_back("-o");
>> +  OutputArgs.push_back(Output.getFilename());
>> +
>> +  if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
>> +    AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
>> +  } else {
>> +    AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
>> +    CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
>> +  }
>> +
>> +  Args.AddAllArgs(CmdArgs, options::OPT_d_Group);
>> +
>> +  RemoveCC1UnsupportedArgs(CmdArgs);
>> +
>> +  const char *CC1Name = getCC1Name(Inputs[0].getType());
>> +  const char *Exec =
>> +    Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
>> +  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
>> +}
>> +
>> +void darwin::Compile::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;
>> +
>> +  assert(Inputs.size() == 1 && "Unexpected number of inputs!");
>> +
>> +  // Silence warning about unused --serialize-diagnostics
>> +  Args.ClaimAllArgs(options::OPT__serialize_diags);
>> +
>> +  types::ID InputType = Inputs[0].getType();
>> +  if (const Arg *A = Args.getLastArg(options::OPT_traditional))
>> +    D.Diag(diag::err_drv_argument_only_allowed_with)
>> +      << A->getAsString(Args) << "-E";
>> +
>> +  if (JA.getType() == types::TY_LLVM_IR ||
>> +      JA.getType() == types::TY_LTO_IR)
>> +    CmdArgs.push_back("-emit-llvm");
>> +  else if (JA.getType() == types::TY_LLVM_BC ||
>> +           JA.getType() == types::TY_LTO_BC)
>> +    CmdArgs.push_back("-emit-llvm-bc");
>> +  else if (Output.getType() == types::TY_AST)
>> +    D.Diag(diag::err_drv_no_ast_support)
>> +      << getToolChain().getTripleString();
>> +  else if (JA.getType() != types::TY_PP_Asm &&
>> +           JA.getType() != types::TY_PCH)
>> +    D.Diag(diag::err_drv_invalid_gcc_output_type)
>> +      << getTypeName(JA.getType());
>> +
>> +  ArgStringList OutputArgs;
>> +  if (Output.getType() != types::TY_PCH) {
>> +    OutputArgs.push_back("-o");
>> +    if (Output.isNothing())
>> +      OutputArgs.push_back("/dev/null");
>> +    else
>> +      OutputArgs.push_back(Output.getFilename());
>> +  }
>> +
>> +  // There is no need for this level of compatibility, but it makes
>> +  // diffing easier.
>> +  bool OutputArgsEarly = (Args.hasArg(options::OPT_fsyntax_only) ||
>> +                          Args.hasArg(options::OPT_S));
>> +
>> +  if (types::getPreprocessedType(InputType) != types::TY_INVALID) {
>> +    AddCPPUniqueOptionsArgs(Args, CmdArgs, Inputs);
>> +    if (OutputArgsEarly) {
>> +      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
>> +    } else {
>> +      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
>> +      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
>> +    }
>> +  } else {
>> +    CmdArgs.push_back("-fpreprocessed");
>> +
>> +    for (InputInfoList::const_iterator
>> +           it = Inputs.begin(), ie = Inputs.end(); it != ie; ++it) {
>> +      const InputInfo &II = *it;
>> +
>> +      // Reject AST inputs.
>> +      if (II.getType() == types::TY_AST) {
>> +        D.Diag(diag::err_drv_no_ast_support)
>> +          << getToolChain().getTripleString();
>> +        return;
>> +      }
>> +
>> +      CmdArgs.push_back(II.getFilename());
>> +    }
>> +
>> +    if (OutputArgsEarly) {
>> +      AddCC1OptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
>> +    } else {
>> +      AddCC1OptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
>> +      CmdArgs.append(OutputArgs.begin(), OutputArgs.end());
>> +    }
>> +  }
>> +
>> +  if (Output.getType() == types::TY_PCH) {
>> +    assert(Output.isFilename() && "Invalid PCH output.");
>> +
>> +    CmdArgs.push_back("-o");
>> +    // NOTE: gcc uses a temp .s file for this, but there doesn't seem
>> +    // to be a good reason.
>> +    const char *TmpPath = C.getArgs().MakeArgString(
>> +      D.GetTemporaryPath("cc", "s"));
>> +    C.addTempFile(TmpPath);
>> +    CmdArgs.push_back(TmpPath);
>> +
>> +    // If we're emitting a pch file with the last 4 characters of ".pth"
>> +    // and falling back to llvm-gcc we want to use ".gch" instead.
>> +    std::string OutputFile(Output.getFilename());
>> +    size_t loc = OutputFile.rfind(".pth");
>> +    if (loc != std::string::npos)
>> +      OutputFile.replace(loc, 4, ".gch");
>> +    const char *Tmp = C.getArgs().MakeArgString("--output-pch="+OutputFile);
>> +    CmdArgs.push_back(Tmp);
>> +  }
>> +
>> +  RemoveCC1UnsupportedArgs(CmdArgs);
>> +
>> +  const char *CC1Name = getCC1Name(Inputs[0].getType());
>> +  const char *Exec =
>> +    Args.MakeArgString(getToolChain().GetProgramPath(CC1Name));
>> +  C.addCommand(new Command(JA, *this, Exec, CmdArgs));
>> +}
>> +
>>  void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
>>                                      const InputInfo &Output,
>>                                      const InputInfoList &Inputs,
>>
>> Modified: cfe/trunk/lib/Driver/Tools.h
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.h?rev=168024&r1=168023&r2=168024&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/Tools.h (original)
>> +++ cfe/trunk/lib/Driver/Tools.h Wed Nov 14 23:36:36 2012
>> @@ -31,13 +31,6 @@
>>
>>    /// \brief Clang compiler tool.
>>    class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
>> -    static const char *getBaseInputName(const ArgList &Args,
>> -                                        const InputInfoList &Inputs);
>> -    static const char *getBaseInputStem(const ArgList &Args,
>> -                                        const InputInfoList &Inputs);
>> -    static const char *getDependencyFileName(const ArgList &Args,
>> -                                             const InputInfoList &Inputs);
>> -
>>      void AddPreprocessingOptions(Compilation &C,
>>                                   const Driver &D,
>>                                   const ArgList &Args,
>> @@ -225,6 +218,63 @@
>>                 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
>>    };
>>
>> +  class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool  {
>> +    virtual void anchor();
>> +  public:
>> +    static const char *getBaseInputName(const ArgList &Args,
>> +                                 const InputInfoList &Input);
>> +    static const char *getBaseInputStem(const ArgList &Args,
>> +                                 const InputInfoList &Input);
>> +    static const char *getDependencyFileName(const ArgList &Args,
>> +                                             const InputInfoList &Inputs);
>> +
>> +  protected:
>> +    const char *getCC1Name(types::ID Type) const;
>> +
>> +    void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
>> +    void RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const;
>> +    void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
>> +                           const InputInfoList &Inputs,
>> +                           const ArgStringList &OutputArgs) const;
>> +    void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
>> +                           const InputInfoList &Inputs,
>> +                           const ArgStringList &OutputArgs) const;
>> +    void AddCPPUniqueOptionsArgs(const ArgList &Args,
>> +                                 ArgStringList &CmdArgs,
>> +                                 const InputInfoList &Inputs) const;
>> +    void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
>> +
>> +  public:
>> +    CC1(const char *Name, const char *ShortName,
>> +        const ToolChain &TC) : DarwinTool(Name, ShortName, TC) {}
>> +
>> +    virtual bool hasGoodDiagnostics() const { return true; }
>> +    virtual bool hasIntegratedCPP() const { return true; }
>> +  };
>> +
>> +  class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1  {
>> +  public:
>> +    Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess",
>> +                                          "gcc preprocessor", TC) {}
>> +
>> +    virtual void ConstructJob(Compilation &C, const JobAction &JA,
>> +                              const InputInfo &Output,
>> +                              const InputInfoList &Inputs,
>> +                              const ArgList &TCArgs,
>> +                              const char *LinkingOutput) const;
>> +  };
>> +
>> +  class LLVM_LIBRARY_VISIBILITY Compile : public CC1  {
>> +  public:
>> +    Compile(const ToolChain &TC) : CC1("darwin::Compile", "gcc frontend", TC) {}
>> +
>> +    virtual void ConstructJob(Compilation &C, const JobAction &JA,
>> +                              const InputInfo &Output,
>> +                              const InputInfoList &Inputs,
>> +                              const ArgList &TCArgs,
>> +                              const char *LinkingOutput) const;
>> +  };
>> +
>>    class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool  {
>>    public:
>>      Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
>>
>> Modified: cfe/trunk/lib/Driver/Types.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Types.cpp?rev=168024&r1=168023&r2=168024&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/Types.cpp (original)
>> +++ cfe/trunk/lib/Driver/Types.cpp Wed Nov 14 23:36:36 2012
>> @@ -71,6 +71,29 @@
>>            Id == TY_LTO_BC);
>>  }
>>
>> +bool types::isAcceptedByClang(ID Id) {
>> +  switch (Id) {
>> +  default:
>> +    return false;
>> +
>> +  case TY_Asm:
>> +  case TY_C: case TY_PP_C:
>> +  case TY_CL:
>> +  case TY_CUDA:
>> +  case TY_ObjC: case TY_PP_ObjC: case TY_PP_ObjC_Alias:
>> +  case TY_CXX: case TY_PP_CXX:
>> +  case TY_ObjCXX: case TY_PP_ObjCXX: case TY_PP_ObjCXX_Alias:
>> +  case TY_CHeader: case TY_PP_CHeader:
>> +  case TY_CLHeader:
>> +  case TY_ObjCHeader: case TY_PP_ObjCHeader:
>> +  case TY_CXXHeader: case TY_PP_CXXHeader:
>> +  case TY_ObjCXXHeader: case TY_PP_ObjCXXHeader:
>> +  case TY_AST:
>> +  case TY_LLVM_IR: case TY_LLVM_BC:
>> +    return true;
>> +  }
>> +}
>> +
>>  bool types::isObjC(ID Id) {
>>    switch (Id) {
>>    default:
>>
>> Modified: cfe/trunk/lib/Driver/WindowsToolChain.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/WindowsToolChain.cpp?rev=168024&r1=168023&r2=168024&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/WindowsToolChain.cpp (original)
>> +++ cfe/trunk/lib/Driver/WindowsToolChain.cpp Wed Nov 14 23:36:36 2012
>> @@ -37,7 +37,12 @@
>>
>>  Tool &Windows::SelectTool(const Compilation &C, const JobAction &JA,
>>                            const ActionList &Inputs) const {
>> -  Action::ActionClass Key = JA.getKind();
>> +  Action::ActionClass Key;
>> +  if (getDriver().ShouldUseClangCompiler(C, JA, getTriple()))
>> +    Key = Action::AnalyzeJobClass;
>> +  else
>> +    Key = JA.getKind();
>> +
>>    bool UseIntegratedAs = C.getArgs().hasFlag(options::OPT_integrated_as,
>>                                               options::OPT_no_integrated_as,
>>                                               IsIntegratedAssemblerDefault());
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
> 
> 




More information about the cfe-commits mailing list