void c2ffi::init_ci(config &c, clang::CompilerInstance &ci) { using clang::DiagnosticOptions; using clang::TextDiagnosticPrinter; using clang::TargetOptions; using clang::TargetInfo; ci.getInvocation().setLangDefaults(ci.getLangOpts(), c.kind, clang::LangStandard::lang_unspecified); DiagnosticOptions *dopt = new DiagnosticOptions; TextDiagnosticPrinter *tpd = new TextDiagnosticPrinter(llvm::errs(), dopt, false); ci.createDiagnostics(tpd); llvm::IntrusiveRefCntPtr<TargetOptions> *pto = new llvm::IntrusiveRefCntPtr<TargetOptions>(new TargetOptions()); if(c.arch == "") (*pto)->Triple = llvm::sys::getDefaultTargetTriple(); else (*pto)->Triple = c.arch; TargetInfo *pti = TargetInfo::CreateTargetInfo(ci.getDiagnostics(), pto->getPtr()); ci.setTarget(pti); ci.createFileManager(); ci.createSourceManager(ci.getFileManager()); ci.createPreprocessor(clang::TU_Complete); ci.getPreprocessorOpts().UsePredefines = false; }
bool WebCLValidatorAction::initialize(clang::CompilerInstance &instance) { if (!WebCLAction::initialize(instance)) return false; rewriter_ = new clang::Rewriter( instance.getSourceManager(), instance.getLangOpts()); if (!rewriter_) { reporter_->fatal("Internal error. Can't create rewriter.\n"); return false; } transformer_ = new WebCLTransformer(instance, *rewriter_); if (!transformer_) { reporter_->fatal("Internal error. Can't create AST transformer.\n"); return false; } // Consumer must be allocated dynamically. The framework deletes // it. consumer_ = new WebCLConsumer(instance, *rewriter_, *transformer_); if (!consumer_) { reporter_->fatal("Internal error. Can't create AST consumer.\n"); return false; } sema_ = new clang::Sema( instance.getPreprocessor(), instance.getASTContext(), *consumer_); if (!sema_) { reporter_->fatal("Internal error. Can't create semantic actions.\n"); return false; } return true; }
bool WebCLMatcherAction::initialize(clang::CompilerInstance &instance) { if (!WebCLAction::initialize(instance)) return false; rewriter_ = new clang::Rewriter( instance.getSourceManager(), instance.getLangOpts()); if (!rewriter_) { reporter_->fatal("Internal error. Can't create rewriter.\n"); return false; } printer_ = new WebCLPrinter(*rewriter_); if (!printer_) { reporter_->fatal("Internal error. Can't create printer.\n"); return false; } consumer_ = finder_.newASTConsumer(); if (!consumer_) { reporter_->fatal("Internal error. Can't create AST consumer.\n"); return false; } return true; }
MkApiASTConsumer2(clang::CompilerInstance &CI, llvm::StringRef InFile) : mpVisitor(0) { CI.setASTConsumer(this); //cout << "predefines: " << CI.getPreprocessor().getPredefines() << endl; // A Rewriter helps us manage the code rewriting task. mRewriter.setSourceMgr(CI.getSourceManager(), CI.getLangOpts()); mpVisitor = new MkApiASTVisitor(mRewriter); }
TriaAction::CreateAstConsumerResultType TriaAction::CreateASTConsumer (clang::CompilerInstance &ci, llvm::StringRef fileName) { ci.getFrontendOpts().SkipFunctionBodies = true; ci.getPreprocessor().enableIncrementalProcessing (true); ci.getLangOpts().DelayedTemplateParsing = true; // Enable everything for code compatibility ci.getLangOpts().MicrosoftExt = true; ci.getLangOpts().DollarIdents = true; ci.getLangOpts().CPlusPlus11 = true; ci.getLangOpts().GNUMode = true; #if CLANG_VERSION_MINOR < 6 ci.getLangOpts().CPlusPlus1y = true; #else ci.getLangOpts().CPlusPlus14 = true; #endif if (argVerboseTimes) { UNIQUE_COMPAT(PreprocessorHooks, hook, new PreprocessorHooks (ci)); hook->timing ()->name = sourceFileName (this->m_definitions->sourceFiles ()); this->m_definitions->setTimingNode (hook->timing ()); ci.getPreprocessor ().addPPCallbacks (MOVE_COMPAT(hook)); } // QStringList whichInherit; for (const std::string &cur : argInspectBases) { whichInherit.append (QString::fromStdString (cur)); } // TriaASTConsumer *consumer = new TriaASTConsumer (ci, fileName, whichInherit, argInspectAll, argGlobalClass, this->m_definitions); #if CLANG_VERSION_MINOR < 6 return consumer; #else return std::unique_ptr< clang::ASTConsumer > (consumer); #endif }
bool parseAST(const char* szSourceCodeFilePath, clang::ast_matchers::MatchFinder finder) { // create the compiler instance setup for this file as main file prepareCompilerforFile(szSourceCodeFilePath); std::unique_ptr<clang::ASTConsumer> pAstConsumer (finder.newASTConsumer()); clang::DiagnosticConsumer& diagConsumer = m_CompilerInstance.getDiagnosticClient(); diagConsumer.BeginSourceFile(m_CompilerInstance.getLangOpts(), &m_CompilerInstance.getPreprocessor()); clang::ParseAST(m_CompilerInstance.getPreprocessor(), pAstConsumer.get(), m_CompilerInstance.getASTContext()); diagConsumer.EndSourceFile(); return diagConsumer.getNumErrors() != 0; }
ClangParser() { // Usually all examples try to build the CompilerInstance Object from CompilerInvocation object. // However, CompilterInstance already has an in-built CompilerInvocation object. So we use it. // Only problem is: target options are not set correctly for the in-built object. We do it manually. // This below line is just to assert that the object exist. clang::CompilerInvocation& invocation = m_CompilerInstance.getInvocation(); // Diagnostics is needed - set it up m_CompilerInstance.createDiagnostics(); // set the include directories path clang::HeaderSearchOptions & headerSearchOptions = m_CompilerInstance.getHeaderSearchOpts(); headerSearchOptions.AddPath("C:\\Program Files (x86)\\Microsoft Visual Studio 12.0\\VC\\include", clang::frontend::IncludeDirGroup::Angled, false, false); // headerSearchOptions.Verbose = true; // set few options clang::LangOptions& langOptions = m_CompilerInstance.getLangOpts(); langOptions.CPlusPlus = 1; langOptions.Bool = 1; langOptions.RTTI = 0; #if defined(_MSC_VER) langOptions.MicrosoftExt = 1; langOptions.MSVCCompat = 1; langOptions.MSBitfields = 1; langOptions.DelayedTemplateParsing = 1; // MSVC parses templates at the time of actual use m_CompilerInstance.getDiagnosticOpts().setFormat(clang::TextDiagnosticFormat::Msvc); //clInstance.getTargetOpts().ABI = "microsoft"; #endif // Need to set the source manager before AST m_CompilerInstance.createFileManager(); m_CompilerInstance.createSourceManager(m_CompilerInstance.getFileManager()); // Need to set the target before AST. Adjust the default target options and create a target m_CompilerInstance.getTargetOpts().Triple = llvm::sys::getProcessTriple(); m_CompilerInstance.setTarget(clang::TargetInfo::CreateTargetInfo(m_CompilerInstance.getDiagnostics(), &m_CompilerInstance.getTargetOpts())); // Create pre-processor and AST Context m_CompilerInstance.createPreprocessor(clang::TranslationUnitKind::TU_Module); m_CompilerInstance.createASTContext(); if (m_CompilerInstance.hasPreprocessor()) { clang::Preprocessor & preprocessor = m_CompilerInstance.getPreprocessor(); preprocessor.getBuiltinInfo().InitializeBuiltins(preprocessor.getIdentifierTable(), preprocessor.getLangOpts()); } }
void c2ffi::init_ci(config &c, clang::CompilerInstance &ci) { using clang::DiagnosticOptions; using clang::TextDiagnosticPrinter; using clang::TargetOptions; using clang::TargetInfo; DiagnosticOptions *dopt = new DiagnosticOptions; TextDiagnosticPrinter *tpd = new TextDiagnosticPrinter(llvm::errs(), dopt, false); ci.createDiagnostics(tpd); std::shared_ptr<TargetOptions> pto = std::shared_ptr<TargetOptions>(new TargetOptions()); if(c.arch == "") pto->Triple = llvm::sys::getDefaultTargetTriple(); else pto->Triple = c.arch; TargetInfo *pti = TargetInfo::CreateTargetInfo(ci.getDiagnostics(), pto); clang::LangOptions &lo = ci.getLangOpts(); switch(pti->getTriple().getEnvironment()) { case llvm::Triple::EnvironmentType::GNU: lo.GNUMode = 1; break; case llvm::Triple::EnvironmentType::MSVC: lo.MSVCCompat = 1; lo.MicrosoftExt = 1; break; default: std::cerr << "c2ffi warning: Unhandled environment: '" << pti->getTriple().getEnvironmentName().str() << "' for triple '" << c.arch << "'" << std::endl; } ci.getInvocation().setLangDefaults(lo, c.kind, c.std); ci.setTarget(pti); ci.createFileManager(); ci.createSourceManager(ci.getFileManager()); ci.createPreprocessor(clang::TU_Complete); ci.getPreprocessorOpts().UsePredefines = false; ci.getPreprocessorOutputOpts().ShowCPP = c.preprocess_only; ci.getPreprocessor().setPreprocessedOutput(c.preprocess_only); }
bool BeginSourceFileAction( clang::CompilerInstance &CI, StringRef Filename) override { xmlDoc = xmlNewDoc(BAD_CAST "1.0"); xmlNodePtr rootnode = xmlNewNode(nullptr, BAD_CAST "clangAST"); xmlDocSetRootElement(xmlDoc, rootnode); char strftimebuf[BUFSIZ]; time_t t = time(nullptr); strftime(strftimebuf, sizeof strftimebuf, "%F %T", localtime(&t)); xmlNewProp(rootnode, BAD_CAST "source", BAD_CAST Filename.data()); xmlNewProp(rootnode, BAD_CAST "language", BAD_CAST getLanguageString(CI.getLangOpts())); xmlNewProp(rootnode, BAD_CAST "time", BAD_CAST strftimebuf); return true; };