[cfe-commits] r97110 - in /cfe/trunk: include/clang/Frontend/ASTConsumers.h include/clang/Frontend/CodeGenAction.h include/clang/Frontend/FrontendActions.h lib/Frontend/Backend.cpp lib/Frontend/CodeGenAction.cpp lib/Frontend/FrontendActions.cpp tools/driver/cc1_main.cpp

Douglas Gregor dgregor at apple.com
Wed Feb 24 20:53:11 PST 2010


On Feb 24, 2010, at 8:37 PM, Daniel Dunbar wrote:

> Author: ddunbar
> Date: Wed Feb 24 22:37:45 2010
> New Revision: 97110
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=97110&view=rev
> Log:
> Frontend: Pull CodeGenAction out more, and eliminate CreateBackendConsumer.
> 
> This is the way I would like to move the frontend function towards -- distinct
> pieces of functionality should be exposed only via FrontendAction
> implementations which have clean and relatively-stable APIs.
> 
> This also isolates the surface area in clang which depends on LLVM CodeGen.

FYI, I'm seeing:

/Users/dgregor/Projects/llvm/include/llvm/ADT/OwningPtr.h:35:5: warning: 
      deleting pointer to incomplete type 'class llvm::Module' may cause
      undefined behaviour
    delete Ptr;
    ^      ~~~
In file included from /Users/dgregor/Projects/llvm/tools/clang/tools/driver/cc1_main.cpp:22:
/Users/dgregor/Projects/llvm/tools/clang/include/clang/Frontend/CodeGenAction.h:61:1: note: 
      in instantiation of member function 'llvm::OwningPtr<class
      llvm::Module>::~OwningPtr' requested here
};
^
/Users/dgregor/Projects/llvm/tools/clang/include/clang/Frontend/CodeGenAction.h:14:9: note: 
      forward declaration of 'class llvm::Module'
  class Module;
        ^

That looks like it's coming from the synthesized destructor for EmitObjAction, and I think it's legitimate.

	- Doug

