The CFG needs a proper representation for pointers
The CFG does not have an effective way to represent pointers, consequently, some constructs are not correctly implemented. One example is the Type::BufferPointer that originates after we advance a pointer to the struct vector data area. The nonexistence of a pointer representation also forestalls the correct generation of system calls that require pointers as arguments.
We do an awful lot of pointer conversions (like making a value a pointer by saving it on the stack) in emit. Ideally we would not do this at all in emit.
In the CFG, Type::Struct() means a pointer to a struct. How do we represent the type after an Expression::Load?
I think that is one of the things that needs fixing. Type::Struct(..) should be exactly a struct, and Expression::Load(..) should take a pointer argument (e.g Type::Ref(Type::Struct()) or maybe we should rename it Type::Ptr(..)