On Jul 12, 2011, at 5:04 AM, Vitaly Lugovskiy wrote:> Hi Chris, > > What's a new way of building recursive types (with C bindings), once > RefineType had been removed? And what's an exact reason for getting > rid of the opaque types - I could not find a relevant discussion in a > mailing list.Hi Vitaly, I didn't add this API, because I'm not very familiar with the C API. It should be very straight-forward: just expose a wrapper for "StructType::setBody" and "StructType::createNamed". Some motivation for the change is here: http://nondot.org/sabre/LLVMNotes/TypeSystemRewrite.txt -Chris
> Hi Vitaly, > > I didn't add this API, because I'm not very familiar with the C API. It should be very straight-forward: just expose a wrapper for "StructType::setBody" and "StructType::createNamed". > > Some motivation for the change is here: > http://nondot.org/sabre/LLVMNotes/TypeSystemRewrite.txtFYI, I should have a patch for this today or tomorrow. I am first trying it on the rust compiler, as soon as I get it bootstrapping I will post the patches.> -ChrisCheers, Rafael
> Hi Chris, > > What's a new way of building recursive types (with C bindings), once > RefineType had been removed? And what's an exact reason for getting > rid of the opaque types - I could not find a relevant discussion in a > mailing list.A simple example for recursive type may be as following. /* C struct type */ struct foo { struct foo *a; }; /* Method */ StructType *STy = StructType::createNamed(Context, "struct.foo"); PointerType *PTy = STy->getPointerTo(); std::vector<Type*> Elements; bool isPacked = false; Elements.push_back((Type*)PTy); STy->body(Elements, isPacked); /* Result of llvm IR */ %struct.foo = type { %struct.foo* } Thanks, Jin-Gu Kang