[llvm] r208502 - DwarfUnit: Make explicit a limitation/bug in enumeration constant emission.

David Blaikie dblaikie at gmail.com
Mon May 12 10:44:46 PDT 2014


On Mon, May 12, 2014 at 10:28 AM, Adrian Prantl <aprantl at apple.com> wrote:
>
>> On May 11, 2014, at 10:04 AM, David Blaikie <dblaikie at gmail.com> wrote:
>>
>> Author: dblaikie
>> Date: Sun May 11 12:04:05 2014
>> New Revision: 208502
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=208502&view=rev
>> Log:
>> DwarfUnit: Make explicit a limitation/bug in enumeration constant emission.
>>
>> Filed as PR19712, LLVM fails to detect the right type of an enum
>> constant when a frontend does not provide an underlying type for the
>> enumeration type.
>>
>> Modified:
>>    llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>>
>> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp?rev=208502&r1=208501&r2=208502&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfUnit.cpp Sun May 11 12:04:05 2014
>> @@ -748,12 +748,17 @@ void DwarfUnit::addBlockByrefAddress(con
>> /// Return true if type encoding is unsigned.
>> static bool isUnsignedDIType(DwarfDebug *DD, DIType Ty) {
>>   DIDerivedType DTy(Ty);
>> -  if (DTy.isDerivedType())
>> -    return isUnsignedDIType(DD, DD->resolve(DTy.getTypeDerivedFrom()));
>> +  if (DTy.isDerivedType()) {
>> +    if (DIType Deriv = DD->resolve(DTy.getTypeDerivedFrom()))
>> +      return isUnsignedDIType(DD, Deriv);
>> +    // FIXME: Enums without a fixed underlying type have unknown signedness
>> +    // here, leading to incorrectly emitted constants.
>> +    assert(DTy.getTag() == dwarf::DW_TAG_enumeration_type);
>> +    return false;
>> +  }
>
> This should be relaxed to allow other DIDerivedTypes, including DIComposite types.

What relaxation did you have in mind? "isDerivedType" returns true for
DICompositeTypes too, I believe - so perhaps it's already as relaxed
as you were suggesting it should be?

> I’m imagining a world where SROA does not elide debug info, and a function like this:
>
> struct S { int c; };
> int foo() {
>   struct S s = { 42 };
>   return s.c;
> }
>
> Walking the struct members to find their signedness will be fun!

Yeah... :)

- David

>
> cheers,
> adrian
>>
>>   DIBasicType BTy(Ty);
>> -  if (!BTy.isBasicType())
>> -    return false;
>> +  assert(BTy.isBasicType());
>>   unsigned Encoding = BTy.getEncoding();
>>   assert(Encoding == dwarf::DW_ATE_unsigned ||
>>          Encoding == dwarf::DW_ATE_unsigned_char ||
>
>
>
>




More information about the llvm-commits mailing list