Index: lib/Driver/Compilation.cpp =================================================================== --- lib/Driver/Compilation.cpp +++ lib/Driver/Compilation.cpp @@ -22,6 +22,8 @@ using namespace clang; using namespace llvm::opt; +int main(int argc_, const char **argv_); + Compilation::Compilation(const Driver &D, const ToolChain &_DefaultToolChain, InputArgList *_Args, DerivedArgList *_TranslatedArgs) : TheDriver(D), DefaultToolChain(_DefaultToolChain), Args(_Args), @@ -197,9 +199,19 @@ if (const Command *C = dyn_cast(&J)) { if (!InputsOk(*C, FailingCommands)) return; - const Command *FailingCommand = nullptr; - if (int Res = ExecuteCommand(*C, FailingCommand)) - FailingCommands.push_back(std::make_pair(Res, FailingCommand)); + if (C->getExecutable() == getDriver().getClangProgramPath()) { + ArgStringList Args = C->getArguments(); +Args.insert(Args.begin(), C->getExecutable()); +//fprintf(stderr, "in-process\n"); +// XXX response files + main(Args.size(), const_cast(&Args[0])); +// XXX this breaks /fallback +exit(0); + } else { + const Command *FailingCommand = nullptr; + if (int Res = ExecuteCommand(*C, FailingCommand)) + FailingCommands.push_back(std::make_pair(Res, FailingCommand)); + } } else { const JobList *Jobs = cast(&J); for (const auto &Job : *Jobs) Index: tools/driver/driver.cpp =================================================================== --- tools/driver/driver.cpp +++ tools/driver/driver.cpp @@ -382,14 +382,19 @@ if (llvm::sys::Process::FixupStandardFileDescriptors()) return 1; +//for (int i = 0; i < argc_; ++i) fprintf(stderr, " %s", argv_[i]); +//fprintf(stderr, "\n"); + SmallVector argv; llvm::SpecificBumpPtrAllocator ArgAllocator; - std::error_code EC = llvm::sys::Process::GetArgumentVector( - argv, llvm::makeArrayRef(argv_, argc_), ArgAllocator); - if (EC) { - llvm::errs() << "error: couldn't get arguments: " << EC.message() << '\n'; - return 1; - } +// XXX :-( + //std::error_code EC = llvm::sys::Process::GetArgumentVector( + //argv, llvm::makeArrayRef(argv_, argc_), ArgAllocator); +for (int i = 0; i < argc_; ++i) argv.push_back(argv_[i]); + //if (EC) { + //llvm::errs() << "error: couldn't get arguments: " << EC.message() << '\n'; + //return 1; + //} std::set SavedStrings; StringSetSaver Saver(SavedStrings);