From ea5e81bd6a3376232bf4747b2fa2e0a91c19b337 Mon Sep 17 00:00:00 2001 From: grischka Date: Sat, 18 Apr 2009 14:28:45 +0200 Subject: new subdirs: include, lib, tests --- tests/libtcc_test.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 tests/libtcc_test.c (limited to 'tests/libtcc_test.c') diff --git a/tests/libtcc_test.c b/tests/libtcc_test.c new file mode 100644 index 0000000..a602fb0 --- /dev/null +++ b/tests/libtcc_test.c @@ -0,0 +1,84 @@ +/* + * Simple Test program for libtcc + * + * libtcc can be useful to use tcc as a "backend" for a code generator. + */ +#include +#include +#include + +#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); + void *mem; + int size; + + 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); + + /* get needed size of the code */ + size = tcc_relocate(s, NULL); + if (size == -1) + return 1; + + /* allocate memory and copy the code into it */ + mem = malloc(size); + tcc_relocate(s, mem); + + /* get entry symbol */ + func = tcc_get_symbol(s, "foo"); + if (!func) + return 1; + + /* delete the state */ + tcc_delete(s); + + /* run the code */ + func(32); + + free(mem); + return 0; +} -- cgit v1.3.1