/// Full ThinLTO process void runAll() { if (!OutputFilename.empty()) report_fatal_error("Do not provide an output filename for ThinLTO " " processing, the output files will be suffixed from " "the input ones."); if (!ThinLTOIndex.empty()) errs() << "Warning: -thinlto-index ignored for full ThinLTO process"; LLVMContext Ctx; std::vector<std::unique_ptr<MemoryBuffer>> InputBuffers; for (unsigned i = 0; i < InputFilenames.size(); ++i) { auto &Filename = InputFilenames[i]; StringRef CurrentActivity = "loading file '" + Filename + "'"; auto InputOrErr = MemoryBuffer::getFile(Filename); error(InputOrErr, "error " + CurrentActivity); InputBuffers.push_back(std::move(*InputOrErr)); ThinGenerator.addModule(Filename, InputBuffers.back()->getBuffer()); } ThinGenerator.run(); auto &Binaries = ThinGenerator.getProducedBinaries(); if (Binaries.size() != InputFilenames.size()) report_fatal_error("Number of output objects does not match the number " "of inputs"); for (unsigned BufID = 0; BufID < Binaries.size(); ++BufID) { auto OutputName = InputFilenames[BufID] + ".thinlto.o"; std::error_code EC; raw_fd_ostream OS(OutputName, EC, sys::fs::OpenFlags::F_None); error(EC, "error opening the file '" + OutputName + "'"); OS << Binaries[BufID]->getBuffer(); } }