[llvm] r208502 - DwarfUnit: Make explicit a limitation/bug in enumeration constant emission.
David Blaikie
dblaikie at gmail.com
Mon May 12 11:05:10 PDT 2014
On Mon, May 12, 2014 at 10:48 AM, Adrian Prantl <aprantl at apple.com> wrote:
>
>> On May 12, 2014, at 10:44 AM, David Blaikie <dblaikie at gmail.com> wrote:
>>
>> 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?
>
> It does, and they will run straight into the assertion (which should be relaxed, in the sense of "removed” ;-).
Why would they run into the assertion? The member variables have a
"type derived from" (being their underlying type - int, for example)
and thus they'll go through the recursive call, reach a base type, and
we'll discover that it's a signed or unsigned int, etc. No?
- David
>>
>>> 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