Merge "Refactor LinkDecl in header-abi-linker"

am: fa1f9365ca

Change-Id: I086c56101f6a5c642f43b2142e13aeef08c394c8
This commit is contained in:
Yi-yo Chiang
2018-08-31 21:06:24 -07:00
committed by android-build-merger

View File

@@ -21,6 +21,7 @@
#include <memory>
#include <mutex>
#include <fstream>
#include <functional>
#include <iostream>
#include <string>
#include <thread>
@@ -90,16 +91,10 @@ class HeaderAbiLinker {
bool LinkAndDump();
private:
template <typename T, typename LinkMapType>
bool LinkDecl(abi_util::IRDumper *dst,
std::map<std::string, LinkMapType> *link_map,
std::set<std::string> *regex_matched_link_set,
const std::regex *vs_regex,
const abi_util::AbiElementMap<T> &src,
bool use_version_script);
template <typename T>
bool LinkDecl(abi_util::IRDumper *dst, const abi_util::AbiElementMap<T> &src);
bool LinkDecl(abi_util::IRDumper *dst,
const abi_util::AbiElementMap<T> &src,
const std::function<bool(const std::string &)> &symbol_filter);
bool ParseVersionScriptFiles();
@@ -273,11 +268,11 @@ static std::regex CreateRegexMatchExprFromSet(
return std::regex(all_regex_match_str);
}
template <typename T, typename LinkMapType>
template <typename T>
bool HeaderAbiLinker::LinkDecl(
abi_util::IRDumper *dst, std::map<std::string, LinkMapType> *link_map,
std::set<std::string> *regex_matched_link_set, const std::regex *vs_regex,
const abi_util::AbiElementMap<T> &src, bool use_version_script_or_so) {
abi_util::IRDumper *dst,
const abi_util::AbiElementMap<T> &src,
const std::function<bool(const std::string &)> &symbol_filter) {
assert(dst != nullptr);
for (auto &&element : src) {
// If we are not using a version script and exported headers are available,
@@ -288,40 +283,8 @@ bool HeaderAbiLinker::LinkDecl(
exported_headers_.find(source_file) == exported_headers_.end()) {
continue;
}
const std::string &element_str = element.first;
// Check for the existence of the element in linked dump / symbol file.
if (use_version_script_or_so) {
assert(link_map != nullptr);
typename std::map<std::string, LinkMapType>::iterator it =
link_map->find(element_str);
if (it == link_map->end()) {
if (!QueryRegexMatches(regex_matched_link_set, vs_regex, element_str)) {
continue;
}
} else {
// We get a pre-filled link name set while using version script.
link_map->erase(it); // Avoid multiple instances of the same symbol.
}
}
if (!dst->AddLinkableMessageIR(&(element.second))) {
llvm::errs() << "Failed to add element to linked dump\n";
return false;
}
}
return true;
}
template <typename T>
bool HeaderAbiLinker::LinkDecl(abi_util::IRDumper *dst,
const abi_util::AbiElementMap<T> &src) {
assert(dst != nullptr);
for (auto &&element : src) {
// If we are not using a version script and exported headers are available,
// filter out unexported abi.
std::string source_file = element.second.GetSourceFile();
// Builtin types will not have source file information.
if (!exported_headers_.empty() && !source_file.empty() &&
exported_headers_.find(source_file) == exported_headers_.end()) {
// Check for the existence of the element in version script / symbol file.
if (!symbol_filter(element.first)) {
continue;
}
if (!dst->AddLinkableMessageIR(&(element.second))) {
@@ -335,38 +298,42 @@ bool HeaderAbiLinker::LinkDecl(abi_util::IRDumper *dst,
bool HeaderAbiLinker::LinkTypes(const abi_util::TextFormatToIRReader *reader,
abi_util::IRDumper *ir_dumper) {
assert(reader != nullptr);
assert(ir_dumper != nullptr);
return LinkDecl(ir_dumper, reader->GetRecordTypes()) &&
LinkDecl(ir_dumper, reader->GetEnumTypes()) &&
LinkDecl(ir_dumper, reader->GetFunctionTypes()) &&
LinkDecl(ir_dumper, reader->GetBuiltinTypes()) &&
LinkDecl(ir_dumper, reader->GetPointerTypes()) &&
LinkDecl(ir_dumper, reader->GetRvalueReferenceTypes()) &&
LinkDecl(ir_dumper, reader->GetLvalueReferenceTypes()) &&
LinkDecl(ir_dumper, reader->GetArrayTypes()) &&
LinkDecl(ir_dumper, reader->GetQualifiedTypes());
auto no_filter = [](const std::string &symbol) { return true; };
return LinkDecl(ir_dumper, reader->GetRecordTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetEnumTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetFunctionTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetBuiltinTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetPointerTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetRvalueReferenceTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetLvalueReferenceTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetArrayTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetQualifiedTypes(), no_filter);
}
bool HeaderAbiLinker::LinkFunctions(
const abi_util::TextFormatToIRReader *reader,
abi_util::IRDumper *ir_dumper) {
assert(reader != nullptr);
return LinkDecl(ir_dumper, &function_decl_map_,
&functions_regex_matched_set, &functions_vs_regex_,
reader->GetFunctions(),
(!version_script_.empty() || !so_file_.empty()));
auto symbol_filter = [this](const std::string &linker_set_key) {
return function_decl_map_.find(linker_set_key) !=
function_decl_map_.end() ||
QueryRegexMatches(&functions_regex_matched_set, &functions_vs_regex_,
linker_set_key);
};
return LinkDecl(ir_dumper, reader->GetFunctions(), symbol_filter);
}
bool HeaderAbiLinker::LinkGlobalVars(
const abi_util::TextFormatToIRReader *reader,
abi_util::IRDumper *ir_dumper) {
assert(reader != nullptr);
return LinkDecl(ir_dumper, &globvar_decl_map_,
&globvars_regex_matched_set, &globvars_vs_regex_,
reader->GetGlobalVariables(),
(!version_script.empty() || !so_file_.empty()));
auto symbol_filter = [this](const std::string &linker_set_key) {
return globvar_decl_map_.find(linker_set_key) !=
globvar_decl_map_.end() ||
QueryRegexMatches(&globvars_regex_matched_set, &globvars_vs_regex_,
linker_set_key);
};
return LinkDecl(ir_dumper, reader->GetGlobalVariables(), symbol_filter);
}
bool HeaderAbiLinker::ParseVersionScriptFiles() {