|
|
|
/** This code is public domain, and taken from
|
|
|
|
* https://github.com/paulsmith/getting-started-llvm-c-api/blob/master/sum.c
|
|
|
|
*/
|
|
|
|
/**
|
|
|
|
* LLVM equivalent of:
|
|
|
|
*
|
|
|
|
* int sum(int a, int b) {
|
|
|
|
* return a + b;
|
|
|
|
* }
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <llvm-c/Core.h>
|
|
|
|
#include <llvm-c/ExecutionEngine.h>
|
|
|
|
#include <llvm-c/Target.h>
|
|
|
|
#include <llvm-c/Analysis.h>
|
|
|
|
#include <llvm-c/BitWriter.h>
|
|
|
|
|
|
|
|
#include <inttypes.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
int main(int argc, char const *argv[]) {
|
|
|
|
LLVMModuleRef mod = LLVMModuleCreateWithName("my_module");
|
|
|
|
|
|
|
|
LLVMTypeRef param_types[] = { LLVMInt32Type(), LLVMInt32Type() };
|
|
|
|
LLVMTypeRef ret_type = LLVMFunctionType(LLVMInt32Type(), param_types, 2, 0);
|
|
|
|
LLVMValueRef sum = LLVMAddFunction(mod, "sum", ret_type);
|
|
|
|
|
|
|
|
LLVMBasicBlockRef entry = LLVMAppendBasicBlock(sum, "entry");
|
|
|
|
|
|
|
|
LLVMBuilderRef builder = LLVMCreateBuilder();
|
|
|
|
LLVMPositionBuilderAtEnd(builder, entry);
|
|
|
|
LLVMValueRef tmp = LLVMBuildAdd(builder, LLVMGetParam(sum, 0), LLVMGetParam(sum, 1), "tmp");
|
|
|
|
LLVMBuildRet(builder, tmp);
|
|
|
|
|
|
|
|
char *error = NULL;
|
|
|
|
LLVMVerifyModule(mod, LLVMAbortProcessAction, &error);
|
|
|
|
LLVMDisposeMessage(error);
|
|
|
|
|
|
|
|
LLVMExecutionEngineRef engine;
|
|
|
|
error = NULL;
|
|
|
|
LLVMLinkInMCJIT();
|
|
|
|
LLVMInitializeNativeAsmPrinter();
|
|
|
|
LLVMInitializeNativeTarget();
|
|
|
|
if (LLVMCreateExecutionEngineForModule(&engine, mod, &error) != 0) {
|
|
|
|
fprintf(stderr, "failed to create execution engine\n");
|
|
|
|
abort();
|
|
|
|
}
|
|
|
|
if (error) {
|
|
|
|
fprintf(stderr, "error: %s\n", error);
|
|
|
|
LLVMDisposeMessage(error);
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (argc < 3) {
|
|
|
|
fprintf(stderr, "usage: %s x y\n", argv[0]);
|
|
|
|
exit(EXIT_FAILURE);
|
|
|
|
}
|
|
|
|
long long x = strtoll(argv[1], NULL, 10);
|
|
|
|
long long y = strtoll(argv[2], NULL, 10);
|
|
|
|
|
|
|
|
LLVMGenericValueRef args[] = {
|
|
|
|
LLVMCreateGenericValueOfInt(LLVMInt32Type(), x, 0),
|
|
|
|
LLVMCreateGenericValueOfInt(LLVMInt32Type(), y, 0)
|
|
|
|
};
|
|
|
|
LLVMGenericValueRef res = LLVMRunFunction(engine, sum, 2, args);
|
|
|
|
printf("%d\n", (int)LLVMGenericValueToInt(res, 0));
|
|
|
|
|
|
|
|
// Write out bitcode to file
|
|
|
|
if (LLVMWriteBitcodeToFile(mod, "sum.bc") != 0) {
|
|
|
|
fprintf(stderr, "error writing bitcode to file, skipping\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
LLVMDisposeBuilder(builder);
|
|
|
|
LLVMDisposeExecutionEngine(engine);
|
|
|
|
}
|