Index: llvm/tools/gold/gold-plugin.cpp =================================================================== --- llvm/tools/gold/gold-plugin.cpp +++ llvm/tools/gold/gold-plugin.cpp @@ -844,16 +844,8 @@ } } -/// gold informs us that all symbols have been read. At this point, we use -/// get_symbols to see if any of our definitions have been overridden by a -/// native object file. Then, perform optimization and codegen. -static ld_plugin_status allSymbolsReadHook() { - if (Modules.empty()) - return LDPS_OK; - - if (unsigned NumOpts = options::extra.size()) - cl::ParseCommandLineOptions(NumOpts, &options::extra[0]); - +/// Runs LTO and return a list of pairs . +static std::vector, bool>> runLTO() { // Map to own RAII objects that manage the file opening and releasing // interfaces with gold. This is needed only for ThinLTO mode, since // unlike regular LTO, where addModule will result in the opened file @@ -905,14 +897,13 @@ bool SaveTemps = !Filename.empty(); size_t MaxTasks = Lto->getMaxTasks(); - std::vector IsTemporary(MaxTasks); - std::vector> Filenames(MaxTasks); + std::vector, bool>> Files(MaxTasks); auto AddStream = [&](size_t Task) -> std::unique_ptr { - IsTemporary[Task] = !SaveTemps; + Files[Task].second = !SaveTemps; int FD = getOutputFileName(Filename, /* TempOutFile */ !SaveTemps, - Filenames[Task], Task); + Files[Task].first, Task); return llvm::make_unique( llvm::make_unique(FD, true)); }; @@ -921,7 +912,7 @@ StringRef Path) { // Note that this requires that the memory buffers provided to AddBuffer are // backed by a file. - Filenames[Task] = Path; + Files[Task].first = Path; }; NativeObjectCache Cache; @@ -938,6 +929,21 @@ writeEmptyDistributedBuildOutputs(Identifier.getKey(), OldPrefix, NewPrefix, /* SkipModule */ false); + return Files; +} + +/// gold informs us that all symbols have been read. At this point, we use +/// get_symbols to see if any of our definitions have been overridden by a +/// native object file. Then, perform optimization and codegen. +static ld_plugin_status allSymbolsReadHook() { + if (Modules.empty()) + return LDPS_OK; + + if (unsigned NumOpts = options::extra.size()) + cl::ParseCommandLineOptions(NumOpts, &options::extra[0]); + + std::vector, bool>> Files = runLTO(); + if (options::TheOutputType == options::OT_DISABLE || options::TheOutputType == options::OT_BC_ONLY) return LDPS_OK; @@ -949,9 +955,9 @@ exit(0); } - for (unsigned I = 0; I != MaxTasks; ++I) - if (!Filenames[I].empty()) - recordFile(Filenames[I].str(), IsTemporary[I]); + for (const auto &F : Files) + if (!F.first.empty()) + recordFile(F.first.str(), F.second); if (!options::extra_library_path.empty() && set_extra_library_path(options::extra_library_path.c_str()) != LDPS_OK)