static bool checkForMigration(StringRef resourcesPath, ArrayRef<const char *> Args) { IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); DiagnosticConsumer *DiagClient = new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts); IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); IntrusiveRefCntPtr<DiagnosticsEngine> Diags( new DiagnosticsEngine(DiagID, &*DiagOpts, DiagClient)); // Chain in -verify checker, if requested. VerifyDiagnosticConsumer *verifyDiag = nullptr; if (VerifyDiags) { verifyDiag = new VerifyDiagnosticConsumer(*Diags); Diags->setClient(verifyDiag); } CompilerInvocation CI; if (!CompilerInvocation::CreateFromArgs(CI, Args.begin(), Args.end(), *Diags)) return true; if (CI.getFrontendOpts().Inputs.empty()) { llvm::errs() << "error: no input files\n"; return true; } if (!CI.getLangOpts()->ObjC1) return false; arcmt::checkForManualIssues(CI, CI.getFrontendOpts().Inputs[0], std::make_shared<PCHContainerOperations>(), Diags->getClient()); return Diags->getClient()->getNumErrors() > 0; }
static CompilerInvocation * createCompilerInvocation(llvm::opt::ArgStringList CFlags, StringRef& Path, DiagnosticsEngine& Diags) { llvm::opt::ArgStringList CCArgs { "-cc1", "-triple", "bpf-pc-linux", "-fsyntax-only", "-ferror-limit", "19", "-fmessage-length", "127", "-O2", "-nostdsysteminc", "-nobuiltininc", "-vectorize-loops", "-vectorize-slp", "-Wno-unused-value", "-Wno-pointer-sign", "-x", "c"}; CCArgs.append(CFlags.begin(), CFlags.end()); CompilerInvocation *CI = tooling::newInvocation(&Diags, CCArgs); FrontendOptions& Opts = CI->getFrontendOpts(); Opts.Inputs.clear(); Opts.Inputs.emplace_back(Path, FrontendOptions::getInputKindForExtension("c")); return CI; }
void CompilerInvocation::CreateFromArgs(CompilerInvocation &Res, const char **ArgBegin, const char **ArgEnd, Diagnostic &Diags) { // Parse the arguments. llvm::OwningPtr<OptTable> Opts(createCC1OptTable()); unsigned MissingArgIndex, MissingArgCount; llvm::OwningPtr<InputArgList> Args( Opts->ParseArgs(ArgBegin, ArgEnd,MissingArgIndex, MissingArgCount)); // Check for missing argument error. if (MissingArgCount) Diags.Report(diag::err_drv_missing_argument) << Args->getArgString(MissingArgIndex) << MissingArgCount; // Issue errors on unknown arguments. for (arg_iterator it = Args->filtered_begin(OPT_UNKNOWN), ie = Args->filtered_end(); it != ie; ++it) Diags.Report(diag::err_drv_unknown_argument) << it->getAsString(*Args); ParseAnalyzerArgs(Res.getAnalyzerOpts(), *Args, Diags); ParseCodeGenArgs(Res.getCodeGenOpts(), *Args, Diags); ParseDependencyOutputArgs(Res.getDependencyOutputOpts(), *Args); ParseDiagnosticArgs(Res.getDiagnosticOpts(), *Args, Diags); FrontendOptions::InputKind DashX = ParseFrontendArgs(Res.getFrontendOpts(), *Args, Diags); ParseHeaderSearchArgs(Res.getHeaderSearchOpts(), *Args); if (DashX != FrontendOptions::IK_AST) ParseLangArgs(Res.getLangOpts(), *Args, DashX, Diags); ParsePreprocessorArgs(Res.getPreprocessorOpts(), *Args, Diags); ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), *Args); ParseTargetArgs(Res.getTargetOpts(), *Args); }
static bool performTransformations(StringRef resourcesPath, ArrayRef<const char *> Args) { // Check first. if (checkForMigration(resourcesPath, Args)) return true; IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); DiagnosticConsumer *DiagClient = new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts); IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); IntrusiveRefCntPtr<DiagnosticsEngine> TopDiags( new DiagnosticsEngine(DiagID, &*DiagOpts, &*DiagClient)); CompilerInvocation origCI; if (!CompilerInvocation::CreateFromArgs(origCI, Args.begin(), Args.end(), *TopDiags)) return true; if (origCI.getFrontendOpts().Inputs.empty()) { llvm::errs() << "error: no input files\n"; return true; } if (!origCI.getLangOpts()->ObjC1) return false; MigrationProcess migration(origCI, std::make_shared<PCHContainerOperations>(), DiagClient); std::vector<TransformFn> transforms = arcmt::getAllTransformations(origCI.getLangOpts()->getGC(), origCI.getMigratorOpts().NoFinalizeRemoval); assert(!transforms.empty()); std::unique_ptr<PrintTransforms> transformPrinter; if (OutputTransformations) transformPrinter.reset(new PrintTransforms(llvm::outs())); for (unsigned i=0, e = transforms.size(); i != e; ++i) { bool err = migration.applyTransform(transforms[i], transformPrinter.get()); if (err) return true; if (VerboseOpt) { if (i == e-1) llvm::errs() << "\n##### FINAL RESULT #####\n"; else llvm::errs() << "\n##### OUTPUT AFTER "<< i+1 <<". TRANSFORMATION #####\n"; printResult(migration.getRemapper(), llvm::errs()); llvm::errs() << "\n##########################\n\n"; } } if (!OutputTransformations) printResult(migration.getRemapper(), llvm::outs()); // FIXME: TestResultForARC return false; }