I have been looking through the LLVM documentation, and I have decided
that I would be interested in producing a functional front-end for it,
if only to determine how applicable the optimizations that it already
performs are to such a language. However, I have run into one obstacle
that would make it difficult to write many of the things I would like to
do. Is there a way to represent a union of types in LLVM?
Specifically, how would you suggest representing something like:
datatype foo = NUM of int
| PAIR of int * int
| STRING of string
I realize I *COULD* do it as a pair of an integer tag and the data, or
any of the numerous ways that have been devised for representing such
types in other functional languages. The problem that I see is that any
optimizations for which LLVM needs types to perform would basically be
prohibited this technique. So, I guess what I'm asking is, is there a
way of representing tagged union types in LLVM that doesn't prevent
providing accurate type information?
-- Ben Chambers
On Wed, 3 May 2006, Ben Chambers wrote:> I realize I *COULD* do it as a pair of an integer tag and the data, or any of > the numerous ways that have been devised for representing such types in other > functional languages.Yup, you should treat LLVM as a slightly-higher level machine language. As such, you should lower it into an explicit "union" (using pointer casts etc).> The problem that I see is that any optimizations for > which LLVM needs types to perform would basically be prohibited this > technique. So, I guess what I'm asking is, is there a way of representing > tagged union types in LLVM that doesn't prevent providing accurate type > information?No, there isn't. -Chris -- http://nondot.org/sabre/ http://llvm.org/