[llvm-commits] [llvm-gcc-4.2] r47655 - /llvm-gcc-4.2/trunk/gcc/llvm-types.cpp
Dale Johannesen
dalej at apple.com
Wed Feb 27 09:59:59 PST 2008
On Feb 26, 2008, at 9:20 PM, Chris Lattner wrote:
> On Feb 26, 2008, at 5:32 PM, Dale Johannesen wrote:
>> URL: http://llvm.org/viewvc/llvm-project?rev=47655&view=rev
>> Log:
>> Hack to handle darwin ppc32's weird choice of
>> representation for bool. Fixes
>> gcc.dg-struct-layout-1/t009
Sorry, I assumed some familiarity with the testsuite structure, and
have the pathname wrong to boot. The file struct-layout-1.exp builds
tests dynamically; it lives in <llvm-gcc.src>/gcc/testsuite/gcc.dg/
compat. The dynamically built tests consist of 3 source files each of
whose names contains a string of the form t0<2-digit number>. The
easiest way to run them is
cd <llvm-gcc.obj>
make -k check RUNTESTFLAGS=struct-layout-1.exp
and look at the log file in <llvm-gcc.obj>/gcc/testsuite/gcc/gcc.log
to see what got executed. There is also a C++ variant.
These tests exercise self-consistency in struct/union layout and
calling convention very thoroughly (they are not ABI tests against the
installed cc), and are well worth looking at.
Currently, this passes cleanly on Darwin x86-32 (finally!) but there
are lots of other failures on ppc32, which I'll be looking at.
Anton said there are also a few failures left on Linux x86-32, but
that thread seems to have died...
>> Nice!
Really?
>
>> tree TheGccTy = TREE_TYPE(Field);
>> +#ifdef TARGET_POWERPC
>
> Eww. :) Is this information encoded in the trees somehow? Duncan, do
> you have any idea? Dale, can you include a tree dump of the type in
> this case?
That's more like it. This is the source (remember _Bool is 4 bytes):
typedef _Bool Tal2bool __attribute__((aligned (2)));
union {Tal2bool g:1;} u;
and this is the tree:
<union_type 0x104bbd0 type_0 HI
size <integer_cst 0x42804420 type <integer_type 0x4280d070
bit_size_type> constant invariant 16>
unit size <integer_cst 0x42804450 type <integer_type 0x4280d000
long unsigned int> constant invariant 2>
user align 16 symtab 0 alias set -1
fields <field_decl 0x104bc40 g
type <boolean_type 0xe89b60 Tal2bool public unsigned SI
size <integer_cst 0x42804600 constant invariant 32>
unit size <integer_cst 0x42804120 constant invariant 4>
user align 16 symtab 0 alias set -1 precision 1 min
<integer_cst 0x428049f0 0> max <integer_cst 0x42804a50 1>>
unsigned external asm-frame-size 0 bit-field nonaddressable
decl_4 SI file /Volumes/MacOS9/gcc/llvm-gcc-4.2.leo.obj/gcc/testsuite/
gcc/gcc.dg-struct-layout-1/t009_test.h line 47
size <integer_cst 0x42804f00 constant invariant 1>
unit size <integer_cst 0x42804240 constant invariant 1>
align 1 offset_align 128
offset <integer_cst 0x42804150 constant invariant 0>
bit offset <integer_cst 0x42804d20 constant invariant 0>
bit_field_type <boolean_type 0xe89b60 Tal2bool> context <union_type
0x104bbd0>>
pointer_to_this <pointer_type 0x104bd90> chain <type_decl
0x1203080 D.5522>>
On Feb 26, 2008, at 10:35 PM, Anton Korobeynikov wrote:
>> +#ifdef TARGET_POWERPC
> Also, maybe it will be better to move this chunk of code into
> config/rs6000 directory? The same way as TARGET_ADJUST_LLVM_CC and
> friends are working?
Sure, I can do that. Personally I've never like this part of gcc
style, which seems to me to obscure what's going on, but it is
traditional.
> + // Normally gcc reduces the size of bitfields to the size
> necessary
> + // to hold the bits, e.g. a 1-bit field becomes QI.
On Feb 27, 2008, at 12:43 AM, Duncan Sands wrote:
>> + // Normally gcc reduces the size of bitfields to the size
>> necessary
>> + // to hold the bits, e.g. a 1-bit field becomes QI.
>
> So this is a union with a bitfield member? If so, can you not just
> do:
>
> (1) use isBitfield to see if it is a bitfield.
> (2) rather than converting the type (which should be completely
> ignored in
> the case of a bitfield), generate i8, i16 or whatever based on
> DECL_SIZE.
>
> And don't condition this on PPC or other tests. If the problem is
> what I'm
> imagining it is, this is needed in general: though we usually get
> away with
> it by using the type generated by gcc's struct layout, we don't in
> fact want
> to use the types produced by gcc's struct layout for bitfields (we
> don't in
> the rest of the struct conversion stuff).
ConvertUnion does in fact look at the type of bitfields; I didn't
introduce this. In all other cases I've seen, gcc has already done
the reduction to i8 etc. that you're talking about, so in general this
works. The problem here is that the type of the bitfield is bigger
than the type of the union; that is due to Darwin ppc32's bizarre
choice of representation for bool, and I don't think it can happen
otherwise.
More information about the llvm-commits
mailing list