aboutsummaryrefslogtreecommitdiff
path: root/tests/libtcc_test.c
diff options
context:
space:
mode:
authorgrischka <grischka>2009-04-18 14:28:45 +0200
committergrischka <grischka>2009-04-18 15:08:03 +0200
commitea5e81bd6a3376232bf4747b2fa2e0a91c19b337 (patch)
treef88b43a25996cd7f4b9c32aac70fdd33e3f4dc2c /tests/libtcc_test.c
parente8a52a824957808410a8eb13d4b5e2f3e1776553 (diff)
downloadtinycc-ea5e81bd6a3376232bf4747b2fa2e0a91c19b337.tar.gz
tinycc-ea5e81bd6a3376232bf4747b2fa2e0a91c19b337.tar.bz2
new subdirs: include, lib, tests
Diffstat (limited to 'tests/libtcc_test.c')
-rw-r--r--tests/libtcc_test.c84
1 files changed, 84 insertions, 0 deletions
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 <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);
+ 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;
+}