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.Ok.> 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*)Cool.> > 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. -Dave
On Nov 12, 2008, at 3:37 PM, David Greene wrote:>>> 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.How is this any different than the struct case of {\2*} ? -Chris
On Wednesday 12 November 2008 18:58, Chris Lattner wrote:> On Nov 12, 2008, at 3:37 PM, David Greene wrote: > >>> 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. > > How is this any different than the struct case of {\2*} ?I don't know. All I know is when I called %t2->refineAbstractType(%t1, %t2) it didn't work. That was the pointer of the question. RefineAbstractTypes doesn't "see" beyond the pointer type. I think the answer is that I have to resolve the pointer type, not the function type: %t1 = type opaque %t1.5 = type %t1 * %t2 = type void(%t1.5) %t1.5->refineAbstractType(%t1, %t2) -Dave