Backend::Backend(clang::DiagnosticsEngine *DiagEngine,
                 const clang::CodeGenOptions &CodeGenOpts,
                 const clang::TargetOptions &TargetOpts,
                 PragmaList *Pragmas,
                 llvm::raw_ostream *OS,
                 Slang::OutputType OT)
    : ASTConsumer(),
      mTargetOpts(TargetOpts),
      mpModule(NULL),
      mpOS(OS),
      mOT(OT),
      mGen(NULL),
      mPerFunctionPasses(NULL),
      mPerModulePasses(NULL),
      mCodeGenPasses(NULL),
      mLLVMContext(llvm::getGlobalContext()),
      mDiagEngine(*DiagEngine),
      mCodeGenOpts(CodeGenOpts),
      mPragmas(Pragmas) {
  FormattedOutStream.setStream(*mpOS,
                               llvm::formatted_raw_ostream::PRESERVE_STREAM);
  mGen = CreateLLVMCodeGen(mDiagEngine, "", mCodeGenOpts,
                           mTargetOpts, mLLVMContext);
  return;
}
Exemplo n.º 2
0
std::unique_ptr<CodeGenerator> BuildCodeGen(CompilerInstance &CI,
                                            llvm::LLVMContext &LLVMCtx) {
  StringRef ModuleName("$__module");
  return std::unique_ptr<CodeGenerator>(CreateLLVMCodeGen(
      CI.getDiagnostics(), ModuleName, CI.getHeaderSearchOpts(),
      CI.getPreprocessorOpts(), CI.getCodeGenOpts(), LLVMCtx));
}
Exemplo n.º 3
0
  IncrementalParser::IncrementalParser(Interpreter* interp, const char* llvmdir)
      : m_Interpreter(interp),
        m_CI(CIFactory::createCI("", interp->getOptions(), llvmdir,
                                 m_Consumer = new cling::DeclCollector())),
        m_ModuleNo(0) {

    if (!m_CI) {
      cling::errs() << "Compiler instance could not be created.\n";
      return;
    }
    // Is the CompilerInstance being used to generate output only?
    if (m_Interpreter->getOptions().CompilerOpts.HasOutput)
      return;

    if (!m_Consumer) {
      cling::errs() << "No AST consumer available.\n";
      return;
    }

    DiagnosticsEngine& Diag = m_CI->getDiagnostics();
    if (m_CI->getFrontendOpts().ProgramAction != frontend::ParseSyntaxOnly) {
      m_CodeGen.reset(CreateLLVMCodeGen(
          Diag, makeModuleName(), m_CI->getHeaderSearchOpts(),
          m_CI->getPreprocessorOpts(), m_CI->getCodeGenOpts(),
          *m_Interpreter->getLLVMContext()));
    }

    // Initialize the DeclCollector and add callbacks keeping track of macros.
    m_Consumer->Setup(this, m_CodeGen.get(), m_CI->getPreprocessor());

    m_DiagConsumer.reset(new FilteringDiagConsumer(Diag, false));

    initializeVirtualFile();
  }
  IncrementalParser::IncrementalParser(Interpreter* interp, 
                                       int argc, const char* const *argv,
                                       const char* llvmdir):
    m_Interpreter(interp),
    m_DynamicLookupEnabled(false),
    m_Consumer(0),
    m_FirstTopLevelDecl(0),
    m_LastTopLevelDecl(0),
    m_SyntaxOnly(false)
  {
    CompilerInstance* CI 
      = CIFactory::createCI(llvm::MemoryBuffer::getMemBuffer("", "CLING"), 
                            argc, argv, llvmdir);
    assert(CI && "CompilerInstance is (null)!");
    m_CI.reset(CI);
    m_SyntaxOnly 
      = CI->getFrontendOpts().ProgramAction == clang::frontend::ParseSyntaxOnly;

    CreateSLocOffsetGenerator();

    m_Consumer = dyn_cast<ChainedConsumer>(&CI->getASTConsumer());
    assert(m_Consumer && "Expected ChainedConsumer!");
    // Add consumers to the ChainedConsumer, which owns them
    EvaluateTSynthesizer* ES = new EvaluateTSynthesizer(interp);
    ES->Attach(m_Consumer);
    m_Consumer->Add(ChainedConsumer::kEvaluateTSynthesizer, ES);

    DeclExtractor* DE = new DeclExtractor();
    DE->Attach(m_Consumer);
    m_Consumer->Add(ChainedConsumer::kDeclExtractor, DE);

    ValuePrinterSynthesizer* VPS = new ValuePrinterSynthesizer(interp);
    VPS->Attach(m_Consumer);
    m_Consumer->Add(ChainedConsumer::kValuePrinterSynthesizer, VPS);
    m_Consumer->Add(ChainedConsumer::kASTDumper, new ASTDumper());
    if (!m_SyntaxOnly) {
      CodeGenerator* CG = CreateLLVMCodeGen(CI->getDiagnostics(), 
                                            "cling input",
                                            CI->getCodeGenOpts(), 
                                  /*Owned by codegen*/ * new llvm::LLVMContext()
                                            );
      assert(CG && "No CodeGen?!");
      m_Consumer->Add(ChainedConsumer::kCodeGenerator, CG);
    }
    m_Parser.reset(new Parser(CI->getPreprocessor(), CI->getSema(),
                              false /*skipFuncBodies*/));
    CI->getPreprocessor().EnterMainSourceFile();
    // Initialize the parser after we have entered the main source file.
    m_Parser->Initialize();
    // Perform initialization that occurs after the parser has been initialized 
    // but before it parses anything. Initializes the consumers too.
    CI->getSema().Initialize();
  }
