Yeah, I've been working on LLVM lately and it seems like they've solved all the problems. Somehow, they solved them in standard C++. I've been through a bunch of compilers and I could barely hang on. In LLVM, everywhere I go, I'm like: oh, so that's how you do that.
One thing that helped get started was slides from a CMU class. Hang on:
https://www.cs.cmu.edu/~15745/syllabus.html
Excellent work and so nice of them to post it for free.