[cfe-dev] clang-c: determining struct layout
Jacob Carlborg
doob at me.com
Mon Jul 14 08:01:38 PDT 2014
On 13/07/14 10:34, Corey Richardson wrote:
> The C bindings generator for Rust uses clang-c, and we're hitting an
> issue with anonymous unions
> (https://github.com/crabtw/rust-bindgen/issues/94). In particular,
> given a simple program that will walk the AST and print the
> names/kinds of every cursor
> (https://gist.github.com/cmr/9adfcc2e65488699f453), the following
> code:
>
> struct bar {
> union {
> int a;
> int b;
> };
> union {
> int x;
> int y;
> } z;
> };
>
> prints the AST:
>
> __int128_t <TypedefDecl>
> __uint128_t <TypedefDecl>
> __builtin_va_list <TypedefDecl>
> __va_list_tag <TypeRef>
> bar <StructDecl>
> !anonymous <UnionDecl>
> a <FieldDecl>
> b <FieldDecl>
> !anonymous <UnionDecl>
> x <FieldDecl>
> y <FieldDecl>
> z <FieldDecl>
> !anonymous <UnionDecl>
> x <FieldDecl>
> y <FieldDecl>
>
> However, I see no way to determine the layout that `bar` should have.
> Moreover, the AST seems to be incomplete. clang -cc1 -ast-dump makes:
I have similar tool, but generates bindings for D.
> TranslationUnitDecl 0x2856dd0 <<invalid sloc>>
> |-TypedefDecl 0x28572d0 <<invalid sloc>> __int128_t '__int128'
> |-TypedefDecl 0x2857330 <<invalid sloc>> __uint128_t 'unsigned __int128'
> |-TypedefDecl 0x2857680 <<invalid sloc>> __builtin_va_list '__va_list_tag [1]'
> `-RecordDecl 0x28576d0 <foo.c:1:1, line:10:1> struct bar definition
> |-RecordDecl 0x2857770 <line:2:5, line:5:5> union definition
> | |-FieldDecl 0x2857820 <line:3:9, col:13> a 'int'
> | `-FieldDecl 0x2857880 <line:4:9, col:13> b 'int'
> |-FieldDecl 0x2857920 <line:2:5> 'union bar::<anonymous at foo.c:2:5>'
> |-IndirectFieldDecl 0x2857980 <line:3:13> a 'int'
> | |-Field 0x2857920 '' 'union bar::<anonymous at foo.c:2:5>'
> | `-Field 0x2857820 'a' 'int'
> |-IndirectFieldDecl 0x28579d0 <line:4:13> b 'int'
> | |-Field 0x2857920 '' 'union bar::<anonymous at foo.c:2:5>'
> | `-Field 0x2857880 'b' 'int'
> |-RecordDecl 0x2857a10 <line:6:5, line:9:5> union definition
> | |-FieldDecl 0x289ec20 <line:7:9, col:13> x 'int'
> | `-FieldDecl 0x289ec80 <line:8:9, col:13> y 'int'
> `-FieldDecl 0x289ed20 <line:6:5, line:9:7> z 'union <anonymous union
> at foo.c:6:5>':'union bar::<anonymous at foo.c:6:5>'
>
>
> which has extra IndirectFieldDecl's and one extra FieldDecl. Is it
> just a matter of fixing clang-c to expose more of the AST? Is there
> something better we should be using for our bindings generator?
I would prefer to having it fixed in clang-c, if possible.
--
/Jacob Carlborg
More information about the cfe-dev
mailing list