Exemplo n.º 5
0
 BackendConsumer(BackendAction action, DiagnosticsEngine &_Diags,
                 const CodeGenOptions &compopts,
                 const TargetOptions &targetopts,
                 const LangOptions &langopts, bool TimePasses,
                 const std::string &infile, llvm::Module *LinkModule,
                 raw_ostream *OS, LLVMContext &C)
     : Diags(_Diags), Action(action), CodeGenOpts(compopts),
       TargetOpts(targetopts), LangOpts(langopts), AsmOutStream(OS),
       Context(), LLVMIRGeneration("LLVM IR Generation Time"),
       Gen(CreateLLVMCodeGen(Diags, infile, compopts, targetopts, C)),
       LinkModule(LinkModule) {
   llvm::TimePassesIsEnabled = TimePasses;
 }
Exemplo n.º 6
0
 BackendConsumer(BackendAction Action, DiagnosticsEngine &Diags,
                 const CodeGenOptions &CodeGenOpts,
                 const TargetOptions &TargetOpts,
                 const LangOptions &LangOpts, bool TimePasses,
                 const std::string &InFile, llvm::Module *LinkModule,
                 raw_pwrite_stream *OS, LLVMContext &C,
                 CoverageSourceInfo *CoverageInfo = nullptr)
     : Diags(Diags), Action(Action), CodeGenOpts(CodeGenOpts),
       TargetOpts(TargetOpts), LangOpts(LangOpts), AsmOutStream(OS),
       Context(nullptr), LLVMIRGeneration("LLVM IR Generation Time"),
       Gen(CreateLLVMCodeGen(Diags, InFile, CodeGenOpts, C, CoverageInfo)),
       LinkModule(LinkModule) {
   llvm::TimePassesIsEnabled = TimePasses;
 }
Exemplo n.º 7
0
 BackendConsumer(BackendAction action, DiagnosticsEngine &_Diags,
                 const HeaderSearchOptions &headersearchopts,
                 const PreprocessorOptions &ppopts,
                 const CodeGenOptions &compopts,
                 const TargetOptions &targetopts,
                 const LangOptions &langopts, bool TimePasses,
                 const std::string &infile, llvm::Module *LinkModule,
                 raw_ostream *OS, LLVMContext &C,
                 CoverageSourceInfo *CoverageInfo = nullptr)
     : Diags(_Diags), Action(action), CodeGenOpts(compopts),
       TargetOpts(targetopts), LangOpts(langopts), AsmOutStream(OS),
       Context(nullptr), LLVMIRGeneration("LLVM IR Generation Time"),
       Gen(CreateLLVMCodeGen(Diags, infile, headersearchopts, ppopts,
                             compopts, C, CoverageInfo)),
       LinkModule(LinkModule) {
   llvm::TimePassesIsEnabled = TimePasses;
 }
