diff --git a/vndk/tools/header-checker/src/dumper/abi_wrappers.cpp b/vndk/tools/header-checker/src/dumper/abi_wrappers.cpp index 2ff038538..84ec7ae44 100644 --- a/vndk/tools/header-checker/src/dumper/abi_wrappers.cpp +++ b/vndk/tools/header-checker/src/dumper/abi_wrappers.cpp @@ -385,6 +385,7 @@ TypeAndCreationStatus ABIWrapper::SetTypeKind( } if (type_ptr->isArrayType()) { auto array_type_ir = std::make_unique(); + array_type_ir->SetUnknownBound(type_ptr->isIncompleteArrayType()); array_type_ir->SetSourceFile(source_file); return TypeAndCreationStatus(std::move(array_type_ir)); } diff --git a/vndk/tools/header-checker/src/repr/ir_representation.h b/vndk/tools/header-checker/src/repr/ir_representation.h index bcc07ba7c..9e1eed4eb 100644 --- a/vndk/tools/header-checker/src/repr/ir_representation.h +++ b/vndk/tools/header-checker/src/repr/ir_representation.h @@ -508,9 +508,18 @@ class EnumTypeIR : public TypeIR { class ArrayTypeIR : public TypeIR { public: + void SetUnknownBound(bool is_of_unknown_bound) { + is_of_unknown_bound_ = is_of_unknown_bound; + } + + bool IsOfUnknownBound() const { return is_of_unknown_bound_; } + LinkableMessageKind GetKind() const override { return LinkableMessageKind::ArrayTypeKind; } + + private: + bool is_of_unknown_bound_ = false; }; class PointerTypeIR : public TypeIR { diff --git a/vndk/tools/header-checker/src/repr/ir_representation_internal.h b/vndk/tools/header-checker/src/repr/ir_representation_internal.h index b3189595e..6df671214 100644 --- a/vndk/tools/header-checker/src/repr/ir_representation_internal.h +++ b/vndk/tools/header-checker/src/repr/ir_representation_internal.h @@ -29,11 +29,6 @@ inline std::string GetReferencedTypeMapKey(T &element) { return element.GetReferencedType(); } -template <> -inline std::string GetReferencedTypeMapKey(ArrayTypeIR &element) { - return element.GetReferencedType() + ":" + std::to_string(element.GetSize()); -} - template <> inline std::string GetReferencedTypeMapKey( BuiltinTypeIR &element) { @@ -44,6 +39,12 @@ inline static std::string BoolToString(bool val) { return val ? "true" : "false"; } +template <> +inline std::string GetReferencedTypeMapKey(ArrayTypeIR &element) { + return element.GetReferencedType() + ":" + std::to_string(element.GetSize()) + + ":" + BoolToString(element.IsOfUnknownBound()); +} + template <> inline std::string GetReferencedTypeMapKey( QualifiedTypeIR &element) { diff --git a/vndk/tools/header-checker/src/repr/json/ir_dumper.cpp b/vndk/tools/header-checker/src/repr/json/ir_dumper.cpp index 328b9a2e1..c482808cb 100644 --- a/vndk/tools/header-checker/src/repr/json/ir_dumper.cpp +++ b/vndk/tools/header-checker/src/repr/json/ir_dumper.cpp @@ -265,6 +265,7 @@ IRToJsonConverter::ConvertBuiltinTypeIR(const BuiltinTypeIR *builtin_typep) { JsonObject IRToJsonConverter::ConvertArrayTypeIR(const ArrayTypeIR *array_typep) { JsonObject array_type; + array_type.Set("is_of_unknown_bound", array_typep->IsOfUnknownBound()); AddTypeInfo(array_type, array_typep); return array_type; } diff --git a/vndk/tools/header-checker/src/repr/json/ir_reader.cpp b/vndk/tools/header-checker/src/repr/json/ir_reader.cpp index 1df235907..addca8894 100644 --- a/vndk/tools/header-checker/src/repr/json/ir_reader.cpp +++ b/vndk/tools/header-checker/src/repr/json/ir_reader.cpp @@ -355,6 +355,7 @@ void JsonIRReader::ReadArrayTypes(const JsonObjectRef &tu) { for (auto &&array_type : tu.GetObjects("array_types")) { ArrayTypeIR array_type_ir; ReadTypeInfo(array_type, &array_type_ir); + array_type_ir.SetUnknownBound(array_type.GetBool("is_of_unknown_bound")); module_->AddArrayType(std::move(array_type_ir)); } } diff --git a/vndk/tools/header-checker/src/repr/protobuf/ir_dumper.cpp b/vndk/tools/header-checker/src/repr/protobuf/ir_dumper.cpp index cb04780c9..42123db3c 100644 --- a/vndk/tools/header-checker/src/repr/protobuf/ir_dumper.cpp +++ b/vndk/tools/header-checker/src/repr/protobuf/ir_dumper.cpp @@ -269,6 +269,7 @@ abi_dump::BuiltinType IRToProtobufConverter::ConvertBuiltinTypeIR( abi_dump::ArrayType IRToProtobufConverter::ConvertArrayTypeIR( const ArrayTypeIR *array_typep) { abi_dump::ArrayType added_array_type; + added_array_type.set_is_of_unknown_bound(array_typep->IsOfUnknownBound()); if (!AddTypeInfo(added_array_type.mutable_type_info(), array_typep)) { llvm::errs() << "ArrayTypeIR could not be converted\n"; ::exit(1); diff --git a/vndk/tools/header-checker/src/repr/protobuf/ir_reader.cpp b/vndk/tools/header-checker/src/repr/protobuf/ir_reader.cpp index 9974cfd5a..3b08c667d 100644 --- a/vndk/tools/header-checker/src/repr/protobuf/ir_reader.cpp +++ b/vndk/tools/header-checker/src/repr/protobuf/ir_reader.cpp @@ -245,6 +245,7 @@ void ProtobufIRReader::ReadArrayTypes(const abi_dump::TranslationUnit &tu) { for (auto &&array_type_protobuf : tu.array_types()) { ArrayTypeIR array_type_ir; ReadTypeInfo(array_type_protobuf.type_info(), &array_type_ir); + array_type_ir.SetUnknownBound(array_type_protobuf.is_of_unknown_bound()); module_->AddArrayType(std::move(array_type_ir)); } } diff --git a/vndk/tools/header-checker/src/repr/protobuf/proto/abi_dump.proto b/vndk/tools/header-checker/src/repr/protobuf/proto/abi_dump.proto index 52a654ec7..1ce604e1e 100644 --- a/vndk/tools/header-checker/src/repr/protobuf/proto/abi_dump.proto +++ b/vndk/tools/header-checker/src/repr/protobuf/proto/abi_dump.proto @@ -27,6 +27,7 @@ message BasicNamedAndTypedDecl { message ArrayType { optional BasicNamedAndTypedDecl type_info = 1; + optional bool is_of_unknown_bound = 2; } message PointerType { diff --git a/vndk/tools/header-checker/tests/expected/example1.cpp b/vndk/tools/header-checker/tests/expected/example1.cpp index 702153244..500f26559 100644 --- a/vndk/tools/header-checker/tests/expected/example1.cpp +++ b/vndk/tools/header-checker/tests/expected/example1.cpp @@ -798,6 +798,7 @@ array_types { linker_set_key: "_ZTIA2_b" self_type: "_ZTIA2_b" } + is_of_unknown_bound: false } functions { return_type: "_ZTI4ListIfE" diff --git a/vndk/tools/header-checker/tests/expected/example1.h b/vndk/tools/header-checker/tests/expected/example1.h index 7eb312113..097dc278e 100644 --- a/vndk/tools/header-checker/tests/expected/example1.h +++ b/vndk/tools/header-checker/tests/expected/example1.h @@ -878,6 +878,7 @@ array_types { linker_set_key: "_ZTIA2_b" self_type: "_ZTIA2_b" } + is_of_unknown_bound: false } functions { return_type: "_ZTIi" diff --git a/vndk/tools/header-checker/tests/expected/example2.h b/vndk/tools/header-checker/tests/expected/example2.h index 23d4241d1..5cef54387 100644 --- a/vndk/tools/header-checker/tests/expected/example2.h +++ b/vndk/tools/header-checker/tests/expected/example2.h @@ -355,6 +355,7 @@ array_types { linker_set_key: "_ZTIA2_b" self_type: "_ZTIA2_b" } + is_of_unknown_bound: false } functions { return_type: "_ZTIi"