On Wed, Nov 7, 2012 at 12:56 AM, Jin Gu Kang <[email protected]> wrote:
> Hi all,
>
> I found a strange result on clang-3.1 when recursive type was converted. A 
> example is as following.
> C language source code:
> struct foo1 {
>   struct foo2* a;
>   struct foo3* b;
> };
> struct foo2 {
>   void (*func1)(struct foo1*);
> };
> struct foo3 {
>   void (*func1)(struct foo1*);
> };
> struct foo2 e;
>
> Converted result to llvm IR:
> %struct.foo2 = type { void (%struct.foo1*)* }
> %struct.foo1 = type { %struct.foo2*, %struct.foo3* }
> %struct.foo3 = type { {}* }
> @e = common global %struct.foo2 zeroinitializer, align 4
>
> struct.foo3 type has "{}*". The reason of strange result is that clang 
> generates struct type for function type with parameter of cycled type as 
> following.
> File: clang/lib/CodeGen/CodeGenTypes.cpp
> 463     // While we're converting the argument types for a function, we don't 
> want
> 464     // to recursively convert any pointed-to structs.  Converting 
> directly-used
> 465     // structs is ok though.
> 466     if (!RecordsBeingLaidOut.insert(Ty)) {
> 467       ResultType = llvm::StructType::get(getLLVMContext());
> 468
> 469       SkippedLayout = true;
> 470       break;
> 471     }
>
> I think that cycle of types should be cut to translate cycled clang types 
> into llvm IR so clang generates struct type as type holder. Is it right? What 
> do you think about this?
>
> I made a simple patch for clang-3.1 to fix this problem. Resolved result is 
> as following.
> Resolved result:
> %struct.foo2 = type { void (%struct.foo1*)* }
> %struct.foo1 = type { %struct.foo2*, %struct.foo3* }
> %struct.foo3 = type { void (%struct.foo1*)* }
> @e = common global %struct.foo2 zeroinitializer, align 4
>
> Please review this patch.

Your patch is missing a testcase.

Please submit patches based on trunk.

I don't think it's a good idea to make ConvertType return null.  And I
think you should be handling an issue with FunctionTypes in the
FunctionType code.

-Eli
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to