Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
145 | halyavin | 1 | /* |
2 | * Simple Test program for libtcc |
||
3 | * |
||
4 | * libtcc can be useful to use tcc as a "backend" for a code generator. |
||
5 | */ |
||
6 | #include |
||
7 | #include |
||
8 | |||
9 | #include "libtcc.h" |
||
10 | |||
11 | /* this function is called by the generated code */ |
||
12 | int add(int a, int b) |
||
13 | { |
||
14 | return a + b; |
||
15 | } |
||
16 | |||
17 | char my_program[] = |
||
18 | "int fib(int n)\n" |
||
19 | "{\n" |
||
20 | " if (n <= 2)\n" |
||
21 | " return 1;\n" |
||
22 | " else\n" |
||
23 | " return fib(n-1) + fib(n-2);\n" |
||
24 | "}\n" |
||
25 | "\n" |
||
26 | "int foo(int n)\n" |
||
27 | "{\n" |
||
28 | " printf(\"Hello World!\\n\");\n" |
||
29 | " printf(\"fib(%d) = %d\\n\", n, fib(n));\n" |
||
30 | " printf(\"add(%d, %d) = %d\\n\", n, 2 * n, add(n, 2 * n));\n" |
||
31 | " return 0;\n" |
||
32 | "}\n"; |
||
33 | |||
34 | int main(int argc, char **argv) |
||
35 | { |
||
36 | TCCState *s; |
||
37 | int (*func)(int); |
||
38 | unsigned long val; |
||
39 | |||
40 | s = tcc_new(); |
||
41 | if (!s) { |
||
42 | fprintf(stderr, "Could not create tcc state\n"); |
||
43 | exit(1); |
||
44 | } |
||
45 | |||
46 | /* MUST BE CALLED before any compilation or file loading */ |
||
47 | tcc_set_output_type(s, TCC_OUTPUT_MEMORY); |
||
48 | |||
49 | tcc_compile_string(s, my_program); |
||
50 | |||
51 | /* as a test, we add a symbol that the compiled program can be |
||
52 | linked with. You can have a similar result by opening a dll |
||
53 | with tcc_add_dll(() and using its symbols directly. */ |
||
54 | tcc_add_symbol(s, "add", (unsigned long)&add); |
||
55 | |||
56 | tcc_relocate(s); |
||
57 | |||
58 | tcc_get_symbol(s, &val, "foo"); |
||
59 | func = (void *)val; |
||
60 | |||
61 | func(32); |
||
62 | |||
63 | tcc_delete(s); |
||
64 | return 0; |
||
65 | }=> |