[cfe-dev] Implementation of MSRecordLayoutBuilder.

Don Williamson don.williamson at yahoo.com
Thu Sep 15 05:17:44 PDT 2011


That sounds great!


________________________________
From: r4start <r4start at gmail.com>
To: Don Williamson <don.williamson at yahoo.com>
Cc: cfe-dev at cs.uiuc.edu
Sent: Thursday, September 15, 2011 12:35 PM
Subject: Re: [cfe-dev] Implementation of MSRecordLayoutBuilder.


On 15/09/2011 15:14, Don Williamson wrote: 
Sure, I started a previous thread about this:
>
>
>http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-September/016941.html
>
>http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-September/016942.html
>
>http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-September/016944.html
>
>http://lists.cs.uiuc.edu/pipermail/cfe-dev/2011-September/016970.html
>
>
>
>It boils down to two problems I've had:
>
>
>* If there is a double anywhere in a struct, MSVC pads the vftbl pointer.
>* The IsPODForThePurposeOfLayout check is invalid for MS targets and so you get a different layout depending upon whether your type has a struct or not.
>
>
>I suggested a simple patch in my last post that fixes these. My test cases so far are here:
>
>
>https://bitbucket.org/dwilliamson/clreflect/src/tip/src/clReflectTest/TestOffsets.cpp
>
>
>
>my patch works for all of them but unfortunately I haven't had time to sync to the lastest build of clang so I'm not in a position to submit a patch.
>
>
>It would be nice if we could figure something out that solves the biggest number of cases :)
>
>
>Cheers,
>- Don
>
>
>
>________________________________
>From: r4start <r4start at gmail.com>
>To: Don Williamson <don.williamson at yahoo.com>
>Cc: cfe-dev at cs.uiuc.edu
>Sent: Thursday, September 15, 2011 12:06 PM
>Subject: Re: [cfe-dev] Implementation of MSRecordLayoutBuilder.
>
>
>On 15/09/2011 14:52, Don Williamson wrote: 
>Hi Dmitry,
>>
>>
>>I'm really interested in the original test cases you have that failed with the original implementation of the record layout builder - could you share them?
>>
>>
>>How does your current patch work with the following test:
>>
>>
>>#pragma pack(push, 8)
>>class B {
>>public:
>>  virtual void b(){}
>>  int a;
>>  double b;
>>};
>>#pragma pack(pop)
>>
>>
>>Have you also tried test cases with and without constructors?
>>
>>
>>Thanks,
>>- Don
>>
>>
>>
>>________________________________
>>From: r4start <r4start at gmail.com>
>>To: John McCall <rjmccall at apple.com>
>>Cc: cfe-dev at cs.uiuc.edu
>>Sent: Thursday, September 15, 2011 11:20 AM
>>Subject: Re: [cfe-dev] Implementation of MSRecordLayoutBuilder.
>>
>>On 15/09/2011 00:39, r4start wrote:
>>> On 15/09/2011 00:36, John McCall wrote:
>>>> On Sep 14, 2011, at 1:33 PM, r4start
                      wrote:
>>>> 
>>>>> On 15/09/2011 00:24, John McCall
                      wrote:
>>>>>> On Sep 14, 2011, at 1:23 PM,
                      r4start wrote:
>>>>>>> On 14/09/2011 21:53, John
                      McCall wrote:
>>>>>>>> On Sep 14, 2011, at 4:05
                      AM, r4start wrote:
>>>>>>>> 
>>>>>>>>> On 14/09/2011 00:42,
                      r4start wrote:
>>>>>>>>>> On 14/09/2011
                      00:37, Eli Friedman wrote:
>>>>>>>>>>> On Mon, Sep
                      12, 2011 at 11:45 PM, r4start<r4start at gmail.com>    wrote:
>>>>>>>>>>>> On
                      12/09/2011 21:57, r4start wrote:
>>>>>>>>>>>>> On
                      12/09/2011 21:37, Eli Friedman wrote:
>>>>>>>>>>>>>>
                      On Mon, Sep 12, 2011 at 8:56 AM, r4start<r4start at gmail.com>      wrote:
>>>>>>>>>>>>>>>
                      Hi,
