We have some macros and a bunch of functions then that make emitting LLVM IR simpler. For example, the "ins--iterate" and "ins--if" / "ins--else" macros in this code handle phi nodes and so on:
https://github.com/dylan-lang/opendylan/blob/05271f6fec9da05...
This library is currently in the process of being updated from LLVM 3.5 to current HEAD as debug info has changed significantly upstream. After that, we will be landing some documentation for it as well.
If you're interested in learning or hearing more about this, we're typically around on #dylan on freenode IRC.
The LLVM GC interface is controlled through intrinsics, so you can access it through the human-readable IR representation just as you can with the API.
The obvious one is not having a giant build time dependency that might change and be at different versions on different platforms. The text interface is far more stable.
The problem I had with doing this is how picky llvm is when it comes to ordering your temporary registers.