[LLVMdev] type-system-rewrite branch landing tomorrow

Nick Lewycky
Sat, 09 Jul 2011 22:03:53 -0000

Nick Lewycky wrote:
> Jay Foad wrote:
>>> ... and it's in.  Please let me know if you see any problems.
>>
>> My clang self-hosted build (Release+Asserts on Release+Asserts, Linux
>> x86_64) fails with:
>>
>> make[2]: Entering directory `/home/jay/llvm/objdir-self/tools/opt'
>> llvm[2]: Compiling GraphPrinters.cpp for Debug+Asserts build
>> clang:
/home/jay/svn/llvm-project/llvm/trunk/include/llvm/Support/Casting.h:194:
>> typename llvm::cast_retty<To, From>::ret_type llvm::cast(const
Y&)
>> [with X = llvm::FunctionType, Y = llvm::Type*, typename
>> llvm::cast_retty<To, From>::ret_type = llvm::FunctionType*]:
Assertion
>> `isa<X>(Val)&&   "cast<Ty>() argument of
incompatible type!"' failed.
>>
>> This is one of the cases that was giving me grief when I was working
>> on the Clang bits! Here's a small C testcase:
>>
>> $ cat foo.c
>> struct S;
>> extern struct T {
>>     struct S (*p)(void);
>> } t;
>> struct S { int i; };
>> void g(void) {
>>     t.p();
>> }
>
> Here's a subset of that problem. This C program:
>
>     struct S;
>     struct T {
>       struct S *s;
>     } t;
>     struct S { int i; };
>
> produces IR with the definition of both %struct.S and %struct.T. This
> program however:
>
>     struct S;
>     struct T {
>       struct S (*p)(void);
>     } t;
>     struct S { int i; };
>
> outputs a "%struct.T = type { {}* }" with no mention of struct S
(or for
> that matter, the fact it's a function!)

I was thinking we should fix this by emitting a function with a
reference to abstract %struct.S. Turns out we can't quite do that
because the definition of the struct changes whether the function
returns the struct or returns void and takes a struct pointer as an sret
value, etc. Looks like we just got nailed by the ABI problem.

It looks like we need to have opaque function types? Or we need to defer
emission of some types until we've finished the translation unit.

Nick

PS. On a related note, in another thread last week I proposed that we
stop changing the function type for the ABI, and instead add
ABI-specific notes to the Function.
http://lists.cs.uiuc.edu/pipermail/llvmdev/2011-June/040643.html

> Nick
>
>> $ clang -cc1 -emit-llvm foo.c
>> clang:
/home/jay/svn/llvm-project/llvm/trunk/include/llvm/Support/Casting.h:194:
>> typename llvm::cast_retty<To, From>::ret_type llvm::cast(const
Y&)
>> [with X = llvm::FunctionType, Y = llvm::Type*, typename
>> llvm::cast_retty<To, From>::ret_type = llvm::FunctionType*]:
Assertion
>> `isa<X>(Val)&&   "cast<Ty>() argument of
incompatible type!"' failed.
>>
>> Jay.
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>