int Slang::compile() { if (mDiagnostics->hasErrorOccurred()) return 1; if (mOS.get() == NULL) return 1; // Here is per-compilation needed initialization createPreprocessor(); createASTContext(); mBackend.reset(createBackend(CodeGenOpts, &mOS->os(), mOT)); // Inform the diagnostic client we are processing a source file mDiagClient->BeginSourceFile(LangOpts, mPP.get()); // The core of the slang compiler ParseAST(*mPP, mBackend.get(), *mASTContext); // Inform the diagnostic client we are done with previous source file mDiagClient->EndSourceFile(); // Declare success if no error if (!mDiagnostics->hasErrorOccurred()) mOS->keep(); // The compilation ended, clear mBackend.reset(); mASTContext.reset(); mPP.reset(); mOS.reset(); return mDiagnostics->hasErrorOccurred() ? 1 : 0; }
int Slang::generateDepFile() { if (mDiagnostics->hasErrorOccurred()) return 1; if (mDOS.get() == NULL) return 1; // Initialize options for generating dependency file clang::DependencyOutputOptions DepOpts; DepOpts.IncludeSystemHeaders = 1; DepOpts.OutputFile = mDepOutputFileName; DepOpts.Targets = mAdditionalDepTargets; DepOpts.Targets.push_back(mDepTargetBCFileName); for (std::vector<std::string>::const_iterator I = mGeneratedFileNames.begin(), E = mGeneratedFileNames.end(); I != E; I++) { DepOpts.Targets.push_back(*I); } mGeneratedFileNames.clear(); // Per-compilation needed initialization createPreprocessor(); AttachDependencyFileGen(*mPP.get(), DepOpts); // Inform the diagnostic client we are processing a source file mDiagClient->BeginSourceFile(LangOpts, mPP.get()); // Go through the source file (no operations necessary) clang::Token Tok; mPP->EnterMainSourceFile(); do { mPP->Lex(Tok); } while (Tok.isNot(clang::tok::eof)); mPP->EndSourceFile(); // Declare success if no error if (!mDiagnostics->hasErrorOccurred()) mDOS->keep(); // Clean up after compilation mPP.reset(); mDOS.reset(); return mDiagnostics->hasErrorOccurred() ? 1 : 0; }
std::unique_ptr<CompilerInstance> BuildCompilerInstance(ArrayRef<const char *> ClangArgv) { auto Ins = llvm::make_unique<CompilerInstance>(); auto DC = llvm::make_unique<TestDiagnosticConsumer>(); const bool ShouldOwnClient = true; Ins->createDiagnostics(DC.release(), ShouldOwnClient); auto Inv = llvm::make_unique<CompilerInvocation>(); CompilerInvocation::CreateFromArgs(*Inv, ClangArgv.data(), &ClangArgv.data()[ClangArgv.size()], Ins->getDiagnostics()); Inv->getLangOpts()->CPlusPlus = true; Inv->getLangOpts()->CPlusPlus11 = true; Inv->getHeaderSearchOpts().UseLibcxx = true; Inv->getLangOpts()->Bool = true; Inv->getLangOpts()->WChar = true; Inv->getLangOpts()->Blocks = true; Inv->getLangOpts()->DebuggerSupport = true; Inv->getLangOpts()->SpellChecking = false; Inv->getLangOpts()->ThreadsafeStatics = false; Inv->getLangOpts()->AccessControl = false; Inv->getLangOpts()->DollarIdents = true; Inv->getCodeGenOpts().setDebugInfo(codegenoptions::FullDebugInfo); Inv->getTargetOpts().Triple = llvm::sys::getDefaultTargetTriple(); Ins->setInvocation(Inv.release()); TargetInfo *TI = TargetInfo::CreateTargetInfo( Ins->getDiagnostics(), Ins->getInvocation().TargetOpts); Ins->setTarget(TI); Ins->getTarget().adjust(Ins->getLangOpts()); Ins->createFileManager(); Ins->createSourceManager(Ins->getFileManager()); Ins->createPreprocessor(TU_Complete); return Ins; }