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