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