[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 t

Daniel Dunbar daniel at zuster.org
Thu Feb 25 12:39:12 PST 2010


Should be fixed in r97166, thanks.

 - Daniel

On Wed, Feb 24, 2010 at 8:53 PM, Douglas Gregor <dgregor at apple.com> wrote:
>
> 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