[LLVMdev] Wrong type qualifier for this pointer in case of ARM compiled binary

Karthik Bhat karthikthecool at gmail.com
Tue Oct 2 00:15:43 PDT 2012


Hi Tim,

Thanks. I just went through the function and yah as you said i looked into
the standard and it seems to be as per C++11. Was confused by the
documentation at http://msdn.microsoft.com/en-us/library/ytk2ae82.aspx which
mentioned this should be always const which may not be right as mentioned
at http://stackoverflow.com/questions/6067244/type-of-this-pointer .

Thanks for the input.

On Tue, Oct 2, 2012 at 12:34 PM, Tim Northover <t.p.northover at gmail.com>wrote:

> Hi Karthik,
>
> > Expected result when we run -
> >
> > print Simple::fun  in GDB is
> > void fun(Simple* const this)
> >
> > as this should be a const pointer but in case of arm compiled binary we
> get
> > void fun(Simple* this).
>
> I believe the actual type is coming from CXXMethodDecl::getThisType,
> which quotes the standard as saying:
>
>   // C++ 9.3.2p1: The type of this in a member function of a class X is X*.
>   // If the member function is declared const, the type of this is const
> X*,
>   // if the member function is declared volatile, the type of this is
>   // volatile X*, and if the member function is declared const volatile,
>   // the type of this is const volatile X*.
>
> I.e. no const where you're expecting it.
>
> I've checked the standards, and we're not making it up either: both
> C++11 and C++03 say the same.
>
> > Seems to be problem with qualifier type but was wondering how is this
> > target dependent?
>
> I think it's the gdb programs that are printing different things for
> the same DWARF debug information. Dumping the information from the x86
> binary gives:
>
> <1><6b>: Abbrev Number: 6 (DW_TAG_class_type)
>     <6c>   DW_AT_name        : (indirect string, offset: 0x3e): Simple
>     <70>   DW_AT_byte_size   : 1
>     <71>   DW_AT_decl_file   : 1
>     <72>   DW_AT_decl_line   : 1
> [...]
> <3><7f>: Abbrev Number: 8 (DW_TAG_formal_parameter)
>     <80>   DW_AT_type        : <0x86>
>     <84>   DW_AT_artificial  : 1
>     <84>   DW_AT_object_pointer: 1
> <1><86>: Abbrev Number: 9 (DW_TAG_pointer_type)
>     <87>   DW_AT_type        : <0x6b>
>
> The "this" parameter has type "Simple *" as expected, but also has the
> attribute DW_AT_object_pointer. My guess is that the x86 gdb decides
> to print it as "const" because of this, but the ARM one doesn't.
>
> Hope this helps.
>
> Tim.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121002/415b8b32/attachment.html>


More information about the llvm-dev mailing list