Merge "Refactor LinkDecl in header-abi-linker"
am: fa1f9365ca
Change-Id: I086c56101f6a5c642f43b2142e13aeef08c394c8
This commit is contained in:
@@ -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,47 +268,11 @@ static std::regex CreateRegexMatchExprFromSet(
|
||||
return std::regex(all_regex_match_str);
|
||||
}
|
||||
|
||||
template <typename T, typename LinkMapType>
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
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) {
|
||||
bool HeaderAbiLinker::LinkDecl(
|
||||
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,
|
||||
@@ -324,6 +283,10 @@ bool HeaderAbiLinker::LinkDecl(abi_util::IRDumper *dst,
|
||||
exported_headers_.find(source_file) == exported_headers_.end()) {
|
||||
continue;
|
||||
}
|
||||
// Check for the existence of the element in version script / symbol file.
|
||||
if (!symbol_filter(element.first)) {
|
||||
continue;
|
||||
}
|
||||
if (!dst->AddLinkableMessageIR(&(element.second))) {
|
||||
llvm::errs() << "Failed to add element to linked dump\n";
|
||||
return false;
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user