mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-28 22:24:28 +00:00
Make sure that if we're going to attempt to add a type to a DIE that
the type exists. Fix up cases where we weren't checking for optional types and add an assert to addType to make sure we catch this in the future. Fix up a testcase that was using the tag for DW_TAG_array_type when it meant DW_TAG_enumeration_type. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@187963 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -776,8 +776,7 @@ DIE *CompileUnit::getOrCreateTypeDIE(const MDNode *TyNode) {
|
|||||||
|
|
||||||
/// addType - Add a new type attribute to the specified entity.
|
/// addType - Add a new type attribute to the specified entity.
|
||||||
void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
|
void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
|
||||||
if (!Ty.isType())
|
assert(Ty && "Trying to add a type that doesn't exist?");
|
||||||
return;
|
|
||||||
|
|
||||||
// Check for pre-existence.
|
// Check for pre-existence.
|
||||||
DIEEntry *Entry = getDIEEntry(Ty);
|
DIEEntry *Entry = getDIEEntry(Ty);
|
||||||
@ -863,6 +862,7 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DIDerivedType DTy) {
|
|||||||
|
|
||||||
// Map to main type, void will not have a type.
|
// Map to main type, void will not have a type.
|
||||||
DIType FromTy = DTy.getTypeDerivedFrom();
|
DIType FromTy = DTy.getTypeDerivedFrom();
|
||||||
|
if (FromTy)
|
||||||
addType(&Buffer, FromTy);
|
addType(&Buffer, FromTy);
|
||||||
|
|
||||||
// Add name if not anonymous or intermediate type.
|
// Add name if not anonymous or intermediate type.
|
||||||
@ -947,9 +947,10 @@ void CompileUnit::constructTypeDIE(DIE &Buffer, DICompositeType CTy) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case dwarf::DW_TAG_subroutine_type: {
|
case dwarf::DW_TAG_subroutine_type: {
|
||||||
// Add return type.
|
// Add return type. A void return won't have a type.
|
||||||
DIArray Elements = CTy.getTypeArray();
|
DIArray Elements = CTy.getTypeArray();
|
||||||
DIDescriptor RTy = Elements.getElement(0);
|
DIDescriptor RTy = Elements.getElement(0);
|
||||||
|
if (RTy)
|
||||||
addType(&Buffer, DIType(RTy));
|
addType(&Buffer, DIType(RTy));
|
||||||
|
|
||||||
bool isPrototyped = true;
|
bool isPrototyped = true;
|
||||||
@ -1137,6 +1138,10 @@ CompileUnit::getOrCreateTemplateValueParameterDIE(DITemplateValueParameter VP) {
|
|||||||
return ParamDIE;
|
return ParamDIE;
|
||||||
|
|
||||||
ParamDIE = new DIE(VP.getTag());
|
ParamDIE = new DIE(VP.getTag());
|
||||||
|
|
||||||
|
// Add the type if there is one, template template and template parameter
|
||||||
|
// packs will not have a type.
|
||||||
|
if (VP.getType())
|
||||||
addType(ParamDIE, VP.getType());
|
addType(ParamDIE, VP.getType());
|
||||||
if (!VP.getName().empty())
|
if (!VP.getName().empty())
|
||||||
addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
|
addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
|
||||||
@ -1246,12 +1251,13 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) {
|
|||||||
Language == dwarf::DW_LANG_ObjC))
|
Language == dwarf::DW_LANG_ObjC))
|
||||||
addFlag(SPDie, dwarf::DW_AT_prototyped);
|
addFlag(SPDie, dwarf::DW_AT_prototyped);
|
||||||
|
|
||||||
// Add Return Type.
|
// Add Return Type. A void return type will not have a type.
|
||||||
DICompositeType SPTy = SP.getType();
|
DICompositeType SPTy = SP.getType();
|
||||||
assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
|
assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
|
||||||
"the type of a subprogram should be a subroutine");
|
"the type of a subprogram should be a subroutine");
|
||||||
|
|
||||||
DIArray Args = SPTy.getTypeArray();
|
DIArray Args = SPTy.getTypeArray();
|
||||||
|
if (Args.getElement(0))
|
||||||
addType(SPDie, DIType(Args.getElement(0)));
|
addType(SPDie, DIType(Args.getElement(0)));
|
||||||
|
|
||||||
unsigned VK = SP.getVirtuality();
|
unsigned VK = SP.getVirtuality();
|
||||||
@ -1502,9 +1508,8 @@ void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
|
|||||||
if (CTy->isVector())
|
if (CTy->isVector())
|
||||||
addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
|
addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
|
||||||
|
|
||||||
// Emit derived type.
|
// Emit the element type.
|
||||||
addType(&Buffer, CTy->getTypeDerivedFrom());
|
addType(&Buffer, CTy->getTypeDerivedFrom());
|
||||||
DIArray Elements = CTy->getTypeArray();
|
|
||||||
|
|
||||||
// Get an anonymous type for index type.
|
// Get an anonymous type for index type.
|
||||||
// FIXME: This type should be passed down from the front end
|
// FIXME: This type should be passed down from the front end
|
||||||
@ -1522,6 +1527,7 @@ void CompileUnit::constructArrayTypeDIE(DIE &Buffer,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add subranges to array type.
|
// Add subranges to array type.
|
||||||
|
DIArray Elements = CTy->getTypeArray();
|
||||||
for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
|
for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
|
||||||
DIDescriptor Element = Elements.getElement(i);
|
DIDescriptor Element = Elements.getElement(i);
|
||||||
if (Element.getTag() == dwarf::DW_TAG_subrange_type)
|
if (Element.getTag() == dwarf::DW_TAG_subrange_type)
|
||||||
|
@ -759,7 +759,6 @@ DICompositeType DIBuilder::createArrayType(uint64_t Size, uint64_t AlignInBits,
|
|||||||
/// createVectorType - Create debugging information entry for a vector.
|
/// createVectorType - Create debugging information entry for a vector.
|
||||||
DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
|
DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t AlignInBits,
|
||||||
DIType Ty, DIArray Subscripts) {
|
DIType Ty, DIArray Subscripts) {
|
||||||
|
|
||||||
// A vector is an array type with the FlagVector flag applied.
|
// A vector is an array type with the FlagVector flag applied.
|
||||||
Value *Elts[] = {
|
Value *Elts[] = {
|
||||||
GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
|
GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
|
||||||
|
@ -483,6 +483,12 @@ bool DICompositeType::Verify() const {
|
|||||||
if (!fieldIsMDNode(DbgNode, 12))
|
if (!fieldIsMDNode(DbgNode, 12))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
// If this is an array type verify that we have a DIType in the derived type
|
||||||
|
// field as that's the type of our element.
|
||||||
|
if (getTag() == dwarf::DW_TAG_array_type)
|
||||||
|
if (!DIType(getTypeDerivedFrom()))
|
||||||
|
return false;
|
||||||
|
|
||||||
return DbgNode->getNumOperands() >= 10 && DbgNode->getNumOperands() <= 14;
|
return DbgNode->getNumOperands() >= 10 && DbgNode->getNumOperands() <= 14;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,25 +95,25 @@ define hidden void @foobar_func_block_invoke_0(i8* %.block_descriptor, %0* %load
|
|||||||
!llvm.dbg.cu = !{!0}
|
!llvm.dbg.cu = !{!0}
|
||||||
|
|
||||||
!0 = metadata !{i32 786449, metadata !153, i32 16, metadata !"Apple clang version 2.1", i1 false, metadata !"", i32 2, metadata !147, metadata !26, metadata !148, null, null, metadata !""} ; [ DW_TAG_compile_unit ]
|
!0 = metadata !{i32 786449, metadata !153, i32 16, metadata !"Apple clang version 2.1", i1 false, metadata !"", i32 2, metadata !147, metadata !26, metadata !148, null, null, metadata !""} ; [ DW_TAG_compile_unit ]
|
||||||
!1 = metadata !{i32 786433, metadata !160, metadata !0, metadata !"", i32 248, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !3, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]
|
!1 = metadata !{i32 786436, metadata !160, metadata !0, metadata !"", i32 248, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !3, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]
|
||||||
!2 = metadata !{i32 786473, metadata !160} ; [ DW_TAG_file_type ]
|
!2 = metadata !{i32 786473, metadata !160} ; [ DW_TAG_file_type ]
|
||||||
!3 = metadata !{metadata !4}
|
!3 = metadata !{metadata !4}
|
||||||
!4 = metadata !{i32 786472, metadata !"Ver1", i64 0} ; [ DW_TAG_enumerator ]
|
!4 = metadata !{i32 786472, metadata !"Ver1", i64 0} ; [ DW_TAG_enumerator ]
|
||||||
!5 = metadata !{i32 786433, metadata !160, metadata !0, metadata !"Mode", i32 79, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !7, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]
|
!5 = metadata !{i32 786436, metadata !160, metadata !0, metadata !"Mode", i32 79, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !7, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]
|
||||||
!6 = metadata !{i32 786473, metadata !161} ; [ DW_TAG_file_type ]
|
!6 = metadata !{i32 786473, metadata !161} ; [ DW_TAG_file_type ]
|
||||||
!7 = metadata !{metadata !8}
|
!7 = metadata !{metadata !8}
|
||||||
!8 = metadata !{i32 786472, metadata !"One", i64 0} ; [ DW_TAG_enumerator ]
|
!8 = metadata !{i32 786472, metadata !"One", i64 0} ; [ DW_TAG_enumerator ]
|
||||||
!9 = metadata !{i32 786433, metadata !149, metadata !0, metadata !"", i32 15, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !11, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]
|
!9 = metadata !{i32 786436, metadata !149, metadata !0, metadata !"", i32 15, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !11, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]
|
||||||
!10 = metadata !{i32 786473, metadata !149} ; [ DW_TAG_file_type ]
|
!10 = metadata !{i32 786473, metadata !149} ; [ DW_TAG_file_type ]
|
||||||
!11 = metadata !{metadata !12, metadata !13}
|
!11 = metadata !{metadata !12, metadata !13}
|
||||||
!12 = metadata !{i32 786472, metadata !"Unknown", i64 0} ; [ DW_TAG_enumerator ]
|
!12 = metadata !{i32 786472, metadata !"Unknown", i64 0} ; [ DW_TAG_enumerator ]
|
||||||
!13 = metadata !{i32 786472, metadata !"Known", i64 1} ; [ DW_TAG_enumerator ]
|
!13 = metadata !{i32 786472, metadata !"Known", i64 1} ; [ DW_TAG_enumerator ]
|
||||||
!14 = metadata !{i32 786433, metadata !150, metadata !0, metadata !"", i32 20, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !16, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]
|
!14 = metadata !{i32 786436, metadata !150, metadata !0, metadata !"", i32 20, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !16, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]
|
||||||
!15 = metadata !{i32 786473, metadata !150} ; [ DW_TAG_file_type ]
|
!15 = metadata !{i32 786473, metadata !150} ; [ DW_TAG_file_type ]
|
||||||
!16 = metadata !{metadata !17, metadata !18}
|
!16 = metadata !{metadata !17, metadata !18}
|
||||||
!17 = metadata !{i32 786472, metadata !"Single", i64 0} ; [ DW_TAG_enumerator ]
|
!17 = metadata !{i32 786472, metadata !"Single", i64 0} ; [ DW_TAG_enumerator ]
|
||||||
!18 = metadata !{i32 786472, metadata !"Double", i64 1} ; [ DW_TAG_enumerator ]
|
!18 = metadata !{i32 786472, metadata !"Double", i64 1} ; [ DW_TAG_enumerator ]
|
||||||
!19 = metadata !{i32 786433, metadata !151, metadata !0, metadata !"", i32 14, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !21, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]
|
!19 = metadata !{i32 786436, metadata !151, metadata !0, metadata !"", i32 14, i64 32, i64 32, i32 0, i32 0, i32 0, metadata !21, i32 0, i32 0} ; [ DW_TAG_enumeration_type ]
|
||||||
!20 = metadata !{i32 786473, metadata !151} ; [ DW_TAG_file_type ]
|
!20 = metadata !{i32 786473, metadata !151} ; [ DW_TAG_file_type ]
|
||||||
!21 = metadata !{metadata !22}
|
!21 = metadata !{metadata !22}
|
||||||
!22 = metadata !{i32 786472, metadata !"Eleven", i64 0} ; [ DW_TAG_enumerator ]
|
!22 = metadata !{i32 786472, metadata !"Eleven", i64 0} ; [ DW_TAG_enumerator ]
|
||||||
|
Reference in New Issue
Block a user