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
This commit is contained in:
Hsin-Yi Chen
2023-09-25 17:49:18 +08:00
parent 4b76dd3526
commit ffb3f17223
5 changed files with 67 additions and 28 deletions

View File

@@ -280,7 +280,8 @@ std::unique_ptr<ExportedSymbolSet> 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;
}
}

View File

@@ -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<ExportedSymbolSet> 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<ExportedSymbolSet> 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<ExportedSymbolSet> result(parser.Parse(stream));

View File

@@ -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;

View File

@@ -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=[

View File

@@ -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"
}