[llvm] r187963 - Make sure that if we're going to attempt to add a type to a DIE that

Eric Christopher echristo at gmail.com
Thu Aug 8 01:09:22 PDT 2013


I've got it, checking in shortly.

Thanks!

-eric

On Thu, Aug 8, 2013 at 1:01 AM, Alexey Samsonov <samsonov at google.com> wrote:
>
> On Thu, Aug 8, 2013 at 11:40 AM, Eric Christopher <echristo at gmail.com>
> wrote:
>>
>> Author: echristo
>> Date: Thu Aug  8 02:40:37 2013
>> New Revision: 187963
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=187963&view=rev
>> Log:
>> 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.
>>
>> Modified:
>>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>>     llvm/trunk/lib/IR/DIBuilder.cpp
>>     llvm/trunk/lib/IR/DebugInfo.cpp
>>     llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp?rev=187963&r1=187962&r2=187963&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp Thu Aug  8
>> 02:40:37 2013
>> @@ -776,8 +776,7 @@ DIE *CompileUnit::getOrCreateTypeDIE(con
>>
>>  /// addType - Add a new type attribute to the specified entity.
>>  void CompileUnit::addType(DIE *Entity, DIType Ty, uint16_t Attribute) {
>> -  if (!Ty.isType())
>> -    return;
>> +  assert(Ty && "Trying to add a type that doesn't exist?");
>
>
> This assertion fires on GTest sources and TSan unit tests. I'll try to
> minimize the reproducer shortly.
>
>>
>>
>>    // Check for pre-existence.
>>    DIEEntry *Entry = getDIEEntry(Ty);
>> @@ -863,7 +862,8 @@ void CompileUnit::constructTypeDIE(DIE &
>>
>>    // Map to main type, void will not have a type.
>>    DIType FromTy = DTy.getTypeDerivedFrom();
>> -  addType(&Buffer, FromTy);
>> +  if (FromTy)
>> +    addType(&Buffer, FromTy);
>>
>>    // Add name if not anonymous or intermediate type.
>>    if (!Name.empty())
>> @@ -947,10 +947,11 @@ void CompileUnit::constructTypeDIE(DIE &
>>    }
>>      break;
>>    case dwarf::DW_TAG_subroutine_type: {
>> -    // Add return type.
>> +    // Add return type. A void return won't have a type.
>>      DIArray Elements = CTy.getTypeArray();
>>      DIDescriptor RTy = Elements.getElement(0);
>> -    addType(&Buffer, DIType(RTy));
>> +    if (RTy)
>> +      addType(&Buffer, DIType(RTy));
>>
>>      bool isPrototyped = true;
>>      // Add arguments.
>> @@ -1137,7 +1138,11 @@ CompileUnit::getOrCreateTemplateValuePar
>>      return ParamDIE;
>>
>>    ParamDIE = new DIE(VP.getTag());
>> -  addType(ParamDIE, VP.getType());
>> +
>> +  // 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());
>>    if (!VP.getName().empty())
>>      addString(ParamDIE, dwarf::DW_AT_name, VP.getName());
>>    if (Value *Val = VP.getValue()) {
>> @@ -1246,13 +1251,14 @@ DIE *CompileUnit::getOrCreateSubprogramD
>>         Language == dwarf::DW_LANG_ObjC))
>>      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();
>>    assert(SPTy.getTag() == dwarf::DW_TAG_subroutine_type &&
>>           "the type of a subprogram should be a subroutine");
>>
>>    DIArray Args = SPTy.getTypeArray();
>> -  addType(SPDie, DIType(Args.getElement(0)));
>> +  if (Args.getElement(0))
>> +    addType(SPDie, DIType(Args.getElement(0)));
>>
>>    unsigned VK = SP.getVirtuality();
>>    if (VK) {
>> @@ -1502,9 +1508,8 @@ void CompileUnit::constructArrayTypeDIE(
>>    if (CTy->isVector())
>>      addFlag(&Buffer, dwarf::DW_AT_GNU_vector);
>>
>> -  // Emit derived type.
>> +  // Emit the element type.
>>    addType(&Buffer, CTy->getTypeDerivedFrom());
>> -  DIArray Elements = CTy->getTypeArray();
>>
>>    // Get an anonymous type for index type.
>>    // FIXME: This type should be passed down from the front end
>> @@ -1522,6 +1527,7 @@ void CompileUnit::constructArrayTypeDIE(
>>    }
>>
>>    // Add subranges to array type.
>> +  DIArray Elements = CTy->getTypeArray();
>>    for (unsigned i = 0, N = Elements.getNumElements(); i < N; ++i) {
>>      DIDescriptor Element = Elements.getElement(i);
>>      if (Element.getTag() == dwarf::DW_TAG_subrange_type)
>>
>> Modified: llvm/trunk/lib/IR/DIBuilder.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=187963&r1=187962&r2=187963&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/IR/DIBuilder.cpp (original)
>> +++ llvm/trunk/lib/IR/DIBuilder.cpp Thu Aug  8 02:40:37 2013
>> @@ -759,7 +759,6 @@ DICompositeType DIBuilder::createArrayTy
>>  /// createVectorType - Create debugging information entry for a vector.
>>  DICompositeType DIBuilder::createVectorType(uint64_t Size, uint64_t
>> AlignInBits,
>>                                              DIType Ty, DIArray
>> Subscripts) {
>> -
>>    // A vector is an array type with the FlagVector flag applied.
>>    Value *Elts[] = {
>>      GetTagConstant(VMContext, dwarf::DW_TAG_array_type),
>>
>> Modified: llvm/trunk/lib/IR/DebugInfo.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DebugInfo.cpp?rev=187963&r1=187962&r2=187963&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/IR/DebugInfo.cpp (original)
>> +++ llvm/trunk/lib/IR/DebugInfo.cpp Thu Aug  8 02:40:37 2013
>> @@ -483,6 +483,12 @@ bool DICompositeType::Verify() const {
>>    if (!fieldIsMDNode(DbgNode, 12))
>>      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;
>>  }
>>
>>
>> Modified: llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll?rev=187963&r1=187962&r2=187963&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll (original)
>> +++ llvm/trunk/test/CodeGen/ARM/debug-info-blocks.ll Thu Aug  8 02:40:37
>> 2013
>> @@ -95,25 +95,25 @@ define hidden void @foobar_func_block_in
>>  !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 ]
>> -!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 ]
>>  !3 = metadata !{metadata !4}
>>  !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 ]
>>  !7 = metadata !{metadata !8}
>>  !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 ]
>>  !11 = metadata !{metadata !12, metadata !13}
>>  !12 = metadata !{i32 786472, metadata !"Unknown", i64 0} ; [
>> 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 ]
>>  !16 = metadata !{metadata !17, metadata !18}
>>  !17 = metadata !{i32 786472, metadata !"Single", i64 0} ; [
>> 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 ]
>>  !21 = metadata !{metadata !22}
>>  !22 = metadata !{i32 786472, metadata !"Eleven", i64 0} ; [
>> DW_TAG_enumerator ]
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>
>
>
> --
> Alexey Samsonov, MSK



More information about the llvm-commits mailing list