>>>>>>>>>>>>>>>
                      I have some prototype code for
                      MSRecordLayoutBuilder. I test
>>>>>>>>>>>>>>>
                      this code
>>>>>>>>>>>>>>>
                      with MSVS 2010 and \Zp8 compiler option. On simple
                      examples it
>>>>>>>>>>>>>>>
                      seems to
>>>>>>>>>>>>>>>
                      work properly.
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>
                      Is it interesting to the clang project?
>>>>>>>>>>>>>>
                      We certainly want to fix any cases where clang
                      does not do struct
>>>>>>>>>>>>>>
                      layout consistently with MSVC on Windows.  It's
                      hard to comment on
>>>>>>>>>>>>>>
                      your patch without seeing it.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>
                      -Eli
>>>>>>>>>>>>> Now
                      I'm not at work. When I come to work I'll send a
                      patch.
>>>>>>>>>>>>> 
>>>>>>>>>>>>> -
                      Dmitry
>>>>>>>>>>>> Here is
                      patch for MSRecordLayoutBuilder.
>>>>>>>>>>> I think it
                      would be better to integrate the checks into the
                      main
>>>>>>>>>>>
                      RecordLayoutBuilder class rather than subclassing
                      it.
>>>>>>>>>>> 
>>>>>>>>>>> Please
                      include tests in your patch.  (See
                      test/CodeGen/ms_struct.c for
>>>>>>>>>>> an example.)
>>>>>>>>>>> 
>>>>>>>>>>> I would like
                      someone more familiar with MSVC to review the
                      actual
>>>>>>>>>>> logic here
                      (ping me if nobody does within a few days, though,
                      and I'll
>>>>>>>>>>> try to review
                      anyway).
>>>>>>>>>>> 
>>>>>>>>>>> -Eli
>>>>>>>>>> Ok, thanks for
                      hint.
>>>>>>>>>> 
>>>>>>>>>> -Dmitry.
>>>>>>>>> I have a problem when
                      writing a test. Clang doesn't implement Microsoft
>>>>>>>>> ABI and he crashes at
                      code generation stage.
>>>>>>>>> Clang have
                      dump-record-layouts option but he prints AST
                      layouts and
>>>>>>>>> CodeGen layouts.
>>>>>>>>> 
>>>>>>>>> Is there a way to
                      save only AST record layout to file and then check
>>>>>>>>> or maybe my patch
                      must include CGRecordLayoutBuilder for Microsoft?
>>>>>>>> It would be easy enough
                      to add a new testing switch if you'd like to get
                      this in.
>>>>>>> Can you give me some hint how
                      can I do this?
>>>>>> Follow the code for
                      -dump-record-layouts.
>>>>> You propose to duplicate the output
                      to a file and then run FileCheck to check output,
                      am I right?
>>>> It would probably be better to run
                      FileCheck directly on the output, but
>>>> I think you get the general idea.
>>>> 
>>>> Whenever you get CGRecordLayoutBuilder
                      working adequately, you can rip
>>>> out the new option and just use
                      -dump-record-layouts.
>>>> 
>>>> John.
>>> Ok, thanks. Tomorrow I'll do it.
>>> 
>>Here is a test and patch.
>>
>>- Dmitry.
>>
>>
>>_______________________________________________
>>cfe-dev mailing list
>>cfe-dev at cs.uiuc.edu
>>http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
>>
>>
Hi,
>what I get from MSVS output :
>
>class B    size(24):
>1>      +---
>1>   0    | {vfptr}
>1>   8    | a
>1>         | <alignment member> (size=4)
>1>  16   | c
>1>      +---
>
>And this I get from clang with my patch:
>   0 | class B
>   0 |   (B vtable pointer)
>   4 |   int a
>   8 |   double c
>  sizeof=16, dsize=16, align=8
>  nvsize=16, nvalign=8
> 
>I'll try to fix this.
>
>What do you mean when you say "Have you also tried test cases with and without constructors?", can you give me some examples and I check them.
>
>- Dmitry.
>
>
>
Thanks for examples. I'll add your patch to my code.
I think it will be great if we will have full support for Microsoft
    layout.

- Dmitry.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20110915/72d6f720/attachment.html>


More information about the cfe-dev mailing list