The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.3 KiB
76 lines
2.3 KiB
/** 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); |
|
}
|
|
|