generate llvm ir programmatically