omjavaid created this revision. omjavaid added a reviewer: clayborg. omjavaid added a subscriber: lldb-commits. Herald added a subscriber: aemerson.
This patch ClangASTContext::IsHomogeneousAggregate test for homogeneity in light of Arm procedure call standard definition of a homogeneous aggregate given below: A Homogeneous Aggregate is a Composite Type where all of the Fundamental Data Types that compose the type are the same. The test for homogeneity is applied after data layout is completed and without regard to access control or other source language restrictions. An aggregate consisting of containerized vector types is treated as homogeneous if all the members are of the same size, even if the internal format of the containerized members are different. For example, a structure containing a vector of 8 bytes and a vector of 4 half-words satisfies the requirements for a homogeneous aggregate. A Homogenous Aggregate has a Base Type, which is the Fundamental Data Type of each Element. The overall size is the size of the Base Type multiplied by the number of Elements; its alignment will be the alignment of the Base Type. ClangASTContext::IsHomogeneousAggregate functions is currently only used by ARM ABI and I have not seen a conflicting definition of a Homogenous Aggregate elsewhere so seems safe to use ARM's definition as is. LGTM? http://reviews.llvm.org/D17501 Files: source/Symbol/ClangASTContext.cpp Index: source/Symbol/ClangASTContext.cpp =================================================================== --- source/Symbol/ClangASTContext.cpp +++ source/Symbol/ClangASTContext.cpp @@ -3100,9 +3100,11 @@ bool is_hva = false; bool is_hfa = false; clang::QualType base_qual_type; + uint64_t base_bitwidth = 0; for (field_pos = record_decl->field_begin(); field_pos != field_end; ++field_pos) { clang::QualType field_qual_type = field_pos->getType(); + uint64_t field_bitwidth = getASTContext()->getTypeSize (qual_type); if (field_qual_type->isFloatingType()) { if (field_qual_type->isComplexType()) @@ -3123,22 +3125,21 @@ } else if (field_qual_type->isVectorType() || field_qual_type->isExtVectorType()) { - const clang::VectorType *array = field_qual_type.getTypePtr()->getAs<clang::VectorType>(); - if (array && array->getNumElements() <= 4) + if (num_fields == 0) { - if (num_fields == 0) - base_qual_type = array->getElementType(); - else - { - if (is_hfa) - return 0; - is_hva = true; - if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr()) - return 0; - } + base_qual_type = field_qual_type; + base_bitwidth = field_bitwidth; } else - return 0; + { + if (is_hfa) + return 0; + is_hva = true; + if (base_bitwidth != field_bitwidth) + return 0; + if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr()) + return 0; + } } else return 0;
Index: source/Symbol/ClangASTContext.cpp =================================================================== --- source/Symbol/ClangASTContext.cpp +++ source/Symbol/ClangASTContext.cpp @@ -3100,9 +3100,11 @@ bool is_hva = false; bool is_hfa = false; clang::QualType base_qual_type; + uint64_t base_bitwidth = 0; for (field_pos = record_decl->field_begin(); field_pos != field_end; ++field_pos) { clang::QualType field_qual_type = field_pos->getType(); + uint64_t field_bitwidth = getASTContext()->getTypeSize (qual_type); if (field_qual_type->isFloatingType()) { if (field_qual_type->isComplexType()) @@ -3123,22 +3125,21 @@ } else if (field_qual_type->isVectorType() || field_qual_type->isExtVectorType()) { - const clang::VectorType *array = field_qual_type.getTypePtr()->getAs<clang::VectorType>(); - if (array && array->getNumElements() <= 4) + if (num_fields == 0) { - if (num_fields == 0) - base_qual_type = array->getElementType(); - else - { - if (is_hfa) - return 0; - is_hva = true; - if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr()) - return 0; - } + base_qual_type = field_qual_type; + base_bitwidth = field_bitwidth; } else - return 0; + { + if (is_hfa) + return 0; + is_hva = true; + if (base_bitwidth != field_bitwidth) + return 0; + if (field_qual_type.getTypePtr() != base_qual_type.getTypePtr()) + return 0; + } } else return 0;
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits