Merge "Merge ModuleIR within single thread" am: 79f4b7a0fc am: e0de71ef07 am: 692d59ac59

Original change: https://android-review.googlesource.com/c/platform/development/+/1411807

Change-Id: Ida79065bbe395a2f6172a60ece25a462e7377a0f
This commit is contained in:
Treehugger Robot
2020-08-31 06:27:34 +00:00
committed by Automerger Merge Worker

View File

@@ -29,7 +29,6 @@
#include <functional> #include <functional>
#include <iostream> #include <iostream>
#include <memory> #include <memory>
#include <mutex>
#include <string> #include <string>
#include <thread> #include <thread>
#include <vector> #include <vector>
@@ -191,23 +190,12 @@ class HeaderAbiLinker {
std::unique_ptr<repr::ExportedSymbolSet> version_script_symbols_; std::unique_ptr<repr::ExportedSymbolSet> version_script_symbols_;
}; };
static void static void DeDuplicateAbiElementsThread(
DeDuplicateAbiElementsThread(const std::vector<std::string> &dump_files, std::vector<std::string>::const_iterator dump_files_begin,
std::vector<std::string>::const_iterator dump_files_end,
const std::set<std::string> *exported_headers, const std::set<std::string> *exported_headers,
linker::ModuleMerger *global_merger, linker::ModuleMerger *merger) {
std::mutex *global_merger_lock, for (auto it = dump_files_begin; it != dump_files_end; it++) {
std::atomic<std::size_t> *cnt) {
linker::ModuleMerger local_merger(exported_headers);
auto begin_it = dump_files.begin();
std::size_t num_sources = dump_files.size();
while (1) {
std::size_t i = cnt->fetch_add(sources_per_thread);
if (i >= num_sources) {
break;
}
std::size_t end = std::min(i + sources_per_thread, num_sources);
for (auto it = begin_it + i; it != begin_it + end; it++) {
std::unique_ptr<repr::IRReader> reader = std::unique_ptr<repr::IRReader> reader =
repr::IRReader::CreateIRReader(input_format, exported_headers); repr::IRReader::CreateIRReader(input_format, exported_headers);
assert(reader != nullptr); assert(reader != nullptr);
@@ -215,34 +203,45 @@ DeDuplicateAbiElementsThread(const std::vector<std::string> &dump_files,
llvm::errs() << "ReadDump failed\n"; llvm::errs() << "ReadDump failed\n";
::exit(1); ::exit(1);
} }
local_merger.MergeGraphs(reader->GetModule()); merger->MergeGraphs(reader->GetModule());
} }
} }
std::lock_guard<std::mutex> lock(*global_merger_lock);
global_merger->MergeGraphs(local_merger.GetModule());
}
std::unique_ptr<linker::ModuleMerger> HeaderAbiLinker::ReadInputDumpFiles() { std::unique_ptr<linker::ModuleMerger> HeaderAbiLinker::ReadInputDumpFiles() {
std::unique_ptr<linker::ModuleMerger> merger( std::unique_ptr<linker::ModuleMerger> merger(
new linker::ModuleMerger(&exported_headers_)); new linker::ModuleMerger(&exported_headers_));
std::size_t max_threads = std::thread::hardware_concurrency(); std::size_t max_threads = std::thread::hardware_concurrency();
std::size_t num_threads = std::size_t num_threads = std::max<std::size_t>(
sources_per_thread < dump_files_.size() std::min(dump_files_.size() / sources_per_thread, max_threads), 1);
? std::min(dump_files_.size() / sources_per_thread, max_threads)
: 1;
std::vector<std::thread> threads; std::vector<std::thread> threads;
std::atomic<std::size_t> cnt(0); std::vector<linker::ModuleMerger> thread_mergers;
std::mutex merger_lock; thread_mergers.reserve(num_threads - 1);
for (std::size_t i = 1; i < num_threads; i++) {
threads.emplace_back(DeDuplicateAbiElementsThread, dump_files_, std::size_t dump_files_index = 0;
&exported_headers_, merger.get(), &merger_lock, &cnt); std::size_t first_end_index = 0;
for (std::size_t i = 0; i < num_threads; i++) {
std::size_t cnt = dump_files_.size() / num_threads +
(i < dump_files_.size() % num_threads ? 1 : 0);
if (i == 0) {
first_end_index = cnt;
} else {
thread_mergers.emplace_back(&exported_headers_);
threads.emplace_back(DeDuplicateAbiElementsThread,
dump_files_.begin() + dump_files_index,
dump_files_.begin() + dump_files_index + cnt,
&exported_headers_, &thread_mergers.back());
} }
DeDuplicateAbiElementsThread(dump_files_, &exported_headers_, merger.get(), dump_files_index += cnt;
&merger_lock, &cnt); }
for (auto &thread : threads) { assert(dump_files_index == dump_files_.size());
thread.join();
DeDuplicateAbiElementsThread(dump_files_.begin(),
dump_files_.begin() + first_end_index,
&exported_headers_, merger.get());
for (std::size_t i = 0; i < threads.size(); i++) {
threads[i].join();
merger->MergeGraphs(thread_mergers[i].GetModule());
} }
return merger; return merger;