Created
March 10, 2016 00:13
-
-
Save ChadSki/509f4892cb9ed1813aa2 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
/* | |
* Simple Test program for libtcc | |
* | |
* libtcc can be useful to use tcc as a "backend" for a code generator. | |
*/ | |
#include <stdlib.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include "libtcc.h" | |
/* this function is called by the generated code */ | |
int add(int a, int b) | |
{ | |
return a + b; | |
} | |
char my_program[] = | |
"int fib(int n)\n" | |
"{\n" | |
" if (n <= 2)\n" | |
" return 1;\n" | |
" else\n" | |
" return fib(n-1) + fib(n-2);\n" | |
"}\n" | |
"\n" | |
"int foo(int n)\n" | |
"{\n" | |
" printf(\"Hello World!\\n\");\n" | |
" printf(\"fib(%d) = %d\\n\", n, fib(n));\n" | |
" printf(\"add(%d, %d) = %d\\n\", n, 2 * n, add(n, 2 * n));\n" | |
" return 0;\n" | |
"}\n"; | |
int main(int argc, char **argv) | |
{ | |
TCCState *s; | |
int (*func)(int); | |
s = tcc_new(); | |
if (!s) { | |
fprintf(stderr, "Could not create tcc state\n"); | |
exit(1); | |
} | |
/* if tcclib.h and libtcc1.a are not installed, where can we find them */ | |
if (argc == 2 && !memcmp(argv[1], "lib_path=",9)) | |
tcc_set_lib_path(s, argv[1]+9); | |
/* MUST BE CALLED before any compilation */ | |
tcc_set_output_type(s, TCC_OUTPUT_MEMORY); | |
if (tcc_compile_string(s, my_program) == -1) | |
return 1; | |
/* as a test, we add a symbol that the compiled program can use. | |
You may also open a dll with tcc_add_dll() and use symbols from that */ | |
tcc_add_symbol(s, "add", add); | |
/* relocate the code */ | |
if (tcc_relocate(s, TCC_RELOCATE_AUTO) < 0) | |
return 1; | |
/* get entry symbol */ | |
func = tcc_get_symbol(s, "foo"); | |
if (!func) | |
return 1; | |
/* run the code */ | |
func(32); | |
/* delete the state */ | |
tcc_delete(s); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment