| /** 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); |
| } |