According to the Assembly language reference: "In LLVM, opaque types can
eventually be resolved to any type (not just a structure type)." But
the only way I can think of to do so is to give it a type name, then
later redeclare the name. But that gives an error:
%TO = type opaque
%TF = type i32 ( %TO* )
%TO = type %TF
gives:
$ llvm-as types1.ll
llvm-as: types1.ll:3:1: error: redefinition of type
%TO = type %TF
^
Also, what is the set of things that can be done with an as-yet unresolved
opaque type?
In the textual form of LLVM IR, forward references are legal, so you shouldn’t need this kind of redeclaration. You example could be:
%TF = type i32 (%TO*)
%TO = type %TF
However, llvm-as rejects it with “error: forward references to non-struct type”, but that’s a different issue.
In the textual form of LLVM IR, forward references are legal, so you shouldn't need this kind of redeclaration. You example could be:
%TF = type i32 (%TO*)
%TO = type %TF
However, llvm-as rejects it with "error: forward references to non-struct type", but that's a different issue.
Thanks, that helps. I am seeing some of this now by doing experiments with handwritten IR assembly.
It looks like I will have to artificially wrap some types in a one-member struct.