From ffb3f17223ef44b497d2b6f7597241cd3676c2fd Mon Sep 17 00:00:00 2001 From: Hsin-Yi Chen Date: Mon, 25 Sep 2023 17:49:18 +0800 Subject: [PATCH] Parse tags attached to version blocks header-abi-linker follows the rules in build/soong/docs/map_files.md to parse version scripts. Test: ANDROID_BUILD_TOP=`realpath .` \ PATH=$PATH:`realpath out/soong/dist/bin` \ development/vndk/tools/header-checker/tests/test.py Test: LD_LIBRARY_PATH=out/soong/dist/lib64 \ out/soong/host/linux-x86/nativetest64/header-checker-unittests/header-checker-unittests Bug: 298626434 Change-Id: I7305a6a299f4878dfb9529fd5c6040c3c1d11f8f --- .../src/repr/symbol/version_script_parser.cpp | 3 +- .../symbol/version_script_parser_test.cpp | 47 +++++++++++++++++-- .../version_script_example/map.txt | 17 +++++++ vndk/tools/header-checker/tests/module.py | 6 +-- ...bversion_script_example_no_mytag.so.lsdump | 22 ++------- 5 files changed, 67 insertions(+), 28 deletions(-) create mode 100644 vndk/tools/header-checker/tests/integration/version_script_example/map.txt 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 658cb3f66..60e204b96 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 @@ -280,7 +280,8 @@ std::unique_ptr VersionScriptParser::Parse( bool exclude_symbol_version = utils::HasMatchingGlobPattern( excluded_symbol_versions_, version.c_str()); - if (!ParseVersionBlock(exclude_symbol_version)) { + ParsedTags tags = ParseSymbolTags(line); + if (!ParseVersionBlock(exclude_symbol_version || !IsSymbolExported(tags))) { return nullptr; } } 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 aca8e9dde..465119a14 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 @@ -165,15 +165,34 @@ TEST(VersionScriptParserTest, VisibilityLabels) { TEST(VersionScriptParserTest, ParseSymbolTagsIntroduced) { static const char testdata[] = R"TESTDATA( - LIBEX_1.0 { + LIBEX_1.0 { # introduced=18 global: test1; # introduced=19 test2; # introduced=19 introduced-arm64=20 test3; # introduced-arm64=20 introduced=19 test4; # future + test5; # introduced=17 }; )TESTDATA"; + { + VersionScriptParser parser; + parser.SetArch("arm64"); + parser.SetApiLevel(17); + + std::istringstream stream(testdata); + std::unique_ptr result(parser.Parse(stream)); + ASSERT_TRUE(result); + + const ExportedSymbolSet::FunctionMap &funcs = result->GetFunctions(); + + EXPECT_EQ(funcs.end(), funcs.find("test1")); + EXPECT_EQ(funcs.end(), funcs.find("test2")); + EXPECT_EQ(funcs.end(), funcs.find("test3")); + EXPECT_EQ(funcs.end(), funcs.find("test4")); + EXPECT_EQ(funcs.end(), funcs.find("test5")); + } + { VersionScriptParser parser; parser.SetArch("arm64"); @@ -189,6 +208,7 @@ TEST(VersionScriptParserTest, ParseSymbolTagsIntroduced) { EXPECT_EQ(funcs.end(), funcs.find("test2")); EXPECT_EQ(funcs.end(), funcs.find("test3")); EXPECT_EQ(funcs.end(), funcs.find("test4")); + EXPECT_NE(funcs.end(), funcs.find("test5")); } { @@ -206,6 +226,7 @@ TEST(VersionScriptParserTest, ParseSymbolTagsIntroduced) { EXPECT_EQ(funcs.end(), funcs.find("test2")); EXPECT_EQ(funcs.end(), funcs.find("test3")); EXPECT_EQ(funcs.end(), funcs.find("test4")); + EXPECT_NE(funcs.end(), funcs.find("test5")); } { @@ -223,6 +244,7 @@ TEST(VersionScriptParserTest, ParseSymbolTagsIntroduced) { EXPECT_NE(funcs.end(), funcs.find("test2")); EXPECT_NE(funcs.end(), funcs.find("test3")); EXPECT_EQ(funcs.end(), funcs.find("test4")); + EXPECT_NE(funcs.end(), funcs.find("test5")); } { @@ -240,6 +262,7 @@ TEST(VersionScriptParserTest, ParseSymbolTagsIntroduced) { EXPECT_NE(funcs.end(), funcs.find("test2")); EXPECT_NE(funcs.end(), funcs.find("test3")); EXPECT_EQ(funcs.end(), funcs.find("test4")); + EXPECT_NE(funcs.end(), funcs.find("test5")); } { @@ -257,6 +280,7 @@ TEST(VersionScriptParserTest, ParseSymbolTagsIntroduced) { EXPECT_NE(funcs.end(), funcs.find("test2")); EXPECT_NE(funcs.end(), funcs.find("test3")); EXPECT_NE(funcs.end(), funcs.find("test4")); + EXPECT_NE(funcs.end(), funcs.find("test5")); } } @@ -324,10 +348,10 @@ TEST(VersionScriptParserTest, ParseSymbolTagsArch) { TEST(VersionScriptParserTest, ExcludeSymbolTags) { static const char testdata[] = R"TESTDATA( - LIBEX_1.0 { + LIBEX_1.0 { # exclude-tag-1 global: test1; - test2; # exclude-tag + test2; # exclude-tag-2 }; )TESTDATA"; @@ -345,10 +369,23 @@ TEST(VersionScriptParserTest, ExcludeSymbolTags) { EXPECT_NE(funcs.end(), funcs.find("test2")); } - // exclude_symbol_tags = {"exclude-tag"} { VersionScriptParser parser; - parser.AddExcludedSymbolTag("exclude-tag"); + parser.AddExcludedSymbolTag("exclude-tag-1"); + + std::istringstream stream(testdata); + std::unique_ptr result(parser.Parse(stream)); + ASSERT_TRUE(result); + + const ExportedSymbolSet::FunctionMap &funcs = result->GetFunctions(); + + EXPECT_EQ(funcs.end(), funcs.find("test1")); + EXPECT_EQ(funcs.end(), funcs.find("test2")); + } + + { + VersionScriptParser parser; + parser.AddExcludedSymbolTag("exclude-tag-2"); std::istringstream stream(testdata); std::unique_ptr result(parser.Parse(stream)); diff --git a/vndk/tools/header-checker/tests/integration/version_script_example/map.txt b/vndk/tools/header-checker/tests/integration/version_script_example/map.txt new file mode 100644 index 000000000..ace847946 --- /dev/null +++ b/vndk/tools/header-checker/tests/integration/version_script_example/map.txt @@ -0,0 +1,17 @@ +LIBVERSION_SCRIPT_EXAMPLE_1.0 { + global: + test1; + extern "C++" { + Test3::*; # mytag + }; + local: + *; +}; + +LIBVERSION_SCRIPT_EXAMPLE_PRIVATE { # mytag + global: + test2; + extern "C++" { + Test4::*; + }; +} LIBVERSION_SCRIPT_EXAMPLE_1.0; diff --git a/vndk/tools/header-checker/tests/module.py b/vndk/tools/header-checker/tests/module.py index 869f0675a..9e960ceba 100755 --- a/vndk/tools/header-checker/tests/module.py +++ b/vndk/tools/header-checker/tests/module.py @@ -533,7 +533,7 @@ TEST_MODULES = [ srcs=[ 'integration/version_script_example/example.cpp', ], - version_script='integration/version_script_example/example.map.txt', + version_script='integration/version_script_example/map.txt', export_include_dirs=['integration/version_script_example'], dumper_flags=['-output-format', 'Json'], linker_flags=[ @@ -552,7 +552,7 @@ TEST_MODULES = [ srcs=[ 'integration/version_script_example/example.cpp', ], - version_script='integration/version_script_example/example.map.txt', + version_script='integration/version_script_example/map.txt', export_include_dirs=['integration/version_script_example'], dumper_flags=['-output-format', 'Json'], linker_flags=[ @@ -572,7 +572,7 @@ TEST_MODULES = [ srcs=[ 'integration/version_script_example/example.cpp', ], - version_script='integration/version_script_example/example.map.txt', + version_script='integration/version_script_example/map.txt', export_include_dirs=['integration/version_script_example'], dumper_flags=['-output-format', 'Json'], linker_flags=[ diff --git a/vndk/tools/header-checker/tests/reference_dumps/arm64/libversion_script_example_no_mytag.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/arm64/libversion_script_example_no_mytag.so.lsdump index 33681ad86..9acf402bf 100644 --- a/vndk/tools/header-checker/tests/reference_dumps/arm64/libversion_script_example_no_mytag.so.lsdump +++ b/vndk/tools/header-checker/tests/reference_dumps/arm64/libversion_script_example_no_mytag.so.lsdump @@ -12,10 +12,7 @@ "elf_functions" : [ { - "name" : "_ZN5Test44testEv" - }, - { - "name" : "test2" + "name" : "test1" } ], "elf_objects" : [], @@ -24,21 +21,8 @@ "functions" : [ { - "function_name" : "Test4::test", - "linker_set_key" : "_ZN5Test44testEv", - "parameters" : - [ - { - "is_this_ptr" : true, - "referenced_type" : "_ZTIP5Test4" - } - ], - "return_type" : "_ZTIv", - "source_file" : "development/vndk/tools/header-checker/tests/integration/version_script_example/example.h" - }, - { - "function_name" : "test2", - "linker_set_key" : "test2", + "function_name" : "test1", + "linker_set_key" : "test1", "return_type" : "_ZTIv", "source_file" : "development/vndk/tools/header-checker/tests/integration/version_script_example/example.h" }