[LLVMdev] Replacing types, use of refineAbstractType

Eric McCorkle ericmcc at cs.umass.edu
Tue Aug 3 08:07:08 PDT 2010

I'm working on a personal project which involves lowering a superset of 
LLVM to "vanilla" LLVM.  Part of this involves rewriting types.  I'm 
working off of the 2.6 code base, so this may have been addressed in a bug 

I'm having trouble with refineAbstractType and recursive types. 
Specifically, I'm creating opaque types to serve as placeholders for the 
final recursive type, then using refineAbstractType to replace the 
placeholders with the actual type.  However, pointers to the opaque type 
aren't being replaced with pointers to the actual type, which causes 
errors further down the line.

For instance, if I had a type:

%t = { %t*, ... }

My pass would begin constructing a new type, say %t_1, and would replace 
all instances of %t with an opaque type, so...

$t_0 = opaque
%t_1 = { %t_0*, ... }

At the end, it calls t_1->refineAbstracType(t_0, t_1) to replace instances 
of t_0 with t_1.  But the resulting type I get is still

%t_1 = { %t_0*, ... }

Is this a bug, or is it supposed to work this way, and I need to do 
something else to accomplish what I'm trying to accomplish?

More information about the llvm-dev mailing list