[cfe-commits] Add cpp frontend

Joerg Sonnenberger joerg at britannica.bec.de
Sun Mar 6 09:51:52 PST 2011


Anyone for review? This would be quite useful to have in 2.9 as a
standalone cpp (even in "modern" mode) is used by a number of programs.

Joerg

On Sat, Mar 05, 2011 at 01:19:59PM +0100, Joerg Sonnenberger wrote:
> Hi all,
> the attached patch recognizes getting called as cpp and act accordingly.
> This differs from clang -E in the handling of missing input files. cpp
> assumes that stdin is used in that case. Patch is based on an earlier
> version from rdivacky.
> 
> Joerg

> Index: include/clang/Driver/Driver.h
> ===================================================================
> --- include/clang/Driver/Driver.h	(revision 126955)
> +++ include/clang/Driver/Driver.h	(working copy)
> @@ -102,6 +102,9 @@
>    /// Whether the driver should follow g++ like behavior.
>    unsigned CCCIsCXX : 1;
>  
> +  /// Whether the driver is just the preprocessor
> +  unsigned CCCIsCPP : 1;
> +
>    /// Echo commands while executing (in -v style).
>    unsigned CCCEcho : 1;
>  
> @@ -221,7 +224,7 @@
>    /// \param TC - The default host tool chain.
>    /// \param Args - The input arguments.
>    /// \param Actions - The list to store the resulting actions onto.
> -  void BuildActions(const ToolChain &TC, const ArgList &Args,
> +  void BuildActions(const ToolChain &TC, const InputArgList &Args,
>                      ActionList &Actions) const;
>  
>    /// BuildUniversalActions - Construct the list of actions to perform
> @@ -230,7 +233,7 @@
>    /// \param TC - The default host tool chain.
>    /// \param Args - The input arguments.
>    /// \param Actions - The list to store the resulting actions onto.
> -  void BuildUniversalActions(const ToolChain &TC, const ArgList &Args,
> +  void BuildUniversalActions(const ToolChain &TC, const InputArgList &Args,
>                               ActionList &Actions) const;
>  
>    /// BuildJobs - Bind actions to concrete tools and translate
> Index: tools/driver/driver.cpp
> ===================================================================
> --- tools/driver/driver.cpp	(revision 126955)
> +++ tools/driver/driver.cpp	(working copy)
> @@ -342,6 +342,11 @@
>      TheDriver.CCCIsCXX = true;
>    }
>  
> +  if (llvm::StringRef(ProgName).endswith("cpp") ||
> +      llvm::StringRef(ProgName).rsplit('-').first.endswith("cpp")) {
> +    TheDriver.CCCIsCPP = true;
> +  }
> +
>    // Handle CC_PRINT_OPTIONS and CC_PRINT_OPTIONS_FILE.
>    TheDriver.CCPrintOptions = !!::getenv("CC_PRINT_OPTIONS");
>    if (TheDriver.CCPrintOptions)
> Index: lib/Driver/Tools.cpp
> ===================================================================
> --- lib/Driver/Tools.cpp	(revision 126955)
> +++ lib/Driver/Tools.cpp	(working copy)
> @@ -41,7 +41,7 @@
>  /// arguments that is shared with gcc.
>  static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
>    if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC))
> -    if (!Args.hasArg(options::OPT_E))
> +    if (!Args.hasArg(options::OPT_E) && !D.CCCIsCPP)
>        D.Diag(clang::diag::err_drv_argument_only_allowed_with)
>          << A->getAsString(Args) << "-E";
>  }
> @@ -2403,7 +2403,7 @@
>    OutputArgs.push_back("-o");
>    OutputArgs.push_back(Output.getFilename());
>  
> -  if (Args.hasArg(options::OPT_E)) {
> +  if (Args.hasArg(options::OPT_E) || getToolChain().getDriver().CCCIsCPP) {
>      AddCPPOptionsArgs(Args, CmdArgs, Inputs, OutputArgs);
>    } else {
>      AddCPPOptionsArgs(Args, CmdArgs, Inputs, ArgStringList());
> Index: lib/Driver/Driver.cpp
> ===================================================================
> --- lib/Driver/Driver.cpp	(revision 126955)
> +++ lib/Driver/Driver.cpp	(working copy)
> @@ -308,10 +308,10 @@
>  
>    // Construct the list of abstract actions to perform for this compilation.
>    if (Host->useDriverDriver())
> -    BuildUniversalActions(C->getDefaultToolChain(), C->getArgs(),
> +    BuildUniversalActions(C->getDefaultToolChain(), C->getInputArgs(),
>                            C->getActions());
>    else
> -    BuildActions(C->getDefaultToolChain(), C->getArgs(), C->getActions());
> +    BuildActions(C->getDefaultToolChain(), C->getInputArgs(), C->getActions());
>  
>    if (CCCPrintActions) {
>      PrintActions(*C);
> @@ -593,7 +593,7 @@
>  }
>  
>  void Driver::BuildUniversalActions(const ToolChain &TC,
> -                                   const ArgList &Args,
> +                                   const InputArgList &Args,
>                                     ActionList &Actions) const {
>    llvm::PrettyStackTraceString CrashInfo("Building universal build actions");
>    // Collect the list of architectures. Duplicates are allowed, but should only
> @@ -688,7 +688,7 @@
>    }
>  }
>  
> -void Driver::BuildActions(const ToolChain &TC, const ArgList &Args,
> +void Driver::BuildActions(const ToolChain &TC, const InputArgList &Args,
>                            ActionList &Actions) const {
>    llvm::PrettyStackTraceString CrashInfo("Building compilation actions");
>    // Start by constructing the list of inputs and their types.
> @@ -721,7 +721,7 @@
>            //
>            // Otherwise emit an error but still use a valid type to avoid
>            // spurious errors (e.g., no inputs).
> -          if (!Args.hasArgNoClaim(options::OPT_E))
> +          if (!Args.hasArgNoClaim(options::OPT_E) && !CCCIsCPP)
>              Diag(clang::diag::err_drv_unknown_stdin_type);
>            Ty = types::TY_C;
>          } else {
> @@ -799,6 +799,15 @@
>      }
>    }
>  
> +  if (CCCIsCPP && Inputs.empty()) {
> +    // If called as standalone preprocessor, stdin is processed
> +    // if no other input is present.
> +    unsigned Index = Args.MakeIndex("-");
> +    Arg *A = Opts->ParseOneArg(Args, Index);
> +    A->claim();
> +    Inputs.push_back(std::make_pair(types::TY_C, A));
> +  }
> +
>    if (!SuppressMissingInputWarning && Inputs.empty()) {
>      Diag(clang::diag::err_drv_no_input_files);
>      return;
> @@ -811,7 +820,8 @@
>    phases::ID FinalPhase;
>  
>    // -{E,M,MM} only run the preprocessor.
> -  if ((FinalPhaseArg = Args.getLastArg(options::OPT_E)) ||
> +  if (CCCIsCPP ||
> +      (FinalPhaseArg = Args.getLastArg(options::OPT_E)) ||
>        (FinalPhaseArg = Args.getLastArg(options::OPT_M, options::OPT_MM))) {
>      FinalPhase = phases::Preprocess;
>  

> _______________________________________________
> 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