[LLVMdev] RefineAbstractType

David Greene dag at cray.com
Wed Nov 12 15:37:23 PST 2008

On Wednesday 12 November 2008 17:29, Chris Lattner wrote:

> In fact, I strongly suspect that RefineAbstractType doesn't work if
> you give it something that isn't Opaque.  I'd recommend only using it
> on Opaque, not random abstract types.


> Sure, LLVM is more general than C.  In LLVM, you can have a pointer
> that points to itself, for example:
> %t = type %t*
> which is "\1*" if you like up references.
> I'm not sure what a function pointer that takes a pointer to itself
> has to do with opaque types, but you'd write it like this:

It has to do with the way we're processing things right now.  We have to
break the processing recursion so we create an Opaque type as a stand-in
for the (yet-to-be-completed) FunctionType when we encounter an argument
referencing the (yet-to-be-completed) FunctionType.  We want to resolve those
OpaqueTypes once we have the FunctionType constructed.

> %t = type void (%t)*
> or if you want the function:
> %t = type void (%t*)


> > Unfortunately, calling FunctionType::refineAbstractType(opaque, void
> > (...))
> > doesn't work because RefineAbstractType doesn't recurse down into the
> > pointee types.
> What types are you starting out with?  If you had the equivalent of:
> %t1 = type opaque
> %t2 = type void(%t1*)
> and you refine t1 -> t2, it should work.

I'm not sure it will.  %t1* is the "contained" type inside the FunctionType.
RefineAbstractTypes expects the OldType (%t1 in this case) to be in the
contained type set.  Since a _pointer_ to %t1 is in the contained set, it
doesn't see it.


More information about the llvm-dev mailing list