> 
> Added:
>    cfe/trunk/include/clang/Frontend/CodeGenAction.h
>    cfe/trunk/lib/Frontend/CodeGenAction.cpp
>      - copied, changed from r97109, cfe/trunk/lib/Frontend/Backend.cpp
> Removed:
>    cfe/trunk/lib/Frontend/Backend.cpp
> Modified:
>    cfe/trunk/include/clang/Frontend/ASTConsumers.h
>    cfe/trunk/include/clang/Frontend/FrontendActions.h
>    cfe/trunk/lib/Frontend/FrontendActions.cpp
>    cfe/trunk/tools/driver/cc1_main.cpp
> 
> Modified: cfe/trunk/include/clang/Frontend/ASTConsumers.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/ASTConsumers.h?rev=97110&r1=97109&r2=97110&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/ASTConsumers.h (original)
> +++ cfe/trunk/include/clang/Frontend/ASTConsumers.h Wed Feb 24 22:37:45 2010
> @@ -69,26 +69,6 @@
>                                 const LangOptions &LOpts,
>                                 bool SilenceRewriteMacroWarning);
> 
> -// LLVM code generator: uses the code generation backend to generate LLVM
> -// assembly. This runs optimizations depending on the CodeGenOptions
> -// parameter. The output depends on the Action parameter.
> -enum BackendAction {
> -  Backend_EmitAssembly,  // Emit native assembly files
> -  Backend_EmitBC,        // Emit LLVM bitcode files
> -  Backend_EmitLL,        // Emit human-readable LLVM assembly
> -  Backend_EmitNothing,   // Don't emit anything (benchmarking mode)
> -  Backend_EmitObj        // Emit native object files
> -};
> -ASTConsumer *CreateBackendConsumer(BackendAction Action,
> -                                   Diagnostic &Diags,
> -                                   const LangOptions &Features,
> -                                   const CodeGenOptions &CodeGenOpts,
> -                                   const TargetOptions &TargetOpts,
> -                                   bool TimePasses,
> -                                   const std::string &ModuleID,
> -                                   llvm::raw_ostream *OS,
> -                                   llvm::LLVMContext& C);
> -
> /// CreateHTMLPrinter - Create an AST consumer which rewrites source code to
> /// HTML with syntax highlighting suitable for viewing in a web-browser.
> ASTConsumer *CreateHTMLPrinter(llvm::raw_ostream *OS, Preprocessor &PP,
> 
> Added: cfe/trunk/include/clang/Frontend/CodeGenAction.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/CodeGenAction.h?rev=97110&view=auto
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/CodeGenAction.h (added)
> +++ cfe/trunk/include/clang/Frontend/CodeGenAction.h Wed Feb 24 22:37:45 2010
> @@ -0,0 +1,50 @@
> +//===--- CodeGenAction.h - LLVM Code Generation Frontend Action -*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "clang/Frontend/FrontendAction.h"
> +
> +namespace clang {
> +
> +class CodeGenAction : public ASTFrontendAction {
> +private:
> +  unsigned Act;
> +
> +protected:
> +  CodeGenAction(unsigned _Act);
> +
> +  virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
> +                                         llvm::StringRef InFile);
> +};
> +
> +class EmitAssemblyAction : public CodeGenAction {
> +public:
> +  EmitAssemblyAction();
> +};
> +
> +class EmitBCAction : public CodeGenAction {
> +public:
> +  EmitBCAction();
> +};
> +
> +class EmitLLVMAction : public CodeGenAction {
> +public:
> +  EmitLLVMAction();
> +};
> +
> +class EmitLLVMOnlyAction : public CodeGenAction {
> +public:
> +  EmitLLVMOnlyAction();
> +};
> +
> +class EmitObjAction : public CodeGenAction {
> +public:
> +  EmitObjAction();
> +};
> +
> +}
> 
> Modified: cfe/trunk/include/clang/Frontend/FrontendActions.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/FrontendActions.h?rev=97110&r1=97109&r2=97110&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Frontend/FrontendActions.h (original)
> +++ cfe/trunk/include/clang/Frontend/FrontendActions.h Wed Feb 24 22:37:45 2010
> @@ -159,46 +159,6 @@
> };
> 
> //===----------------------------------------------------------------------===//
> -// Code Gen AST Actions
> -//===----------------------------------------------------------------------===//
> -
> -class CodeGenAction : public ASTFrontendAction {
> -private:
> -  unsigned Act;
> -
> -protected:
> -  CodeGenAction(unsigned _Act);
> -
> -  virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI,
> -                                         llvm::StringRef InFile);
> -};
> -
> -class EmitAssemblyAction : public CodeGenAction {
> -public:
> -  EmitAssemblyAction();
> -};
> -
> -class EmitBCAction : public CodeGenAction {
> -public:
> -  EmitBCAction();
> -};
> -
> -class EmitLLVMAction : public CodeGenAction {
> -public:
> -  EmitLLVMAction();
> -};
> -
> -class EmitLLVMOnlyAction : public CodeGenAction {
> -public:
> -  EmitLLVMOnlyAction();
> -};
> -
> -class EmitObjAction : public CodeGenAction {
> -public:
> -  EmitObjAction();
> -};
> -
> -//===----------------------------------------------------------------------===//
> // Preprocessor Actions
> //===----------------------------------------------------------------------===//
> 
> 
> Removed: cfe/trunk/lib/Frontend/Backend.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/Backend.cpp?rev=97109&view=auto
> ==============================================================================
> --- cfe/trunk/lib/Frontend/Backend.cpp (original)
> +++ cfe/trunk/lib/Frontend/Backend.cpp (removed)
> @@ -1,433 +0,0 @@
> -//===--- Backend.cpp - Interface to LLVM backend technologies -------------===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#include "clang/Frontend/ASTConsumers.h"
> -#include "clang/AST/ASTConsumer.h"
> -#include "clang/AST/ASTContext.h"
> -#include "clang/AST/DeclGroup.h"
> -#include "clang/Basic/TargetInfo.h"
> -#include "clang/Basic/TargetOptions.h"
> -#include "clang/CodeGen/CodeGenOptions.h"
> -#include "clang/CodeGen/ModuleBuilder.h"
> -#include "clang/Frontend/FrontendDiagnostic.h"
> -#include "llvm/Module.h"
> -#include "llvm/PassManager.h"
> -#include "llvm/ADT/OwningPtr.h"
> -#include "llvm/Assembly/PrintModulePass.h"
> -#include "llvm/Analysis/CallGraph.h"
> -#include "llvm/Analysis/Verifier.h"
> -#include "llvm/Bitcode/ReaderWriter.h"
> -#include "llvm/CodeGen/RegAllocRegistry.h"
> -#include "llvm/CodeGen/SchedulerRegistry.h"
> -#include "llvm/Support/FormattedStream.h"
> -#include "llvm/Support/StandardPasses.h"
> -#include "llvm/Support/Timer.h"
> -#include "llvm/Target/SubtargetFeature.h"
> -#include "llvm/Target/TargetData.h"
> -#include "llvm/Target/TargetMachine.h"
> -#include "llvm/Target/TargetOptions.h"
> -#include "llvm/Target/TargetRegistry.h"
> -using namespace clang;
> -using namespace llvm;
> -
> -namespace {
> -  class BackendConsumer : public ASTConsumer {
> -    Diagnostic &Diags;
> -    BackendAction Action;
> -    const CodeGenOptions &CodeGenOpts;
> -    const LangOptions &LangOpts;
> -    const TargetOptions &TargetOpts;
> -    llvm::raw_ostream *AsmOutStream;
> -    llvm::formatted_raw_ostream FormattedOutStream;
> -    ASTContext *Context;
> -
> -    Timer LLVMIRGeneration;
> -    Timer CodeGenerationTime;
> -
> -    llvm::OwningPtr<CodeGenerator> Gen;
> -
> -    llvm::Module *TheModule;
> -    llvm::TargetData *TheTargetData;
> -
> -    mutable FunctionPassManager *CodeGenPasses;
> -    mutable PassManager *PerModulePasses;
> -    mutable FunctionPassManager *PerFunctionPasses;
> -
> -    FunctionPassManager *getCodeGenPasses() const;
> -    PassManager *getPerModulePasses() const;
> -    FunctionPassManager *getPerFunctionPasses() const;
> -
> -    void CreatePasses();
> -
> -    /// AddEmitPasses - Add passes necessary to emit assembly or LLVM IR.
> -    ///
> -    /// \return True on success.
> -    bool AddEmitPasses();
> -
> -    void EmitAssembly();
> -
> -  public:
> -    BackendConsumer(BackendAction action, Diagnostic &_Diags,
> -                    const LangOptions &langopts, const CodeGenOptions &compopts,
> -                    const TargetOptions &targetopts, bool TimePasses,
> -                    const std::string &infile, llvm::raw_ostream *OS,
> -                    LLVMContext& C) :
> -      Diags(_Diags),
> -      Action(action),
> -      CodeGenOpts(compopts),
> -      LangOpts(langopts),
> -      TargetOpts(targetopts),
> -      AsmOutStream(OS),
> -      LLVMIRGeneration("LLVM IR Generation Time"),
> -      CodeGenerationTime("Code Generation Time"),
> -      Gen(CreateLLVMCodeGen(Diags, infile, compopts, C)),
> -      TheModule(0), TheTargetData(0),
> -      CodeGenPasses(0), PerModulePasses(0), PerFunctionPasses(0) {
> -
> -      if (AsmOutStream)
> -        FormattedOutStream.setStream(*AsmOutStream,
> -                                     formatted_raw_ostream::PRESERVE_STREAM);
> -
> -      llvm::TimePassesIsEnabled = TimePasses;
> -    }
> -
> -    ~BackendConsumer() {
> -      delete TheTargetData;
> -      delete TheModule;
> -      delete CodeGenPasses;
> -      delete PerModulePasses;
> -      delete PerFunctionPasses;
> -    }
> -
> -    virtual void Initialize(ASTContext &Ctx) {
> -      Context = &Ctx;
> -
> -      if (llvm::TimePassesIsEnabled)
> -        LLVMIRGeneration.startTimer();
> -
> -      Gen->Initialize(Ctx);
> -
> -      TheModule = Gen->GetModule();
> -      TheTargetData = new llvm::TargetData(Ctx.Target.getTargetDescription());
> -
> -      if (llvm::TimePassesIsEnabled)
> -        LLVMIRGeneration.stopTimer();
> -    }
> -
> -    virtual void HandleTopLevelDecl(DeclGroupRef D) {
> -      PrettyStackTraceDecl CrashInfo(*D.begin(), SourceLocation(),
> -                                     Context->getSourceManager(),
> -                                     "LLVM IR generation of declaration");
> -
> -      if (llvm::TimePassesIsEnabled)
> -        LLVMIRGeneration.startTimer();
> -
> -      Gen->HandleTopLevelDecl(D);
> -
> -      if (llvm::TimePassesIsEnabled)
> -        LLVMIRGeneration.stopTimer();
> -    }
> -
> -    virtual void HandleTranslationUnit(ASTContext &C) {
> -      {
> -        PrettyStackTraceString CrashInfo("Per-file LLVM IR generation");
> -        if (llvm::TimePassesIsEnabled)
> -          LLVMIRGeneration.startTimer();
> -
> -        Gen->HandleTranslationUnit(C);
> -
> -        if (llvm::TimePassesIsEnabled)
> -          LLVMIRGeneration.stopTimer();
> -      }
> -
> -      // EmitAssembly times and registers crash info itself.
> -      EmitAssembly();
> -
> -      // Force a flush here in case we never get released.
> -      if (AsmOutStream)
> -        FormattedOutStream.flush();
> -    }
> -
> -    virtual void HandleTagDeclDefinition(TagDecl *D) {
> -      PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
> -                                     Context->getSourceManager(),
> -                                     "LLVM IR generation of declaration");
> -      Gen->HandleTagDeclDefinition(D);
> -    }
> -
> -    virtual void CompleteTentativeDefinition(VarDecl *D) {
> -      Gen->CompleteTentativeDefinition(D);
> -    }
> -  };
> -}
> -
> -FunctionPassManager *BackendConsumer::getCodeGenPasses() const {
> -  if (!CodeGenPasses) {
> -    CodeGenPasses = new FunctionPassManager(TheModule);
> -    CodeGenPasses->add(new TargetData(*TheTargetData));
> -  }
> -
> -  return CodeGenPasses;
> -}
> -
> -PassManager *BackendConsumer::getPerModulePasses() const {
> -  if (!PerModulePasses) {
> -    PerModulePasses = new PassManager();
> -    PerModulePasses->add(new TargetData(*TheTargetData));
> -  }
> -
> -  return PerModulePasses;
> -}
> -
> -FunctionPassManager *BackendConsumer::getPerFunctionPasses() const {
> -  if (!PerFunctionPasses) {
> -    PerFunctionPasses = new FunctionPassManager(TheModule);
> -    PerFunctionPasses->add(new TargetData(*TheTargetData));
> -  }
> -
> -  return PerFunctionPasses;
> -}
> -
> -bool BackendConsumer::AddEmitPasses() {
> -  if (Action == Backend_EmitNothing)
> -    return true;
> -
> -  if (Action == Backend_EmitBC) {
> -    getPerModulePasses()->add(createBitcodeWriterPass(FormattedOutStream));
> -  } else if (Action == Backend_EmitLL) {
> -    getPerModulePasses()->add(createPrintModulePass(&FormattedOutStream));
> -  } else {
> -    bool Fast = CodeGenOpts.OptimizationLevel == 0;
> -
> -    // Create the TargetMachine for generating code.
> -    std::string Error;
> -    std::string Triple = TheModule->getTargetTriple();
> -    const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Triple, Error);
> -    if (!TheTarget) {
> -      Diags.Report(diag::err_fe_unable_to_create_target) << Error;
> -      return false;
> -    }
> -
> -    // FIXME: Expose these capabilities via actual APIs!!!! Aside from just
> -    // being gross, this is also totally broken if we ever care about
> -    // concurrency.
> -    llvm::NoFramePointerElim = CodeGenOpts.DisableFPElim;
> -    if (CodeGenOpts.FloatABI == "soft")
> -      llvm::FloatABIType = llvm::FloatABI::Soft;
> -    else if (CodeGenOpts.FloatABI == "hard")
> -      llvm::FloatABIType = llvm::FloatABI::Hard;
> -    else {
> -      assert(CodeGenOpts.FloatABI.empty() && "Invalid float abi!");
> -      llvm::FloatABIType = llvm::FloatABI::Default;
> -    }
> -    NoZerosInBSS = CodeGenOpts.NoZeroInitializedInBSS;
> -    llvm::UseSoftFloat = CodeGenOpts.SoftFloat;
> -    UnwindTablesMandatory = CodeGenOpts.UnwindTables;
> -
> -    TargetMachine::setAsmVerbosityDefault(CodeGenOpts.AsmVerbose);
> -
> -    // FIXME: Parse this earlier.
> -    if (CodeGenOpts.RelocationModel == "static") {
> -      TargetMachine::setRelocationModel(llvm::Reloc::Static);
> -    } else if (CodeGenOpts.RelocationModel == "pic") {
> -      TargetMachine::setRelocationModel(llvm::Reloc::PIC_);
> -    } else {
> -      assert(CodeGenOpts.RelocationModel == "dynamic-no-pic" &&
> -             "Invalid PIC model!");
> -      TargetMachine::setRelocationModel(llvm::Reloc::DynamicNoPIC);
> -    }
> -    // FIXME: Parse this earlier.
> -    if (CodeGenOpts.CodeModel == "small") {
> -      TargetMachine::setCodeModel(llvm::CodeModel::Small);
> -    } else if (CodeGenOpts.CodeModel == "kernel") {
> -      TargetMachine::setCodeModel(llvm::CodeModel::Kernel);
> -    } else if (CodeGenOpts.CodeModel == "medium") {
> -      TargetMachine::setCodeModel(llvm::CodeModel::Medium);
> -    } else if (CodeGenOpts.CodeModel == "large") {
> -      TargetMachine::setCodeModel(llvm::CodeModel::Large);
> -    } else {
> -      assert(CodeGenOpts.CodeModel.empty() && "Invalid code model!");
> -      TargetMachine::setCodeModel(llvm::CodeModel::Default);
> -    }
> -
> -    std::vector<const char *> BackendArgs;
> -    BackendArgs.push_back("clang"); // Fake program name.
> -    if (!CodeGenOpts.DebugPass.empty()) {
> -      BackendArgs.push_back("-debug-pass");
> -      BackendArgs.push_back(CodeGenOpts.DebugPass.c_str());
> -    }
> -    if (!CodeGenOpts.LimitFloatPrecision.empty()) {
> -      BackendArgs.push_back("-limit-float-precision");
> -      BackendArgs.push_back(CodeGenOpts.LimitFloatPrecision.c_str());
> -    }
> -    if (llvm::TimePassesIsEnabled)
> -      BackendArgs.push_back("-time-passes");
> -    BackendArgs.push_back(0);
> -    llvm::cl::ParseCommandLineOptions(BackendArgs.size() - 1,
> -                                      (char**) &BackendArgs[0]);
> -
> -    std::string FeaturesStr;
> -    if (TargetOpts.CPU.size() || TargetOpts.Features.size()) {
> -      SubtargetFeatures Features;
> -      Features.setCPU(TargetOpts.CPU);
> -      for (std::vector<std::string>::const_iterator
> -             it = TargetOpts.Features.begin(),
> -             ie = TargetOpts.Features.end(); it != ie; ++it)
> -        Features.AddFeature(*it);
> -      FeaturesStr = Features.getString();
> -    }
> -    TargetMachine *TM = TheTarget->createTargetMachine(Triple, FeaturesStr);
> -
> -    // Set register scheduler & allocation policy.
> -    RegisterScheduler::setDefault(createDefaultScheduler);
> -    RegisterRegAlloc::setDefault(Fast ? createLocalRegisterAllocator :
> -                                 createLinearScanRegisterAllocator);
> -
> -    // From llvm-gcc:
> -    // If there are passes we have to run on the entire module, we do codegen
> -    // as a separate "pass" after that happens.
> -    // FIXME: This is disabled right now until bugs can be worked out.  Reenable
> -    // this for fast -O0 compiles!
> -    FunctionPassManager *PM = getCodeGenPasses();
> -    CodeGenOpt::Level OptLevel = CodeGenOpt::Default;
> -
> -    switch (CodeGenOpts.OptimizationLevel) {
> -    default: break;
> -    case 0: OptLevel = CodeGenOpt::None; break;
> -    case 3: OptLevel = CodeGenOpt::Aggressive; break;
> -    }
> -
> -    // Normal mode, emit a .s or .o file by running the code generator. Note,
> -    // this also adds codegenerator level optimization passes.
> -    TargetMachine::CodeGenFileType CGFT = TargetMachine::CGFT_AssemblyFile;
> -    if (Action == Backend_EmitObj)
> -      CGFT = TargetMachine::CGFT_ObjectFile;
> -    if (TM->addPassesToEmitFile(*PM, FormattedOutStream, CGFT, OptLevel)) {
> -      Diags.Report(diag::err_fe_unable_to_interface_with_target);
> -      return false;
> -    }
> -  }
> -
> -  return true;
> -}
> -
> -void BackendConsumer::CreatePasses() {
> -  unsigned OptLevel = CodeGenOpts.OptimizationLevel;
> -  CodeGenOptions::InliningMethod Inlining = CodeGenOpts.Inlining;
> -
> -  // Handle disabling of LLVM optimization, where we want to preserve the
> -  // internal module before any optimization.
> -  if (CodeGenOpts.DisableLLVMOpts) {
> -    OptLevel = 0;
> -    Inlining = CodeGenOpts.NoInlining;
> -  }
> -
> -  // In -O0 if checking is disabled, we don't even have per-function passes.
> -  if (CodeGenOpts.VerifyModule)
> -    getPerFunctionPasses()->add(createVerifierPass());
> -
> -  // Assume that standard function passes aren't run for -O0.
> -  if (OptLevel > 0)
> -    llvm::createStandardFunctionPasses(getPerFunctionPasses(), OptLevel);
> -
> -  llvm::Pass *InliningPass = 0;
> -  switch (Inlining) {
> -  case CodeGenOptions::NoInlining: break;
> -  case CodeGenOptions::NormalInlining: {
> -    // Set the inline threshold following llvm-gcc.
> -    //
> -    // FIXME: Derive these constants in a principled fashion.
> -    unsigned Threshold = 225;
> -    if (CodeGenOpts.OptimizeSize)
> -      Threshold = 75;
> -    else if (OptLevel > 2)
> -      Threshold = 275;
> -    InliningPass = createFunctionInliningPass(Threshold);
> -    break;
> -  }
> -  case CodeGenOptions::OnlyAlwaysInlining:
> -    InliningPass = createAlwaysInlinerPass();         // Respect always_inline
> -    break;
> -  }
> -
> -  // For now we always create per module passes.
> -  PassManager *PM = getPerModulePasses();
> -  llvm::createStandardModulePasses(PM, OptLevel, CodeGenOpts.OptimizeSize,
> -                                   CodeGenOpts.UnitAtATime,
> -                                   CodeGenOpts.UnrollLoops,
> -                                   /*SimplifyLibCalls=*/!LangOpts.NoBuiltin,
> -                                   /*HaveExceptions=*/true,
> -                                   InliningPass);
> -}
> -
> -/// EmitAssembly - Handle interaction with LLVM backend to generate
> -/// actual machine code.
> -void BackendConsumer::EmitAssembly() {
> -  // Silently ignore if we weren't initialized for some reason.
> -  if (!TheModule || !TheTargetData)
> -    return;
> -
> -  TimeRegion Region(llvm::TimePassesIsEnabled ? &CodeGenerationTime : 0);
> -
> -  // Make sure IR generation is happy with the module. This is
> -  // released by the module provider.
> -  Module *M = Gen->ReleaseModule();
> -  if (!M) {
> -    // The module has been released by IR gen on failures, do not
> -    // double free.
> -    TheModule = 0;
> -    return;
> -  }
> -
> -  assert(TheModule == M && "Unexpected module change during IR generation");
> -
> -  CreatePasses();
> -  if (!AddEmitPasses())
> -    return;
> -
> -  // Run passes. For now we do all passes at once, but eventually we
> -  // would like to have the option of streaming code generation.
> -
> -  if (PerFunctionPasses) {
> -    PrettyStackTraceString CrashInfo("Per-function optimization");
> -
> -    PerFunctionPasses->doInitialization();
> -    for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
> -      if (!I->isDeclaration())
> -        PerFunctionPasses->run(*I);
> -    PerFunctionPasses->doFinalization();
> -  }
> -
> -  if (PerModulePasses) {
> -    PrettyStackTraceString CrashInfo("Per-module optimization passes");
> -    PerModulePasses->run(*M);
> -  }
> -
> -  if (CodeGenPasses) {
> -    PrettyStackTraceString CrashInfo("Code generation");
> -    CodeGenPasses->doInitialization();
> -    for (Module::iterator I = M->begin(), E = M->end(); I != E; ++I)
> -      if (!I->isDeclaration())
> -        CodeGenPasses->run(*I);
> -    CodeGenPasses->doFinalization();
> -  }
> -}
> -
> -ASTConsumer *clang::CreateBackendConsumer(BackendAction Action,
> -                                          Diagnostic &Diags,
> -                                          const LangOptions &LangOpts,
> -                                          const CodeGenOptions &CodeGenOpts,
> -                                          const TargetOptions &TargetOpts,
> -                                          bool TimePasses,
> -                                          const std::string& InFile,
> -                                          llvm::raw_ostream* OS,
> -                                          LLVMContext& C) {
> -  return new BackendConsumer(Action, Diags, LangOpts, CodeGenOpts,
> -                             TargetOpts, TimePasses, InFile, OS, C);
> -}
> 
> Copied: cfe/trunk/lib/Frontend/CodeGenAction.cpp (from r97109, cfe/trunk/lib/Frontend/Backend.cpp)
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CodeGenAction.cpp?p2=cfe/trunk/lib/Frontend/CodeGenAction.cpp&p1=cfe/trunk/lib/Frontend/Backend.cpp&r1=97109&r2=97110&rev=97110&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/Backend.cpp (original)
> +++ cfe/trunk/lib/Frontend/CodeGenAction.cpp Wed Feb 24 22:37:45 2010
> @@ -1,4 +1,4 @@
> -//===--- Backend.cpp - Interface to LLVM backend technologies -------------===//
> +//===--- CodeGenAction.cpp - LLVM Code Generation Frontend Action ---------===//
> //
> //                     The LLVM Compiler Infrastructure
> //
> @@ -7,7 +7,7 @@
> //
> //===----------------------------------------------------------------------===//
> 
> -#include "clang/Frontend/ASTConsumers.h"
> +#include "clang/Frontend/CodeGenAction.h"
> #include "clang/AST/ASTConsumer.h"
> #include "clang/AST/ASTContext.h"
> #include "clang/AST/DeclGroup.h"
> @@ -15,6 +15,8 @@
> #include "clang/Basic/TargetOptions.h"
> #include "clang/CodeGen/CodeGenOptions.h"
> #include "clang/CodeGen/ModuleBuilder.h"
> +#include "clang/Frontend/ASTConsumers.h"
> +#include "clang/Frontend/CompilerInstance.h"
> #include "clang/Frontend/FrontendDiagnostic.h"
> #include "llvm/Module.h"
> #include "llvm/PassManager.h"
> @@ -37,6 +39,14 @@
> using namespace llvm;
> 
> namespace {
> +  enum BackendAction {
> +    Backend_EmitAssembly,  ///< Emit native assembly files
> +    Backend_EmitBC,        ///< Emit LLVM bitcode files
> +    Backend_EmitLL,        ///< Emit human-readable LLVM assembly
> +    Backend_EmitNothing,   ///< Don't emit anything (benchmarking mode)
> +    Backend_EmitObj        ///< Emit native object files
> +  };
> +
>   class BackendConsumer : public ASTConsumer {
>     Diagnostic &Diags;
>     BackendAction Action;
> @@ -419,15 +429,46 @@
>   }
> }
> 
> -ASTConsumer *clang::CreateBackendConsumer(BackendAction Action,
> -                                          Diagnostic &Diags,
> -                                          const LangOptions &LangOpts,
> -                                          const CodeGenOptions &CodeGenOpts,
> -                                          const TargetOptions &TargetOpts,
> -                                          bool TimePasses,
> -                                          const std::string& InFile,
> -                                          llvm::raw_ostream* OS,
> -                                          LLVMContext& C) {
> -  return new BackendConsumer(Action, Diags, LangOpts, CodeGenOpts,
> -                             TargetOpts, TimePasses, InFile, OS, C);
> +//
> +
> +CodeGenAction::CodeGenAction(unsigned _Act) : Act(_Act) {}
> +
> +ASTConsumer *CodeGenAction::CreateASTConsumer(CompilerInstance &CI,
> +                                              llvm::StringRef InFile) {
> +  BackendAction BA = static_cast<BackendAction>(Act);
> +  llvm::OwningPtr<llvm::raw_ostream> OS;
> +  switch (BA) {
> +  case Backend_EmitAssembly:
> +    OS.reset(CI.createDefaultOutputFile(false, InFile, "s"));
> +    break;
> +  case Backend_EmitLL:
> +    OS.reset(CI.createDefaultOutputFile(false, InFile, "ll"));
> +    break;
> +  case Backend_EmitBC:
> +    OS.reset(CI.createDefaultOutputFile(true, InFile, "bc"));
> +    break;
> +  case Backend_EmitNothing:
> +    break;
> +  case Backend_EmitObj:
> +    OS.reset(CI.createDefaultOutputFile(true, InFile, "o"));
> +    break;
> +  }
> +  if (BA != Backend_EmitNothing && !OS)
> +    return 0;
> +
> +  return new BackendConsumer(BA, CI.getDiagnostics(), CI.getLangOpts(),
> +                             CI.getCodeGenOpts(), CI.getTargetOpts(),
> +                             CI.getFrontendOpts().ShowTimers, InFile, OS.take(),
> +                             CI.getLLVMContext());
> }
> +
> +EmitAssemblyAction::EmitAssemblyAction()
> +  : CodeGenAction(Backend_EmitAssembly) {}
> +
> +EmitBCAction::EmitBCAction() : CodeGenAction(Backend_EmitBC) {}
> +
> +EmitLLVMAction::EmitLLVMAction() : CodeGenAction(Backend_EmitLL) {}
> +
> +EmitLLVMOnlyAction::EmitLLVMOnlyAction() : CodeGenAction(Backend_EmitNothing) {}
> +
> +EmitObjAction::EmitObjAction() : CodeGenAction(Backend_EmitObj) {}
> 
> Modified: cfe/trunk/lib/Frontend/FrontendActions.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendActions.cpp?rev=97110&r1=97109&r2=97110&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/FrontendActions.cpp (original)
> +++ cfe/trunk/lib/Frontend/FrontendActions.cpp Wed Feb 24 22:37:45 2010
> @@ -159,48 +159,6 @@
>   return new ASTConsumer();
> }
> 
> -CodeGenAction::CodeGenAction(unsigned _Act) : Act(_Act) {}
> -
> -ASTConsumer *CodeGenAction::CreateASTConsumer(CompilerInstance &CI,
> -                                              llvm::StringRef InFile) {
> -  BackendAction BA = static_cast<BackendAction>(Act);
> -  llvm::OwningPtr<llvm::raw_ostream> OS;
> -  switch (BA) {
> -  case Backend_EmitAssembly:
> -    OS.reset(CI.createDefaultOutputFile(false, InFile, "s"));
> -    break;
> -  case Backend_EmitLL:
> -    OS.reset(CI.createDefaultOutputFile(false, InFile, "ll"));
> -    break;
> -  case Backend_EmitBC:
> -    OS.reset(CI.createDefaultOutputFile(true, InFile, "bc"));
> -    break;
> -  case Backend_EmitNothing:
> -    break;
> -  case Backend_EmitObj:
> -    OS.reset(CI.createDefaultOutputFile(true, InFile, "o"));
> -    break;
> -  }
> -  if (BA != Backend_EmitNothing && !OS)
> -    return 0;
> -
> -  return CreateBackendConsumer(BA, CI.getDiagnostics(), CI.getLangOpts(),
> -                               CI.getCodeGenOpts(), CI.getTargetOpts(),
> -                               CI.getFrontendOpts().ShowTimers, InFile,
> -                               OS.take(), CI.getLLVMContext());
> -}
> -
> -EmitAssemblyAction::EmitAssemblyAction()
> -  : CodeGenAction(Backend_EmitAssembly) {}
> -
> -EmitBCAction::EmitBCAction() : CodeGenAction(Backend_EmitBC) {}
> -
> -EmitLLVMAction::EmitLLVMAction() : CodeGenAction(Backend_EmitLL) {}
> -
> -EmitLLVMOnlyAction::EmitLLVMOnlyAction() : CodeGenAction(Backend_EmitNothing) {}
> -
> -EmitObjAction::EmitObjAction() : CodeGenAction(Backend_EmitObj) {}
> -
> //===----------------------------------------------------------------------===//
> // Preprocessor Actions
> //===----------------------------------------------------------------------===//
> 
> Modified: cfe/trunk/tools/driver/cc1_main.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/driver/cc1_main.cpp?rev=97110&r1=97109&r2=97110&view=diff
> ==============================================================================
> --- cfe/trunk/tools/driver/cc1_main.cpp (original)
> +++ cfe/trunk/tools/driver/cc1_main.cpp Wed Feb 24 22:37:45 2010
> @@ -19,6 +19,7 @@
> #include "clang/Driver/CC1Options.h"
> #include "clang/Driver/DriverDiagnostic.h"
> #include "clang/Driver/OptTable.h"
> +#include "clang/Frontend/CodeGenAction.h"
> #include "clang/Frontend/CompilerInstance.h"
> #include "clang/Frontend/CompilerInvocation.h"
> #include "clang/Frontend/FrontendActions.h"
> 
> 
> _______________________________________________
> 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