static void ExecuteTemplightJobs(Driver &TheDriver, DiagnosticsEngine &Diags, Compilation &C, Job &J, const char* Argv0, SmallVector<std::pair<int, const Command *>, 4>& FailingCommands) { if (JobList *jobs = dyn_cast<JobList>(&J)) { for (JobList::iterator it = jobs->begin(), it_end = jobs->end(); it != it_end; ++it) ExecuteTemplightJobs(TheDriver, Diags, C, *it, Argv0, FailingCommands); return; } Command *command = dyn_cast<Command>(&J); // Since argumentsFitWithinSystemLimits() may underestimate system's capacity // if the tool does not support response files, there is a chance/ that things // will just work without a response file, so we silently just skip it. if ( command && command->getCreator().getResponseFilesSupport() != Tool::RF_None && llvm::sys::argumentsFitWithinSystemLimits(command->getArguments()) ) { std::string TmpName = TheDriver.GetTemporaryPath("response", "txt"); command->setResponseFile(C.addTempFile(C.getArgs().MakeArgString( TmpName.c_str()))); } if ( command && (StringRef(command->getCreator().getName()) == "clang") ) { // Initialize a compiler invocation object from the clang (-cc1) arguments. const ArgStringList &cc_arguments = command->getArguments(); const char** args_start = const_cast<const char**>(cc_arguments.data()); const char** args_end = args_start + cc_arguments.size(); std::unique_ptr<CompilerInstance> Clang(new CompilerInstance()); int Res = !CompilerInvocation::CreateFromArgs( Clang->getInvocation(), args_start, args_end, Diags); if(Res) FailingCommands.push_back(std::make_pair(Res, command)); Clang->getFrontendOpts().DisableFree = false; // Infer the builtin include path if unspecified. void *GetExecutablePathVP = (void *)(intptr_t) GetExecutablePath; if (Clang->getHeaderSearchOpts().UseBuiltinIncludes && Clang->getHeaderSearchOpts().ResourceDir.empty()) Clang->getHeaderSearchOpts().ResourceDir = CompilerInvocation::GetResourcesPath(Argv0, GetExecutablePathVP); // Create the compilers actual diagnostics engine. Clang->createDiagnostics(); if (!Clang->hasDiagnostics()) { FailingCommands.push_back(std::make_pair(1, command)); return; } LocalOutputFilename = ""; // Let the filename be created from options or output file name. std::string TemplightOutFile = TemplightAction::CreateOutputFilename( Clang.get(), "", InstProfiler, OutputToStdOut, MemoryProfile); // Check if templight filename is in a temporary path: llvm::SmallString<128> TDir; llvm::sys::path::system_temp_directory(true, TDir); if ( TDir.equals(llvm::sys::path::parent_path(llvm::StringRef(TemplightOutFile))) ) { C.addTempFile(TemplightOutFile.c_str()); TempOutputFiles.push_back(TemplightOutFile); } // Execute the frontend actions. Res = ExecuteTemplightInvocation(Clang.get()); if(Res) FailingCommands.push_back(std::make_pair(Res, command)); } else { C.ExecuteJob(J, FailingCommands); } }