Exemplo n.º 8
0
 BackendConsumer(
     BackendAction Action, DiagnosticsEngine &Diags,
     const HeaderSearchOptions &HeaderSearchOpts,
     const PreprocessorOptions &PPOpts, const CodeGenOptions &CodeGenOpts,
     const TargetOptions &TargetOpts, const LangOptions &LangOpts,
     bool TimePasses, const std::string &InFile,
     const SmallVectorImpl<std::pair<unsigned, llvm::Module *>> &LinkModules,
     raw_pwrite_stream *OS, LLVMContext &C,
     CoverageSourceInfo *CoverageInfo = nullptr)
     : Diags(Diags), Action(Action), CodeGenOpts(CodeGenOpts),
       TargetOpts(TargetOpts), LangOpts(LangOpts), AsmOutStream(OS),
       Context(nullptr), LLVMIRGeneration("LLVM IR Generation Time"),
       Gen(CreateLLVMCodeGen(Diags, InFile, HeaderSearchOpts, PPOpts,
                             CodeGenOpts, C, CoverageInfo)) {
   llvm::TimePassesIsEnabled = TimePasses;
   for (auto &I : LinkModules)
     this->LinkModules.push_back(
         std::make_pair(I.first, std::unique_ptr<llvm::Module>(I.second)));
 }
Exemplo n.º 9
0
 BackendConsumer(BackendAction Action, DiagnosticsEngine &Diags,
                 const HeaderSearchOptions &HeaderSearchOpts,
                 const PreprocessorOptions &PPOpts,
                 const CodeGenOptions &CodeGenOpts,
                 const TargetOptions &TargetOpts,
                 const LangOptions &LangOpts, bool TimePasses,
                 const std::string &InFile,
                 SmallVector<LinkModule, 4> LinkModules,
                 std::unique_ptr<raw_pwrite_stream> OS, LLVMContext &C,
                 CoverageSourceInfo *CoverageInfo = nullptr)
     : Diags(Diags), Action(Action), HeaderSearchOpts(HeaderSearchOpts),
       CodeGenOpts(CodeGenOpts), TargetOpts(TargetOpts), LangOpts(LangOpts),
       AsmOutStream(std::move(OS)), Context(nullptr),
       LLVMIRGeneration("irgen", "LLVM IR Generation Time"),
       LLVMIRGenerationRefCount(0),
       Gen(CreateLLVMCodeGen(Diags, InFile, HeaderSearchOpts, PPOpts,
                             CodeGenOpts, C, CoverageInfo)),
       LinkModules(std::move(LinkModules)) {
   llvm::TimePassesIsEnabled = TimePasses;
 }
Exemplo n.º 10
0
  IncrementalParser::IncrementalParser(Interpreter* interp,
                                       int argc, const char* const *argv,
                                       const char* llvmdir):
    m_Interpreter(interp), m_Consumer(0) {

    CompilerInstance* CI
      = CIFactory::createCI(0, argc, argv, llvmdir);
    assert(CI && "CompilerInstance is (null)!");

    m_Consumer = dyn_cast<DeclCollector>(&CI->getASTConsumer());
    assert(m_Consumer && "Expected ChainedConsumer!");
    m_Consumer->setInterpreter(interp);

    m_CI.reset(CI);

    if (CI->getFrontendOpts().ProgramAction != clang::frontend::ParseSyntaxOnly){
      m_CodeGen.reset(CreateLLVMCodeGen(CI->getDiagnostics(), "cling input",
                                        CI->getCodeGenOpts(),
                                        CI->getTargetOpts(),
                                        *m_Interpreter->getLLVMContext()
                                        ));
      m_Consumer->setCodeGen(m_CodeGen.get());
    }

    CreateSLocOffsetGenerator();

    // Add transformers to the IncrementalParser, which owns them
    Sema* TheSema = &CI->getSema();
    // Register the AST Transformers
    m_ASTTransformers.push_back(new EvaluateTSynthesizer(TheSema));
    m_ASTTransformers.push_back(new AutoSynthesizer(TheSema));
    m_ASTTransformers.push_back(new ValuePrinterSynthesizer(TheSema, 0));
    m_ASTTransformers.push_back(new ASTDumper());
    m_ASTTransformers.push_back(new DeclExtractor(TheSema));
    m_ASTTransformers.push_back(new ReturnSynthesizer(TheSema));
    
    // Register the IR Transformers
    m_IRTransformers.push_back(new IRDumper());
    m_IRTransformers.push_back(new NullDerefProtectionTransformer());
  }