diff --git a/vndk/tools/header-checker/src/linker/header_abi_linker.cpp b/vndk/tools/header-checker/src/linker/header_abi_linker.cpp index ef4186a5c..973802bb3 100644 --- a/vndk/tools/header-checker/src/linker/header_abi_linker.cpp +++ b/vndk/tools/header-checker/src/linker/header_abi_linker.cpp @@ -72,8 +72,10 @@ static llvm::cl::opt version_script( llvm::cl::cat(header_linker_category)); static llvm::cl::list excluded_symbol_versions( - "exclude-symbol-version", llvm::cl::Optional, - llvm::cl::cat(header_linker_category)); + "exclude-symbol-version", + llvm::cl::desc("Specify the glob patterns of the version blocks to be " + "excluded."), + llvm::cl::Optional, llvm::cl::cat(header_linker_category)); static llvm::cl::list excluded_symbol_tags( "exclude-symbol-tag", llvm::cl::Optional, diff --git a/vndk/tools/header-checker/src/repr/symbol/exported_symbol_set.cpp b/vndk/tools/header-checker/src/repr/symbol/exported_symbol_set.cpp index 873be2dff..2d9be6549 100644 --- a/vndk/tools/header-checker/src/repr/symbol/exported_symbol_set.cpp +++ b/vndk/tools/header-checker/src/repr/symbol/exported_symbol_set.cpp @@ -14,13 +14,12 @@ #include "repr/symbol/exported_symbol_set.h" +#include + #include "repr/ir_representation.h" #include "utils/stl_utils.h" #include "utils/string_utils.h" -#include -#include - namespace header_checker { namespace repr { @@ -31,24 +30,6 @@ static inline bool IsCppSymbol(const std::string &name) { } -static inline bool HasMatchingGlobPattern( - const ExportedSymbolSet::GlobPatternSet &patterns, const char *text) { - for (auto &&pattern : patterns) { - if (fnmatch(pattern.c_str(), text, 0) == 0) { - return true; - } - } - return false; -} - - -static inline bool HasMatchingGlobPattern( - const ExportedSymbolSet::GlobPatternSet &patterns, - const std::string &text) { - return HasMatchingGlobPattern(patterns, text.c_str()); -} - - void ExportedSymbolSet::AddFunction(const std::string &name, ElfSymbolIR::ElfSymbolBinding binding) { funcs_.emplace(name, ElfFunctionIR(name, binding)); @@ -70,7 +51,7 @@ bool ExportedSymbolSet::HasSymbol(const std::string &name) const { return true; } - if (HasMatchingGlobPattern(glob_patterns_, name)) { + if (utils::HasMatchingGlobPattern(glob_patterns_, name.c_str())) { return true; } @@ -86,8 +67,8 @@ bool ExportedSymbolSet::HasSymbol(const std::string &name) const { return true; } - if (HasMatchingGlobPattern(demangled_cpp_glob_patterns_, - demangled_name_c_str.get())) { + if (utils::HasMatchingGlobPattern(demangled_cpp_glob_patterns_, + demangled_name_c_str.get())) { return true; } } diff --git a/vndk/tools/header-checker/src/repr/symbol/exported_symbol_set.h b/vndk/tools/header-checker/src/repr/symbol/exported_symbol_set.h index a5ca03def..fc764d66a 100644 --- a/vndk/tools/header-checker/src/repr/symbol/exported_symbol_set.h +++ b/vndk/tools/header-checker/src/repr/symbol/exported_symbol_set.h @@ -16,6 +16,7 @@ #define EXPORTED_SYMBOL_SET_ #include "repr/ir_representation.h" +#include #include #include @@ -31,8 +32,8 @@ class ExportedSymbolSet { public: using FunctionMap = std::map>; using VarMap = std::map>; - using NameSet = std::set>; - using GlobPatternSet = std::set>; + using NameSet = utils::StringSet; + using GlobPatternSet = utils::StringSet; public: diff --git a/vndk/tools/header-checker/src/repr/symbol/version_script_parser.cpp b/vndk/tools/header-checker/src/repr/symbol/version_script_parser.cpp index 9d962d6a5..658cb3f66 100644 --- a/vndk/tools/header-checker/src/repr/symbol/version_script_parser.cpp +++ b/vndk/tools/header-checker/src/repr/symbol/version_script_parser.cpp @@ -277,8 +277,8 @@ std::unique_ptr VersionScriptParser::Parse( } std::string version(utils::Trim(line.substr(0, lparen_pos - 1))); - bool exclude_symbol_version = (excluded_symbol_versions_.find(version) != - excluded_symbol_versions_.end()); + bool exclude_symbol_version = utils::HasMatchingGlobPattern( + excluded_symbol_versions_, version.c_str()); if (!ParseVersionBlock(exclude_symbol_version)) { return nullptr; diff --git a/vndk/tools/header-checker/src/repr/symbol/version_script_parser.h b/vndk/tools/header-checker/src/repr/symbol/version_script_parser.h index d3bb63708..b1c662161 100644 --- a/vndk/tools/header-checker/src/repr/symbol/version_script_parser.h +++ b/vndk/tools/header-checker/src/repr/symbol/version_script_parser.h @@ -116,8 +116,8 @@ class VersionScriptParser { std::string introduced_arch_tag_; utils::ApiLevel api_level_; - std::set> excluded_symbol_versions_; - std::set> excluded_symbol_tags_; + utils::StringSet excluded_symbol_versions_; + utils::StringSet excluded_symbol_tags_; std::istream *stream_; int line_no_; diff --git a/vndk/tools/header-checker/src/repr/symbol/version_script_parser_test.cpp b/vndk/tools/header-checker/src/repr/symbol/version_script_parser_test.cpp index 7984f580e..aca8e9dde 100644 --- a/vndk/tools/header-checker/src/repr/symbol/version_script_parser_test.cpp +++ b/vndk/tools/header-checker/src/repr/symbol/version_script_parser_test.cpp @@ -94,10 +94,9 @@ TEST(VersionScriptParserTest, ExcludeSymbolVersions) { EXPECT_NE(vars.end(), vars.find("bar2")); } - // excluded_symbol_versions = {"LIBEX_PRIVATE"} { VersionScriptParser parser; - parser.AddExcludedSymbolVersion("LIBEX_PRIVATE"); + parser.AddExcludedSymbolVersion("*_PRIVATE"); std::istringstream stream(testdata); std::unique_ptr result(parser.Parse(stream)); diff --git a/vndk/tools/header-checker/src/utils/string_utils.cpp b/vndk/tools/header-checker/src/utils/string_utils.cpp index 687e9c443..8cb205310 100644 --- a/vndk/tools/header-checker/src/utils/string_utils.cpp +++ b/vndk/tools/header-checker/src/utils/string_utils.cpp @@ -14,7 +14,7 @@ #include "utils/string_utils.h" -#include +#include #include #include @@ -22,6 +22,8 @@ #include #include +#include + namespace header_checker { namespace utils { @@ -104,5 +106,15 @@ bool IsGlobPattern(std::string_view s) { } +bool HasMatchingGlobPattern(const StringSet &patterns, const char *text) { + for (auto &&pattern : patterns) { + if (fnmatch(pattern.c_str(), text, 0) == 0) { + return true; + } + } + return false; +} + + } // namespace utils } // namespace header_checker diff --git a/vndk/tools/header-checker/src/utils/string_utils.h b/vndk/tools/header-checker/src/utils/string_utils.h index a42c9a546..2111377fd 100644 --- a/vndk/tools/header-checker/src/utils/string_utils.h +++ b/vndk/tools/header-checker/src/utils/string_utils.h @@ -17,6 +17,7 @@ #include +#include #include #include @@ -25,6 +26,9 @@ namespace header_checker { namespace utils { +// This comparison function allows finding elements by string_view. +using StringSet = std::set>; + std::string_view Trim(std::string_view s); bool StartsWith(std::string_view s, std::string_view prefix); @@ -40,6 +44,8 @@ bool ParseBool(const std::string &s); bool IsGlobPattern(std::string_view s); +bool HasMatchingGlobPattern(const StringSet &patterns, const char *text); + } // namespace utils } // namespace header_checker diff --git a/vndk/tools/header-checker/tests/module.py b/vndk/tools/header-checker/tests/module.py index 255576138..869f0675a 100755 --- a/vndk/tools/header-checker/tests/module.py +++ b/vndk/tools/header-checker/tests/module.py @@ -562,7 +562,7 @@ TEST_MODULES = [ 'integration/version_script_example/prebuilts/' + 'libversion_script_example.so' ), - '--exclude-symbol-version', 'LIBVERSION_SCRIPT_EXAMPLE_PRIVATE', + '--exclude-symbol-version', '*_PRIVATE', ], has_reference_dump=True, ),