-
-
Save Watson1978/9fdbd4f8115ab7f0f10eda8cdaf77c5c to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
cc `llvm-config --cflags` -c sum.c | |
c++ `llvm-config --cxxflags --ldflags --libs core mcjit native --system-libs` sum.o -o sum |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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: %s\n", error); | |
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); | |
uint64_t raw = LLVMGetFunctionAddress(engine, "sum"); | |
int (*func_sum)(int, int) = (int (*)(int, int)) raw; | |
printf("%d\n", func_sum(x, y)); | |
// Write out bitcode to file | |
if (LLVMWriteBitcodeToFile(mod, "sum.bc") != 0) { | |
fprintf(stderr, "error writing bitcode to file, skipping\n"); | |
} | |
LLVMDisposeBuilder(builder); | |
LLVMDisposeExecutionEngine(engine); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment