Merge "Refactor LinkDecl in header-abi-linker"
am: fa1f9365ca
Change-Id: I086c56101f6a5c642f43b2142e13aeef08c394c8
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user