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 <memory>
#include <mutex> #include <mutex>
#include <fstream> #include <fstream>
#include <functional>
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <thread> #include <thread>
@@ -90,16 +91,10 @@ class HeaderAbiLinker {
bool LinkAndDump(); bool LinkAndDump();
private: 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> 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(); bool ParseVersionScriptFiles();
@@ -273,11 +268,11 @@ static std::regex CreateRegexMatchExprFromSet(
return std::regex(all_regex_match_str); return std::regex(all_regex_match_str);
} }
template <typename T, typename LinkMapType> template <typename T>
bool HeaderAbiLinker::LinkDecl( bool HeaderAbiLinker::LinkDecl(
abi_util::IRDumper *dst, std::map<std::string, LinkMapType> *link_map, abi_util::IRDumper *dst,
std::set<std::string> *regex_matched_link_set, const std::regex *vs_regex, const abi_util::AbiElementMap<T> &src,
const abi_util::AbiElementMap<T> &src, bool use_version_script_or_so) { const std::function<bool(const std::string &)> &symbol_filter) {
assert(dst != nullptr); assert(dst != nullptr);
for (auto &&element : src) { for (auto &&element : src) {
// If we are not using a version script and exported headers are available, // 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()) { exported_headers_.find(source_file) == exported_headers_.end()) {
continue; continue;
} }
const std::string &element_str = element.first; // Check for the existence of the element in version script / symbol file.
// Check for the existence of the element in linked dump / symbol file. if (!symbol_filter(element.first)) {
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()) {
continue; continue;
} }
if (!dst->AddLinkableMessageIR(&(element.second))) { if (!dst->AddLinkableMessageIR(&(element.second))) {
@@ -335,38 +298,42 @@ bool HeaderAbiLinker::LinkDecl(abi_util::IRDumper *dst,
bool HeaderAbiLinker::LinkTypes(const abi_util::TextFormatToIRReader *reader, bool HeaderAbiLinker::LinkTypes(const abi_util::TextFormatToIRReader *reader,
abi_util::IRDumper *ir_dumper) { abi_util::IRDumper *ir_dumper) {
assert(reader != nullptr); assert(reader != nullptr);
assert(ir_dumper != nullptr); auto no_filter = [](const std::string &symbol) { return true; };
return LinkDecl(ir_dumper, reader->GetRecordTypes()) && return LinkDecl(ir_dumper, reader->GetRecordTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetEnumTypes()) && LinkDecl(ir_dumper, reader->GetEnumTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetFunctionTypes()) && LinkDecl(ir_dumper, reader->GetFunctionTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetBuiltinTypes()) && LinkDecl(ir_dumper, reader->GetBuiltinTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetPointerTypes()) && LinkDecl(ir_dumper, reader->GetPointerTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetRvalueReferenceTypes()) && LinkDecl(ir_dumper, reader->GetRvalueReferenceTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetLvalueReferenceTypes()) && LinkDecl(ir_dumper, reader->GetLvalueReferenceTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetArrayTypes()) && LinkDecl(ir_dumper, reader->GetArrayTypes(), no_filter) &&
LinkDecl(ir_dumper, reader->GetQualifiedTypes()); LinkDecl(ir_dumper, reader->GetQualifiedTypes(), no_filter);
} }
bool HeaderAbiLinker::LinkFunctions( bool HeaderAbiLinker::LinkFunctions(
const abi_util::TextFormatToIRReader *reader, const abi_util::TextFormatToIRReader *reader,
abi_util::IRDumper *ir_dumper) { abi_util::IRDumper *ir_dumper) {
assert(reader != nullptr); assert(reader != nullptr);
return LinkDecl(ir_dumper, &function_decl_map_, auto symbol_filter = [this](const std::string &linker_set_key) {
&functions_regex_matched_set, &functions_vs_regex_, return function_decl_map_.find(linker_set_key) !=
reader->GetFunctions(), function_decl_map_.end() ||
(!version_script_.empty() || !so_file_.empty())); QueryRegexMatches(&functions_regex_matched_set, &functions_vs_regex_,
linker_set_key);
};
return LinkDecl(ir_dumper, reader->GetFunctions(), symbol_filter);
} }
bool HeaderAbiLinker::LinkGlobalVars( bool HeaderAbiLinker::LinkGlobalVars(
const abi_util::TextFormatToIRReader *reader, const abi_util::TextFormatToIRReader *reader,
abi_util::IRDumper *ir_dumper) { abi_util::IRDumper *ir_dumper) {
assert(reader != nullptr); assert(reader != nullptr);
return LinkDecl(ir_dumper, &globvar_decl_map_, auto symbol_filter = [this](const std::string &linker_set_key) {
&globvars_regex_matched_set, &globvars_vs_regex_, return globvar_decl_map_.find(linker_set_key) !=
reader->GetGlobalVariables(), globvar_decl_map_.end() ||
(!version_script.empty() || !so_file_.empty())); QueryRegexMatches(&globvars_regex_matched_set, &globvars_vs_regex_,
linker_set_key);
};
return LinkDecl(ir_dumper, reader->GetGlobalVariables(), symbol_filter);
} }
bool HeaderAbiLinker::ParseVersionScriptFiles() { bool HeaderAbiLinker::ParseVersionScriptFiles() {