我在 Fedora 31 上使用 llvm-devel.x86_64 9.0.1-5.fc31。完整代码如下。
main.cc(这是加载 LLVM 位码的 C++ 应用)
#include <iostream>
#include <llvm/IR/Module.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/Support/SourceMgr.h>
#include <llvm/ExecutionEngine/ExecutionEngine.h>
#include <llvm/ExecutionEngine/GenericValue.h>
using std::unique_ptr;
using std::cout;
using std::endl;
using llvm::Module;
using llvm::SMDiagnostic;
using llvm::LLVMContext;
using llvm::parseIRFile;
using llvm::StringRef;
using llvm::ExecutionEngine;
using llvm::EngineBuilder;
using llvm::ArrayRef;
using llvm::GenericValue;
using llvm::Function;
int main(int argc, char const *argv[]) {
LLVMContext context;
SMDiagnostic error;
unique_ptr<Module> mod = parseIRFile(StringRef("hosted.bc" /* .ll files also work */), error, context);
ExecutionEngine *executionEngine = EngineBuilder(std::move(mod)).setEngineKind(llvm::EngineKind::Interpreter).create();
Function *add = executionEngine->FindFunctionNamed(StringRef("add"));
GenericValue param1, param2;
param1.FloatVal = 5.5;
param2.FloatVal = 2.7;
GenericValue params[] = { param1, param2 };
ArrayRef<GenericValue> args = ArrayRef<GenericValue>(params, 2);
GenericValue result = executionEngine->runFunction(add, args);
cout << param1.FloatVal << " + " << param2.FloatVal << " = " << result.FloatVal << endl;
}
hosted.c(这是一个 C 应用程序,我用clang 编译成一个.bc 文件)
float add(float a, float b) {
return a + b;
}
Makefile(用于编译本机应用程序和要在其中托管的 LLVM 字节码)
app.o: main.cc
g++ main.cc -lLLVM -o app.o
hosted.bc: hosted.c
clang -c -emit-llvm hosted.c
clean:
rm app.o
rm hosted.bc
.PHONY: clean
输出(编译运行)
[dario@localhost llvm-cpp-first]$ make hosted.bc && make && ./app.o
clang -c -emit-llvm hosted.c
g++ main.cc -lLLVM -o app.o
5.5 + 2.7 = 8.2