Created
March 15, 2017 20:54
-
-
Save tenderlove/4d2405e22f212299907161ce0f5e941a 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); | |
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); | |
} |
did you try to print your args after they are created into LLVM values ?
LLVMGenericValueRef args[] = {
LLVMCreateGenericValueOfInt(LLVMInt32Type(), x, 0),
LLVMCreateGenericValueOfInt(LLVMInt32Type(), y, 0)
};
check what is in this args.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Those two sums are
2018-11-29 03:11:12
and2017-01-29 10:49:52
UTC if they're epoch timestamps! Does that help? :)