Diff array types
This commit implements the function that compares array size, alignment, and element type. Test: ./test.py ; update prebuilts/clang-tools and build Bug: 255702405 Change-Id: I4f25d22f060cfda04bbd88b9c2521461b95e6829
This commit is contained in:
@@ -755,6 +755,19 @@ DiffStatus AbiDiffHelper::CompareQualifiedTypes(
|
||||
type_queue, diff_kind);
|
||||
}
|
||||
|
||||
DiffStatus AbiDiffHelper::CompareArrayTypes(const ArrayTypeIR *old_type,
|
||||
const ArrayTypeIR *new_type,
|
||||
std::deque<std::string> *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<const BuiltinTypeIR *>(old_type),
|
||||
static_cast<const BuiltinTypeIR *>(new_type));
|
||||
}
|
||||
switch (kind) {
|
||||
case LinkableMessageKind::BuiltinTypeKind:
|
||||
return CompareBuiltinTypes(static_cast<const BuiltinTypeIR *>(old_type),
|
||||
static_cast<const BuiltinTypeIR *>(new_type));
|
||||
case LinkableMessageKind::QualifiedTypeKind:
|
||||
return CompareQualifiedTypes(
|
||||
static_cast<const QualifiedTypeIR *>(old_type),
|
||||
static_cast<const QualifiedTypeIR *>(new_type), type_queue,
|
||||
diff_kind);
|
||||
case LinkableMessageKind::ArrayTypeKind:
|
||||
return CompareArrayTypes(static_cast<const ArrayTypeIR *>(old_type),
|
||||
static_cast<const ArrayTypeIR *>(new_type),
|
||||
type_queue, diff_kind);
|
||||
case LinkableMessageKind::EnumTypeKind:
|
||||
return CompareEnumTypes(static_cast<const EnumTypeIR *>(old_type),
|
||||
static_cast<const EnumTypeIR *>(new_type),
|
||||
type_queue, diff_kind);
|
||||
|
||||
if (kind == LinkableMessageKind::QualifiedTypeKind) {
|
||||
return CompareQualifiedTypes(
|
||||
static_cast<const QualifiedTypeIR *>(old_type),
|
||||
static_cast<const QualifiedTypeIR *>(new_type),
|
||||
type_queue, diff_kind);
|
||||
}
|
||||
case LinkableMessageKind::LvalueReferenceTypeKind:
|
||||
return CompareLvalueReferenceTypes(
|
||||
static_cast<const LvalueReferenceTypeIR *>(old_type),
|
||||
static_cast<const LvalueReferenceTypeIR *>(new_type), type_queue,
|
||||
diff_kind);
|
||||
case LinkableMessageKind::RvalueReferenceTypeKind:
|
||||
return CompareRvalueReferenceTypes(
|
||||
static_cast<const RvalueReferenceTypeIR *>(old_type),
|
||||
static_cast<const RvalueReferenceTypeIR *>(new_type), type_queue,
|
||||
diff_kind);
|
||||
case LinkableMessageKind::PointerTypeKind:
|
||||
return ComparePointerTypes(static_cast<const PointerTypeIR *>(old_type),
|
||||
static_cast<const PointerTypeIR *>(new_type),
|
||||
type_queue, diff_kind);
|
||||
|
||||
if (kind == LinkableMessageKind::EnumTypeKind) {
|
||||
return CompareEnumTypes(
|
||||
static_cast<const EnumTypeIR *>(old_type),
|
||||
static_cast<const EnumTypeIR *>(new_type),
|
||||
type_queue, diff_kind);
|
||||
}
|
||||
case LinkableMessageKind::RecordTypeKind:
|
||||
return CompareRecordTypes(static_cast<const RecordTypeIR *>(old_type),
|
||||
static_cast<const RecordTypeIR *>(new_type),
|
||||
type_queue, diff_kind);
|
||||
|
||||
if (kind == LinkableMessageKind::LvalueReferenceTypeKind) {
|
||||
return CompareLvalueReferenceTypes(
|
||||
static_cast<const LvalueReferenceTypeIR *>(old_type),
|
||||
static_cast<const LvalueReferenceTypeIR *>(new_type),
|
||||
type_queue, diff_kind);
|
||||
}
|
||||
|
||||
if (kind == LinkableMessageKind::RvalueReferenceTypeKind) {
|
||||
return CompareRvalueReferenceTypes(
|
||||
static_cast<const RvalueReferenceTypeIR *>(old_type),
|
||||
static_cast<const RvalueReferenceTypeIR *>(new_type),
|
||||
type_queue, diff_kind);
|
||||
}
|
||||
|
||||
if (kind == LinkableMessageKind::PointerTypeKind) {
|
||||
return ComparePointerTypes(
|
||||
static_cast<const PointerTypeIR *>(old_type),
|
||||
static_cast<const PointerTypeIR *>(new_type),
|
||||
type_queue, diff_kind);
|
||||
}
|
||||
|
||||
if (kind == LinkableMessageKind::RecordTypeKind) {
|
||||
return CompareRecordTypes(
|
||||
static_cast<const RecordTypeIR *>(old_type),
|
||||
static_cast<const RecordTypeIR *>(new_type),
|
||||
type_queue, diff_kind);
|
||||
}
|
||||
|
||||
if (kind == LinkableMessageKind::FunctionTypeKind) {
|
||||
DiffStatus result = CompareFunctionTypes(
|
||||
static_cast<const FunctionTypeIR *>(old_type),
|
||||
static_cast<const FunctionTypeIR *>(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<const FunctionTypeIR *>(old_type),
|
||||
static_cast<const FunctionTypeIR *>(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(
|
||||
|
||||
@@ -140,6 +140,11 @@ class AbiDiffHelper {
|
||||
std::deque<std::string> *type_queue,
|
||||
IRDiffDumper::DiffKind diff_kind);
|
||||
|
||||
DiffStatus CompareArrayTypes(const ArrayTypeIR *old_type,
|
||||
const ArrayTypeIR *new_type,
|
||||
std::deque<std::string> *type_queue,
|
||||
IRDiffDumper::DiffKind diff_kind);
|
||||
|
||||
DiffStatus ComparePointerTypes(const PointerTypeIR *old_type,
|
||||
const PointerTypeIR *new_type,
|
||||
std::deque<std::string> *type_queue,
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
@@ -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]);
|
||||
}
|
||||
10
vndk/tools/header-checker/tests/integration/array/map.txt
Normal file
10
vndk/tools/header-checker/tests/integration/array/map.txt
Normal file
@@ -0,0 +1,10 @@
|
||||
libarray {
|
||||
global:
|
||||
StructMember;
|
||||
Pointer;
|
||||
DoublePointer;
|
||||
PointerToArray;
|
||||
PointerTo2DArray;
|
||||
Reference;
|
||||
Element;
|
||||
};
|
||||
@@ -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}
|
||||
|
||||
@@ -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" : []
|
||||
}
|
||||
@@ -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" : []
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user