diff --git a/vndk/tools/header-checker/src/repr/abi_diff_helpers.cpp b/vndk/tools/header-checker/src/repr/abi_diff_helpers.cpp index 328c30807..7025d9237 100644 --- a/vndk/tools/header-checker/src/repr/abi_diff_helpers.cpp +++ b/vndk/tools/header-checker/src/repr/abi_diff_helpers.cpp @@ -755,6 +755,19 @@ DiffStatus AbiDiffHelper::CompareQualifiedTypes( type_queue, diff_kind); } +DiffStatus AbiDiffHelper::CompareArrayTypes(const ArrayTypeIR *old_type, + const ArrayTypeIR *new_type, + std::deque *type_queue, + DiffMessageIR::DiffKind diff_kind) { + if (!CompareSizeAndAlignment(old_type, new_type) || + old_type->IsOfUnknownBound() != new_type->IsOfUnknownBound()) { + return DiffStatus::kDirectDiff; + } + return CompareAndDumpTypeDiff(old_type->GetReferencedType(), + new_type->GetReferencedType(), type_queue, + diff_kind); +} + DiffStatus AbiDiffHelper::ComparePointerTypes( const PointerTypeIR *old_type, const PointerTypeIR *new_type, @@ -977,65 +990,59 @@ DiffStatus AbiDiffHelper::CompareAndDumpTypeDiff( return DiffStatus::kNoDiff; } - if (kind == LinkableMessageKind::BuiltinTypeKind) { - return CompareBuiltinTypes( - static_cast(old_type), - static_cast(new_type)); - } + switch (kind) { + case LinkableMessageKind::BuiltinTypeKind: + return CompareBuiltinTypes(static_cast(old_type), + static_cast(new_type)); + case LinkableMessageKind::QualifiedTypeKind: + return CompareQualifiedTypes( + static_cast(old_type), + static_cast(new_type), type_queue, + diff_kind); + case LinkableMessageKind::ArrayTypeKind: + return CompareArrayTypes(static_cast(old_type), + static_cast(new_type), + type_queue, diff_kind); + case LinkableMessageKind::EnumTypeKind: + return CompareEnumTypes(static_cast(old_type), + static_cast(new_type), + type_queue, diff_kind); - if (kind == LinkableMessageKind::QualifiedTypeKind) { - return CompareQualifiedTypes( - static_cast(old_type), - static_cast(new_type), - type_queue, diff_kind); - } + case LinkableMessageKind::LvalueReferenceTypeKind: + return CompareLvalueReferenceTypes( + static_cast(old_type), + static_cast(new_type), type_queue, + diff_kind); + case LinkableMessageKind::RvalueReferenceTypeKind: + return CompareRvalueReferenceTypes( + static_cast(old_type), + static_cast(new_type), type_queue, + diff_kind); + case LinkableMessageKind::PointerTypeKind: + return ComparePointerTypes(static_cast(old_type), + static_cast(new_type), + type_queue, diff_kind); - if (kind == LinkableMessageKind::EnumTypeKind) { - return CompareEnumTypes( - static_cast(old_type), - static_cast(new_type), - type_queue, diff_kind); - } + case LinkableMessageKind::RecordTypeKind: + return CompareRecordTypes(static_cast(old_type), + static_cast(new_type), + type_queue, diff_kind); - if (kind == LinkableMessageKind::LvalueReferenceTypeKind) { - return CompareLvalueReferenceTypes( - static_cast(old_type), - static_cast(new_type), - type_queue, diff_kind); - } - - if (kind == LinkableMessageKind::RvalueReferenceTypeKind) { - return CompareRvalueReferenceTypes( - static_cast(old_type), - static_cast(new_type), - type_queue, diff_kind); - } - - if (kind == LinkableMessageKind::PointerTypeKind) { - return ComparePointerTypes( - static_cast(old_type), - static_cast(new_type), - type_queue, diff_kind); - } - - if (kind == LinkableMessageKind::RecordTypeKind) { - return CompareRecordTypes( - static_cast(old_type), - static_cast(new_type), - type_queue, diff_kind); - } - - if (kind == LinkableMessageKind::FunctionTypeKind) { - DiffStatus result = CompareFunctionTypes( - static_cast(old_type), - static_cast(new_type), type_queue, diff_kind); - // Do not allow extending function pointers, function references, etc. - if (result.IsExtension()) { - result.CombineWith(DiffStatus::kDirectDiff); + case LinkableMessageKind::FunctionTypeKind: { + DiffStatus result = CompareFunctionTypes( + static_cast(old_type), + static_cast(new_type), type_queue, diff_kind); + // Do not allow extending function pointers, function references, etc. + if (result.IsExtension()) { + result.CombineWith(DiffStatus::kDirectDiff); + } + return result; } - return result; + case LinkableMessageKind::FunctionKind: + case LinkableMessageKind::GlobalVarKind: + llvm::errs() << "Unexpected LinkableMessageKind: " << kind << "\n"; + ::exit(1); } - return DiffStatus::kNoDiff; } static DiffStatus CompareDistinctKindMessages( diff --git a/vndk/tools/header-checker/src/repr/abi_diff_helpers.h b/vndk/tools/header-checker/src/repr/abi_diff_helpers.h index 5483f1dcb..32d4349c5 100644 --- a/vndk/tools/header-checker/src/repr/abi_diff_helpers.h +++ b/vndk/tools/header-checker/src/repr/abi_diff_helpers.h @@ -140,6 +140,11 @@ class AbiDiffHelper { std::deque *type_queue, IRDiffDumper::DiffKind diff_kind); + DiffStatus CompareArrayTypes(const ArrayTypeIR *old_type, + const ArrayTypeIR *new_type, + std::deque *type_queue, + IRDiffDumper::DiffKind diff_kind); + DiffStatus ComparePointerTypes(const PointerTypeIR *old_type, const PointerTypeIR *new_type, std::deque *type_queue, diff --git a/vndk/tools/header-checker/tests/integration/array/include/base.h b/vndk/tools/header-checker/tests/integration/array/include/base.h new file mode 100644 index 000000000..5063c8e6a --- /dev/null +++ b/vndk/tools/header-checker/tests/integration/array/include/base.h @@ -0,0 +1,13 @@ +struct Struct { + int array[0]; +}; + +extern "C" { +void StructMember(Struct &); +void Pointer(int[]); +void DoublePointer(int **); +void PointerToArray(int (*)[]); +void PointerTo2DArray(int (*)[][10]); +void Reference(int (&)[][1]); +void Element(int (*)[2]); +} diff --git a/vndk/tools/header-checker/tests/integration/array/include/diff.h b/vndk/tools/header-checker/tests/integration/array/include/diff.h new file mode 100644 index 000000000..f256841f6 --- /dev/null +++ b/vndk/tools/header-checker/tests/integration/array/include/diff.h @@ -0,0 +1,13 @@ +struct Struct { + int array[]; +}; + +extern "C" { +void StructMember(Struct &); +void Pointer(int *); +void DoublePointer(int *[]); +void PointerToArray(int (*)[10]); +void PointerTo2DArray(int (*)[10][10]); +void Reference(int (&)[][11]); +void Element(short (*)[2]); +} diff --git a/vndk/tools/header-checker/tests/integration/array/map.txt b/vndk/tools/header-checker/tests/integration/array/map.txt new file mode 100644 index 000000000..f0508f634 --- /dev/null +++ b/vndk/tools/header-checker/tests/integration/array/map.txt @@ -0,0 +1,10 @@ +libarray { + global: + StructMember; + Pointer; + DoublePointer; + PointerToArray; + PointerTo2DArray; + Reference; + Element; +}; diff --git a/vndk/tools/header-checker/tests/module.py b/vndk/tools/header-checker/tests/module.py index df29a01d5..a33c69b01 100755 --- a/vndk/tools/header-checker/tests/module.py +++ b/vndk/tools/header-checker/tests/module.py @@ -754,6 +754,24 @@ TEST_MODULES = [ linker_flags=['-output-format', 'Json'], has_reference_dump=True, ), + LsdumpModule( + name='libarray', + arch='arm64', + srcs=['integration/array/include/base.h'], + version_script='integration/array/map.txt', + export_include_dirs=['integration/array/include'], + linker_flags=['-output-format', 'Json'], + has_reference_dump=True, + ), + LsdumpModule( + name='libarray_diff', + arch='arm64', + srcs=['integration/array/include/diff.h'], + version_script='integration/array/map.txt', + export_include_dirs=['integration/array/include'], + linker_flags=['-output-format', 'Json'], + has_reference_dump=True, + ), ] TEST_MODULES = {m.name: m for m in TEST_MODULES} diff --git a/vndk/tools/header-checker/tests/reference_dumps/arm64/libarray.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/arm64/libarray.so.lsdump new file mode 100644 index 000000000..85c774435 --- /dev/null +++ b/vndk/tools/header-checker/tests/reference_dumps/arm64/libarray.so.lsdump @@ -0,0 +1,286 @@ +{ + "array_types" : + [ + { + "alignment" : 4, + "linker_set_key" : "_ZTIA0_i", + "name" : "int[0]", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIA0_i", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "alignment" : 4, + "linker_set_key" : "_ZTIA10_i", + "name" : "int[10]", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIA10_i", + "size" : 40, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "alignment" : 4, + "linker_set_key" : "_ZTIA1_i", + "name" : "int[1]", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIA1_i", + "size" : 4, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "alignment" : 4, + "linker_set_key" : "_ZTIA2_i", + "name" : "int[2]", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIA2_i", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "is_of_unknown_bound" : true, + "linker_set_key" : "_ZTIA_A10_i", + "name" : "int[][10]", + "referenced_type" : "_ZTIA10_i", + "self_type" : "_ZTIA_A10_i", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "is_of_unknown_bound" : true, + "linker_set_key" : "_ZTIA_A1_i", + "name" : "int[][1]", + "referenced_type" : "_ZTIA1_i", + "self_type" : "_ZTIA_A1_i", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "is_of_unknown_bound" : true, + "linker_set_key" : "_ZTIA_i", + "name" : "int[]", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIA_i", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + } + ], + "builtin_types" : + [ + { + "alignment" : 4, + "is_integral" : true, + "linker_set_key" : "_ZTIi", + "name" : "int", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIi", + "size" : 4 + }, + { + "linker_set_key" : "_ZTIv", + "name" : "void", + "referenced_type" : "_ZTIv", + "self_type" : "_ZTIv" + } + ], + "elf_functions" : + [ + { + "name" : "DoublePointer" + }, + { + "name" : "Element" + }, + { + "name" : "Pointer" + }, + { + "name" : "PointerTo2DArray" + }, + { + "name" : "PointerToArray" + }, + { + "name" : "Reference" + }, + { + "name" : "StructMember" + } + ], + "elf_objects" : [], + "enum_types" : [], + "function_types" : [], + "functions" : + [ + { + "function_name" : "DoublePointer", + "linker_set_key" : "DoublePointer", + "parameters" : + [ + { + "referenced_type" : "_ZTIPPi" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "function_name" : "Element", + "linker_set_key" : "Element", + "parameters" : + [ + { + "referenced_type" : "_ZTIPA2_i" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "function_name" : "Pointer", + "linker_set_key" : "Pointer", + "parameters" : + [ + { + "referenced_type" : "_ZTIPi" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "function_name" : "PointerTo2DArray", + "linker_set_key" : "PointerTo2DArray", + "parameters" : + [ + { + "referenced_type" : "_ZTIPA_A10_i" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "function_name" : "PointerToArray", + "linker_set_key" : "PointerToArray", + "parameters" : + [ + { + "referenced_type" : "_ZTIPA_i" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "function_name" : "Reference", + "linker_set_key" : "Reference", + "parameters" : + [ + { + "referenced_type" : "_ZTIRA_A1_i" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "function_name" : "StructMember", + "linker_set_key" : "StructMember", + "parameters" : + [ + { + "referenced_type" : "_ZTIR6Struct" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + } + ], + "global_vars" : [], + "lvalue_reference_types" : + [ + { + "alignment" : 8, + "linker_set_key" : "_ZTIR6Struct", + "name" : "Struct &", + "referenced_type" : "_ZTI6Struct", + "self_type" : "_ZTIR6Struct", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "alignment" : 8, + "linker_set_key" : "_ZTIRA_A1_i", + "name" : "int (&)[][1]", + "referenced_type" : "_ZTIA_A1_i", + "self_type" : "_ZTIRA_A1_i", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + } + ], + "pointer_types" : + [ + { + "alignment" : 8, + "linker_set_key" : "_ZTIPA2_i", + "name" : "int (*)[2]", + "referenced_type" : "_ZTIA2_i", + "self_type" : "_ZTIPA2_i", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "alignment" : 8, + "linker_set_key" : "_ZTIPA_A10_i", + "name" : "int (*)[][10]", + "referenced_type" : "_ZTIA_A10_i", + "self_type" : "_ZTIPA_A10_i", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "alignment" : 8, + "linker_set_key" : "_ZTIPA_i", + "name" : "int (*)[]", + "referenced_type" : "_ZTIA_i", + "self_type" : "_ZTIPA_i", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "alignment" : 8, + "linker_set_key" : "_ZTIPPi", + "name" : "int **", + "referenced_type" : "_ZTIPi", + "self_type" : "_ZTIPPi", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + }, + { + "alignment" : 8, + "linker_set_key" : "_ZTIPi", + "name" : "int *", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIPi", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + } + ], + "qualified_types" : [], + "record_types" : + [ + { + "alignment" : 4, + "fields" : + [ + { + "field_name" : "array", + "referenced_type" : "_ZTIA0_i" + } + ], + "linker_set_key" : "_ZTI6Struct", + "name" : "Struct", + "referenced_type" : "_ZTI6Struct", + "self_type" : "_ZTI6Struct", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/base.h" + } + ], + "rvalue_reference_types" : [] +} diff --git a/vndk/tools/header-checker/tests/reference_dumps/arm64/libarray_diff.so.lsdump b/vndk/tools/header-checker/tests/reference_dumps/arm64/libarray_diff.so.lsdump new file mode 100644 index 000000000..b0153ddf7 --- /dev/null +++ b/vndk/tools/header-checker/tests/reference_dumps/arm64/libarray_diff.so.lsdump @@ -0,0 +1,288 @@ +{ + "array_types" : + [ + { + "alignment" : 4, + "linker_set_key" : "_ZTIA10_A10_i", + "name" : "int[10][10]", + "referenced_type" : "_ZTIA10_i", + "self_type" : "_ZTIA10_A10_i", + "size" : 400, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "alignment" : 4, + "linker_set_key" : "_ZTIA10_i", + "name" : "int[10]", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIA10_i", + "size" : 40, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "alignment" : 4, + "linker_set_key" : "_ZTIA11_i", + "name" : "int[11]", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIA11_i", + "size" : 44, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "alignment" : 2, + "linker_set_key" : "_ZTIA2_s", + "name" : "short[2]", + "referenced_type" : "_ZTIs", + "self_type" : "_ZTIA2_s", + "size" : 4, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "is_of_unknown_bound" : true, + "linker_set_key" : "_ZTIA_A11_i", + "name" : "int[][11]", + "referenced_type" : "_ZTIA11_i", + "self_type" : "_ZTIA_A11_i", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "is_of_unknown_bound" : true, + "linker_set_key" : "_ZTIA_i", + "name" : "int[]", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIA_i", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + } + ], + "builtin_types" : + [ + { + "alignment" : 4, + "is_integral" : true, + "linker_set_key" : "_ZTIi", + "name" : "int", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIi", + "size" : 4 + }, + { + "alignment" : 2, + "is_integral" : true, + "linker_set_key" : "_ZTIs", + "name" : "short", + "referenced_type" : "_ZTIs", + "self_type" : "_ZTIs", + "size" : 2 + }, + { + "linker_set_key" : "_ZTIv", + "name" : "void", + "referenced_type" : "_ZTIv", + "self_type" : "_ZTIv" + } + ], + "elf_functions" : + [ + { + "name" : "DoublePointer" + }, + { + "name" : "Element" + }, + { + "name" : "Pointer" + }, + { + "name" : "PointerTo2DArray" + }, + { + "name" : "PointerToArray" + }, + { + "name" : "Reference" + }, + { + "name" : "StructMember" + } + ], + "elf_objects" : [], + "enum_types" : [], + "function_types" : [], + "functions" : + [ + { + "function_name" : "DoublePointer", + "linker_set_key" : "DoublePointer", + "parameters" : + [ + { + "referenced_type" : "_ZTIPPi" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "function_name" : "Element", + "linker_set_key" : "Element", + "parameters" : + [ + { + "referenced_type" : "_ZTIPA2_s" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "function_name" : "Pointer", + "linker_set_key" : "Pointer", + "parameters" : + [ + { + "referenced_type" : "_ZTIPi" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "function_name" : "PointerTo2DArray", + "linker_set_key" : "PointerTo2DArray", + "parameters" : + [ + { + "referenced_type" : "_ZTIPA10_A10_i" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "function_name" : "PointerToArray", + "linker_set_key" : "PointerToArray", + "parameters" : + [ + { + "referenced_type" : "_ZTIPA10_i" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "function_name" : "Reference", + "linker_set_key" : "Reference", + "parameters" : + [ + { + "referenced_type" : "_ZTIRA_A11_i" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "function_name" : "StructMember", + "linker_set_key" : "StructMember", + "parameters" : + [ + { + "referenced_type" : "_ZTIR6Struct" + } + ], + "return_type" : "_ZTIv", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + } + ], + "global_vars" : [], + "lvalue_reference_types" : + [ + { + "alignment" : 8, + "linker_set_key" : "_ZTIR6Struct", + "name" : "Struct &", + "referenced_type" : "_ZTI6Struct", + "self_type" : "_ZTIR6Struct", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "alignment" : 8, + "linker_set_key" : "_ZTIRA_A11_i", + "name" : "int (&)[][11]", + "referenced_type" : "_ZTIA_A11_i", + "self_type" : "_ZTIRA_A11_i", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + } + ], + "pointer_types" : + [ + { + "alignment" : 8, + "linker_set_key" : "_ZTIPA10_A10_i", + "name" : "int (*)[10][10]", + "referenced_type" : "_ZTIA10_A10_i", + "self_type" : "_ZTIPA10_A10_i", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "alignment" : 8, + "linker_set_key" : "_ZTIPA10_i", + "name" : "int (*)[10]", + "referenced_type" : "_ZTIA10_i", + "self_type" : "_ZTIPA10_i", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "alignment" : 8, + "linker_set_key" : "_ZTIPA2_s", + "name" : "short (*)[2]", + "referenced_type" : "_ZTIA2_s", + "self_type" : "_ZTIPA2_s", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "alignment" : 8, + "linker_set_key" : "_ZTIPPi", + "name" : "int **", + "referenced_type" : "_ZTIPi", + "self_type" : "_ZTIPPi", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + }, + { + "alignment" : 8, + "linker_set_key" : "_ZTIPi", + "name" : "int *", + "referenced_type" : "_ZTIi", + "self_type" : "_ZTIPi", + "size" : 8, + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + } + ], + "qualified_types" : [], + "record_types" : + [ + { + "alignment" : 4, + "fields" : + [ + { + "field_name" : "array", + "referenced_type" : "_ZTIA_i" + } + ], + "linker_set_key" : "_ZTI6Struct", + "name" : "Struct", + "referenced_type" : "_ZTI6Struct", + "self_type" : "_ZTI6Struct", + "source_file" : "development/vndk/tools/header-checker/tests/integration/array/include/diff.h" + } + ], + "rvalue_reference_types" : [] +} diff --git a/vndk/tools/header-checker/tests/test.py b/vndk/tools/header-checker/tests/test.py index 80120339a..7c6d9f0de 100755 --- a/vndk/tools/header-checker/tests/test.py +++ b/vndk/tools/header-checker/tests/test.py @@ -456,6 +456,24 @@ class HeaderCheckerTest(unittest.TestCase): self.assertEqual(1, diff.count('function_extension_diffs')) self.assertEqual(5, diff.count('function_diffs')) + def test_array_diff(self): + self.prepare_and_absolute_diff_all_archs("libarray", "libarray") + self.prepare_and_absolute_diff_all_archs( + "libarray_diff", "libarray_diff") + diff = self.prepare_and_run_abi_diff_all_archs( + "libarray", "libarray_diff", 8, + flags=["-input-format-new", "Json", "-input-format-old", "Json"], + create_old=False, create_new=False) + + for type_id in ["StructMember", "Pointer", "DoublePointer"]: + self.assertNotIn(f'"{type_id}"', diff, + f'"{type_id}" should not be in the diff report.') + + for type_id in ["Struct", "PointerToArray", "PointerTo2DArray", + "Reference", "Element"]: + self.assertIn(f'"{type_id}"', diff, + f'"{type_id}" should be in the diff report.') + if __name__ == '__main__': unittest.main()