Search code examples
llvmllvm-c++-api

generate machine code directly via LLVM API


With the following code, I can generate an LLVM bitcode file from a module:

llvm::Module * module;

// fill module with code
module = ...;

std::error_code ec;
llvm::raw_fd_ostream out("anonymous.bc", ec, llvm::sys::fs::F_None);

llvm::WriteBitcodeToFile(module, out);

I can then use that bitcode file to generate an executable machine code file, e.g.:

clang -o anonymous anonymous.bc

Alternatively:

llc anonymous.bc
gcc -o anonymous anonymous.s

My question now is: Can I generate the machine code directly in C++ with the LLVM API without first needing to write the bitcode file?

I am looking for either a code example or at least some starting points in the LLVM API, e.g. which classes to use, nudging me in the right direction might even be enough.


Solution

  • Take a look at llc tool source, spcifically compileModule() function. In short, it creates Target, sets some options for it via TargetOptions, then uses it to addPassesToEmitFile() and finally asks PassManager to perform all planned tasks.