As someone who writes a lot of toy languages, I made this scaffolding for a LLVM-based compiler: https://github.com/finiteloop/compiler It uses Bison and Flex for parsing and lexing unlike this post, but may be a useful starting point for those building their own toy languages.
Doesn’t the LLVM API go through breaking changes fairly often? How do you track all that and keep your sanity?
No, not very big ones. But they give no stability promises.
If you're using a language other than C++ via API bindings, you will experience some churn going from version to version as the bindings need to be updated too.