diff options
author | Hsin-Yi Chen <hsinyichen@google.com> | 2024-04-19 02:19:02 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-04-19 02:19:02 +0000 |
commit | 9d542ec7d152fddb550d10468c6bb2b7027948e7 (patch) | |
tree | 7224b1f2f65add95ae7208bb6fdc6c477d9061d7 | |
parent | 2d340ba5bc117b35218ec5f1e1bdcb3cd9937bc6 (diff) | |
parent | cd74b2f83b532f75235c878fa8f8591de5dcd4da (diff) | |
download | development-9d542ec7d152fddb550d10468c6bb2b7027948e7.tar.gz |
Merge "Add header-abi-linker -symbol-tag-policy" into main
4 files changed, 105 insertions, 21 deletions
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 a12677796..3ca3b0715 100644 --- a/vndk/tools/header-checker/src/linker/header_abi_linker.cpp +++ b/vndk/tools/header-checker/src/linker/header_abi_linker.cpp @@ -37,6 +37,7 @@ using namespace header_checker; +using header_checker::repr::ModeTagPolicy; using header_checker::repr::TextFormatIR; using header_checker::utils::CollectAllExportedHeaders; using header_checker::utils::HideIrrelevantCommandLineOptions; @@ -102,6 +103,18 @@ static llvm::cl::opt<std::string> api_map( "API levels."), llvm::cl::Optional, llvm::cl::cat(header_linker_category)); +static llvm::cl::opt<ModeTagPolicy> symbol_tag_policy( + "symbol-tag-policy", + llvm::cl::desc("Specify how to match -include-symbol-tag."), + llvm::cl::values(clEnumValN(ModeTagPolicy::MatchTagAndApi, "MatchTagAndApi", + "If a symbol has mode tags, match both the " + "mode tags and the \"introduced\" tag."), + clEnumValN(ModeTagPolicy::MatchTagOnly, "MatchTagOnly", + "If a symbol has mode tags, match the mode " + "tags and ignore the \"introduced\" tag.")), + llvm::cl::init(ModeTagPolicy::MatchTagAndApi), + llvm::cl::cat(header_linker_category)); + static llvm::cl::opt<std::string> arch( "arch", llvm::cl::desc("<arch>"), llvm::cl::Optional, llvm::cl::cat(header_linker_category)); @@ -496,6 +509,7 @@ static bool InitializeVersionScriptParser(repr::VersionScriptParser &parser) { return false; } } + parser.SetModeTagPolicy(symbol_tag_policy); return true; } 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 931064b21..2fc9bf4ea 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 @@ -185,6 +185,10 @@ VersionScriptParser::ParsedTags VersionScriptParser::ParseSymbolTags( bool VersionScriptParser::MatchModeTags(const ParsedTags &tags) { + if (included_mode_tags_.empty()) { + // Include all tags if the user does not specify the option. + return true; + } for (const auto &mode_tag : tags.mode_tags_) { auto included_mode_tag = included_mode_tags_.find(mode_tag.first); if (included_mode_tag != included_mode_tags_.end() && @@ -216,11 +220,18 @@ bool VersionScriptParser::IsSymbolExported(const ParsedTags &tags) { return false; } - if (!included_mode_tags_.empty() && !tags.mode_tags_.empty()) { - return MatchModeTags(tags); + if (tags.mode_tags_.empty()) { + return MatchIntroducedTags(tags); } - return MatchIntroducedTags(tags); + switch (mode_tag_policy_) { + case MatchTagAndApi: + return MatchModeTags(tags) && MatchIntroducedTags(tags); + case MatchTagOnly: + return MatchModeTags(tags); + } + // Unreachable + return false; } 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 0f468b55d..818450a61 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 @@ -28,6 +28,11 @@ namespace header_checker { namespace repr { +enum ModeTagPolicy { + MatchTagAndApi, + MatchTagOnly, +}; + class VersionScriptParser { private: // This comparison function allows finding elements by string_view. @@ -89,6 +94,8 @@ class VersionScriptParser { // Returns whether the argument is valid. bool AddModeTag(std::string_view mode_tag); + void SetModeTagPolicy(ModeTagPolicy policy) { mode_tag_policy_ = policy; } + void SetErrorHandler(std::unique_ptr<ErrorHandler> error_handler) { error_handler_ = std::move(error_handler); } @@ -133,6 +140,7 @@ class VersionScriptParser { utils::StringSet excluded_symbol_versions_; utils::StringSet excluded_symbol_tags_; ModeTagLevelMap included_mode_tags_; + ModeTagPolicy mode_tag_policy_; 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 41955f3b0..ed079c8a0 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 @@ -363,14 +363,11 @@ TEST(VersionScriptParserTest, IncludeSymbolTags) { always; # unknown api34; # introduced=34 api35; # introduced=35 - api35_llndk202404; # introduced=35 llndk=202404 + llndk202404; # llndk=202404 + llndk202504; # llndk=202504 systemapi; # systemapi systemapi_llndk; # systemapi llndk }; - LIBEX_2.0 { # introduced=36 - api36_llndk202504; - api36_llndk202504; # llndk=202504 - }; )TESTDATA"; { @@ -384,9 +381,8 @@ TEST(VersionScriptParserTest, IncludeSymbolTags) { const ExportedSymbolSet::FunctionMap &funcs = result->GetFunctions(); - EXPECT_THAT(funcs, - ElementsAre(Key("always"), Key("api34"), - Key("api35_llndk202404"), Key("systemapi_llndk"))); + EXPECT_THAT(funcs, ElementsAre(Key("always"), Key("api34"), + Key("llndk202404"), Key("systemapi_llndk"))); } { @@ -400,10 +396,9 @@ TEST(VersionScriptParserTest, IncludeSymbolTags) { const ExportedSymbolSet::FunctionMap &funcs = result->GetFunctions(); - EXPECT_THAT( - funcs, - ElementsAre(Key("always"), Key("api34"), Key("api35_llndk202404"), - Key("api36_llndk202504"), Key("systemapi_llndk"))); + EXPECT_THAT(funcs, + ElementsAre(Key("always"), Key("api34"), Key("llndk202404"), + Key("llndk202504"), Key("systemapi_llndk"))); } // Include all mode tags @@ -417,10 +412,9 @@ TEST(VersionScriptParserTest, IncludeSymbolTags) { const ExportedSymbolSet::FunctionMap &funcs = result->GetFunctions(); - EXPECT_THAT(funcs, - ElementsAre(Key("always"), Key("api34"), Key("api35"), - Key("api35_llndk202404"), Key("api36_llndk202504"), - Key("systemapi"), Key("systemapi_llndk"))); + EXPECT_THAT(funcs, ElementsAre(Key("always"), Key("api34"), Key("api35"), + Key("llndk202404"), Key("llndk202504"), + Key("systemapi"), Key("systemapi_llndk"))); } // Exclude all mode tags @@ -435,8 +429,65 @@ TEST(VersionScriptParserTest, IncludeSymbolTags) { const ExportedSymbolSet::FunctionMap &funcs = result->GetFunctions(); - EXPECT_THAT(funcs, ElementsAre(Key("always"), Key("api34"), Key("api35"), - Key("api36_llndk202504"))); + EXPECT_THAT(funcs, ElementsAre(Key("always"), Key("api34"), Key("api35"))); + } +} + + +TEST(VersionScriptParserTest, SetModeTagPolicy) { + static const char testdata[] = R"TESTDATA( + LIBEX_1.0 { # introduced=36 + api36; + api36_llndk202504; + api36_llndk202504; # llndk=202504 + llndk202504; # llndk=202504 + }; + )TESTDATA"; + + { + VersionScriptParser parser; + parser.SetApiLevel(35); + parser.AddModeTag("llndk=202504"); + parser.SetModeTagPolicy(ModeTagPolicy::MatchTagAndApi); + + std::istringstream stream(testdata); + std::unique_ptr<ExportedSymbolSet> result(parser.Parse(stream)); + ASSERT_TRUE(result); + + const ExportedSymbolSet::FunctionMap &funcs = result->GetFunctions(); + + EXPECT_TRUE(funcs.empty()); + } + + { + VersionScriptParser parser; + parser.SetApiLevel(35); + parser.AddModeTag("llndk=202504"); + parser.SetModeTagPolicy(ModeTagPolicy::MatchTagOnly); + + std::istringstream stream(testdata); + std::unique_ptr<ExportedSymbolSet> result(parser.Parse(stream)); + ASSERT_TRUE(result); + + const ExportedSymbolSet::FunctionMap &funcs = result->GetFunctions(); + + EXPECT_THAT(funcs, + ElementsAre(Key("api36_llndk202504"), Key("llndk202504"))); + } + + { + VersionScriptParser parser; + parser.SetApiLevel(36); + parser.SetModeTagPolicy(ModeTagPolicy::MatchTagAndApi); + + std::istringstream stream(testdata); + std::unique_ptr<ExportedSymbolSet> result(parser.Parse(stream)); + ASSERT_TRUE(result); + + const ExportedSymbolSet::FunctionMap &funcs = result->GetFunctions(); + + EXPECT_THAT(funcs, ElementsAre(Key("api36"), Key("api36_llndk202504"), + Key("llndk202504"))); } } |