Merge "Add a field for arrays of unknown bound"
This commit is contained in:
@@ -385,6 +385,7 @@ TypeAndCreationStatus ABIWrapper::SetTypeKind(
|
|||||||
}
|
}
|
||||||
if (type_ptr->isArrayType()) {
|
if (type_ptr->isArrayType()) {
|
||||||
auto array_type_ir = std::make_unique<repr::ArrayTypeIR>();
|
auto array_type_ir = std::make_unique<repr::ArrayTypeIR>();
|
||||||
|
array_type_ir->SetUnknownBound(type_ptr->isIncompleteArrayType());
|
||||||
array_type_ir->SetSourceFile(source_file);
|
array_type_ir->SetSourceFile(source_file);
|
||||||
return TypeAndCreationStatus(std::move(array_type_ir));
|
return TypeAndCreationStatus(std::move(array_type_ir));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -508,9 +508,18 @@ class EnumTypeIR : public TypeIR {
|
|||||||
|
|
||||||
class ArrayTypeIR : public TypeIR {
|
class ArrayTypeIR : public TypeIR {
|
||||||
public:
|
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 {
|
LinkableMessageKind GetKind() const override {
|
||||||
return LinkableMessageKind::ArrayTypeKind;
|
return LinkableMessageKind::ArrayTypeKind;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool is_of_unknown_bound_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
class PointerTypeIR : public TypeIR {
|
class PointerTypeIR : public TypeIR {
|
||||||
|
|||||||
@@ -29,11 +29,6 @@ inline std::string GetReferencedTypeMapKey(T &element) {
|
|||||||
return element.GetReferencedType();
|
return element.GetReferencedType();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <>
|
|
||||||
inline std::string GetReferencedTypeMapKey<ArrayTypeIR>(ArrayTypeIR &element) {
|
|
||||||
return element.GetReferencedType() + ":" + std::to_string(element.GetSize());
|
|
||||||
}
|
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
inline std::string GetReferencedTypeMapKey<BuiltinTypeIR>(
|
inline std::string GetReferencedTypeMapKey<BuiltinTypeIR>(
|
||||||
BuiltinTypeIR &element) {
|
BuiltinTypeIR &element) {
|
||||||
@@ -44,6 +39,12 @@ inline static std::string BoolToString(bool val) {
|
|||||||
return val ? "true" : "false";
|
return val ? "true" : "false";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <>
|
||||||
|
inline std::string GetReferencedTypeMapKey<ArrayTypeIR>(ArrayTypeIR &element) {
|
||||||
|
return element.GetReferencedType() + ":" + std::to_string(element.GetSize()) +
|
||||||
|
":" + BoolToString(element.IsOfUnknownBound());
|
||||||
|
}
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
inline std::string GetReferencedTypeMapKey<QualifiedTypeIR>(
|
inline std::string GetReferencedTypeMapKey<QualifiedTypeIR>(
|
||||||
QualifiedTypeIR &element) {
|
QualifiedTypeIR &element) {
|
||||||
|
|||||||
@@ -265,6 +265,7 @@ IRToJsonConverter::ConvertBuiltinTypeIR(const BuiltinTypeIR *builtin_typep) {
|
|||||||
JsonObject
|
JsonObject
|
||||||
IRToJsonConverter::ConvertArrayTypeIR(const ArrayTypeIR *array_typep) {
|
IRToJsonConverter::ConvertArrayTypeIR(const ArrayTypeIR *array_typep) {
|
||||||
JsonObject array_type;
|
JsonObject array_type;
|
||||||
|
array_type.Set("is_of_unknown_bound", array_typep->IsOfUnknownBound());
|
||||||
AddTypeInfo(array_type, array_typep);
|
AddTypeInfo(array_type, array_typep);
|
||||||
return array_type;
|
return array_type;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -355,6 +355,7 @@ void JsonIRReader::ReadArrayTypes(const JsonObjectRef &tu) {
|
|||||||
for (auto &&array_type : tu.GetObjects("array_types")) {
|
for (auto &&array_type : tu.GetObjects("array_types")) {
|
||||||
ArrayTypeIR array_type_ir;
|
ArrayTypeIR array_type_ir;
|
||||||
ReadTypeInfo(array_type, &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));
|
module_->AddArrayType(std::move(array_type_ir));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -269,6 +269,7 @@ abi_dump::BuiltinType IRToProtobufConverter::ConvertBuiltinTypeIR(
|
|||||||
abi_dump::ArrayType IRToProtobufConverter::ConvertArrayTypeIR(
|
abi_dump::ArrayType IRToProtobufConverter::ConvertArrayTypeIR(
|
||||||
const ArrayTypeIR *array_typep) {
|
const ArrayTypeIR *array_typep) {
|
||||||
abi_dump::ArrayType added_array_type;
|
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)) {
|
if (!AddTypeInfo(added_array_type.mutable_type_info(), array_typep)) {
|
||||||
llvm::errs() << "ArrayTypeIR could not be converted\n";
|
llvm::errs() << "ArrayTypeIR could not be converted\n";
|
||||||
::exit(1);
|
::exit(1);
|
||||||
|
|||||||
@@ -245,6 +245,7 @@ void ProtobufIRReader::ReadArrayTypes(const abi_dump::TranslationUnit &tu) {
|
|||||||
for (auto &&array_type_protobuf : tu.array_types()) {
|
for (auto &&array_type_protobuf : tu.array_types()) {
|
||||||
ArrayTypeIR array_type_ir;
|
ArrayTypeIR array_type_ir;
|
||||||
ReadTypeInfo(array_type_protobuf.type_info(), &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));
|
module_->AddArrayType(std::move(array_type_ir));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ message BasicNamedAndTypedDecl {
|
|||||||
|
|
||||||
message ArrayType {
|
message ArrayType {
|
||||||
optional BasicNamedAndTypedDecl type_info = 1;
|
optional BasicNamedAndTypedDecl type_info = 1;
|
||||||
|
optional bool is_of_unknown_bound = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
message PointerType {
|
message PointerType {
|
||||||
|
|||||||
@@ -798,6 +798,7 @@ array_types {
|
|||||||
linker_set_key: "_ZTIA2_b"
|
linker_set_key: "_ZTIA2_b"
|
||||||
self_type: "_ZTIA2_b"
|
self_type: "_ZTIA2_b"
|
||||||
}
|
}
|
||||||
|
is_of_unknown_bound: false
|
||||||
}
|
}
|
||||||
functions {
|
functions {
|
||||||
return_type: "_ZTI4ListIfE"
|
return_type: "_ZTI4ListIfE"
|
||||||
|
|||||||
@@ -878,6 +878,7 @@ array_types {
|
|||||||
linker_set_key: "_ZTIA2_b"
|
linker_set_key: "_ZTIA2_b"
|
||||||
self_type: "_ZTIA2_b"
|
self_type: "_ZTIA2_b"
|
||||||
}
|
}
|
||||||
|
is_of_unknown_bound: false
|
||||||
}
|
}
|
||||||
functions {
|
functions {
|
||||||
return_type: "_ZTIi"
|
return_type: "_ZTIi"
|
||||||
|
|||||||
@@ -355,6 +355,7 @@ array_types {
|
|||||||
linker_set_key: "_ZTIA2_b"
|
linker_set_key: "_ZTIA2_b"
|
||||||
self_type: "_ZTIA2_b"
|
self_type: "_ZTIA2_b"
|
||||||
}
|
}
|
||||||
|
is_of_unknown_bound: false
|
||||||
}
|
}
|
||||||
functions {
|
functions {
|
||||||
return_type: "_ZTIi"
|
return_type: "_ZTIi"
|
||||||
|
|||||||
Reference in New Issue
Block a user