std::unique_ptr<clang::ASTConsumer> FindAllSymbolsAction::CreateASTConsumer(clang::CompilerInstance &Compiler, StringRef InFile) { Compiler.getPreprocessor().addCommentHandler(&Handler); Compiler.getPreprocessor().addPPCallbacks(llvm::make_unique<FindAllMacros>( Reporter, &Compiler.getSourceManager(), &Collector)); return MatchFinder.newASTConsumer(); }
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; }
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; }
MyASTConsumer(clang::CompilerInstance &ci) : clang::ASTConsumer(), ci(ci), annotator (OutputPath, DataPath) { for(std::string &s : ProjectPaths) { auto colonPos = s.find(':'); if (colonPos >= s.size()) { std::cerr << "fail to parse project option : " << s << std::endl; continue; } auto secondColonPos = s.find(':', colonPos+1); ProjectInfo info { s.substr(0, colonPos), s.substr(colonPos+1, secondColonPos - colonPos -1), secondColonPos < s.size() ? s.substr(secondColonPos + 1) : std::string() }; annotator.addProject(std::move(info)); } for(std::string &s : ExternalProjectPaths) { auto colonPos = s.find(':'); if (colonPos >= s.size()) { std::cerr << "fail to parse project option : " << s << std::endl; continue; } auto secondColonPos = s.find(':', colonPos+1); if (secondColonPos >= s.size()) { std::cerr << "fail to parse project option : " << s << std::endl; continue; } ProjectInfo info { s.substr(0, colonPos), s.substr(colonPos+1, secondColonPos - colonPos -1), ProjectInfo::External }; info.external_root_url = s.substr(secondColonPos + 1); annotator.addProject(std::move(info)); } //ci.getLangOpts().DelayedTemplateParsing = (true); ci.getPreprocessor().enableIncrementalProcessing(); }
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 }
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); }
void c2ffi::process_macros(clang::CompilerInstance &ci, std::ostream &os) { using namespace c2ffi; clang::SourceManager &sm = ci.getSourceManager(); clang::Preprocessor &pp = ci.getPreprocessor(); for(clang::Preprocessor::macro_iterator i = pp.macro_begin(); i != pp.macro_end(); i++) { const clang::MacroInfo *mi = (*i).second->getMacroInfo(); const clang::SourceLocation sl = mi->getDefinitionLoc(); std::string loc = sl.printToString(sm); const char *name = (*i).first->getNameStart(); if(mi->isBuiltinMacro() || loc.substr(0,10) == "<built-in>") { } else if(mi->isFunctionLike()) { } else if(best_guess type = macro_type(pp, name, mi)) { os << "/* " << loc << " */" << std::endl; os << "#define " << name << " " << macro_to_string(pp, mi) << std::endl << std::endl; } } for(clang::Preprocessor::macro_iterator i = pp.macro_begin(); i != pp.macro_end(); i++) { clang::MacroInfo *mi = (*i).second->getMacroInfo(); clang::SourceLocation sl = mi->getDefinitionLoc(); std::string loc = sl.printToString(sm); const char *name = (*i).first->getNameStart(); if(mi->isBuiltinMacro() || loc.substr(0,10) == "<built-in>") { } else if(mi->isFunctionLike()) { } else if(best_guess type = macro_type(pp, name, mi)) { output_redef(pp, name, mi, type, os); } } }
bool WebCLAction::initialize(clang::CompilerInstance &instance) { reporter_ = new WebCLReporter(instance); if (!reporter_) { llvm::errs() << "Internal error. Can't report errors.\n"; return false; } preprocessor_ = new WebCLPreprocessor(instance, extensions_, usedExtensions_); if (!preprocessor_) { reporter_->fatal("Internal error. Can't create preprocessor callbacks.\n"); return false; } clang::Preprocessor &preprocessor = instance.getPreprocessor(); preprocessor.addPPCallbacks(preprocessor_); if (output_) { // see clang::PrintPreprocessedAction instance.getFrontendOpts().OutputFile = output_; out_ = instance.createDefaultOutputFile(true, getCurrentFile()); if (!out_) { reporter_->fatal("Internal error. Can't create output stream."); return false; } } const clang::FrontendInputFile &file = getCurrentInput(); if (file.getKind() != clang::IK_OpenCL) { static const char *format = "Source file '%0' isn't treated as OpenCL code. Make sure that you " "give the '-x cl' option or that the file has a '.cl' extension.\n"; reporter_->fatal(format) << file.getFile(); return false; } return true; }
void c2ffi::add_include(clang::CompilerInstance &ci, const char *path, bool is_angled, bool show_error) { struct stat buf; if(stat(path, &buf) < 0 || !S_ISDIR(buf.st_mode)) { if(show_error) { std::cerr << "Error: Not a directory: "; if(is_angled) std::cerr << "-i "; else std::cerr << "-I "; std::cerr << path << std::endl; exit(1); } return; } const clang::DirectoryEntry *dirent = ci.getFileManager().getDirectory(path); clang::DirectoryLookup lookup(dirent, clang::SrcMgr::C_System, false); ci.getPreprocessor().getHeaderSearchInfo() .AddSearchPath(lookup, is_angled); }
IncludeDirectives::IncludeDirectives(clang::CompilerInstance &CI) : CI(CI), Sources(CI.getSourceManager()) { // addPPCallbacks takes ownership of the callback CI.getPreprocessor().addPPCallbacks(new IncludeDirectivesPPCallback(this)); }
BrowserASTConsumer(clang::CompilerInstance &ci, ProjectManager &projectManager, bool WasInDatabase) : clang::ASTConsumer(), ci(ci), annotator(projectManager), WasInDatabase(WasInDatabase) { //ci.getLangOpts().DelayedTemplateParsing = (true); ci.getPreprocessor().enableIncrementalProcessing(); }