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); | |
} |
Author
tenderlove
commented
Mar 15, 2017
Running the program:
$ ./sum 1 2
1543461072
$ ./sum 1 2
1485686992
Those two sums are 2018-11-29 03:11:12
and 2017-01-29 10:49:52
UTC if they're epoch timestamps! Does that help? :)
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