aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbellard <bellard>2002-05-13 22:58:22 +0000
committerbellard <bellard>2002-05-13 22:58:22 +0000
commit1e14c90c7ab78e9669733c82c1cee280efab1a3b (patch)
tree79f426d9b6cfec74ff995efd8e38e74573f85be9
parent7feafd2bbab0375108fd47d6af9b6707aae50fa2 (diff)
downloadtinycc-1e14c90c7ab78e9669733c82c1cee280efab1a3b.tar.gz
tinycc-1e14c90c7ab78e9669733c82c1cee280efab1a3b.tar.bz2
added libtcc
-rw-r--r--Makefile18
-rw-r--r--libtcc.h60
-rw-r--r--libtcc_test.c62
3 files changed, 138 insertions, 2 deletions
diff --git a/Makefile b/Makefile
index 3b49aae..d5456a3 100644
--- a/Makefile
+++ b/Makefile
@@ -11,7 +11,7 @@ LIBS_P=
CFLAGS+=-m386 -malign-functions=0
DISAS=objdump -d
INSTALL=install
-VERSION=0.9.6
+VERSION=0.9.7
all: tcc
@@ -114,6 +114,20 @@ tcc.exe: tcc_g.exe
tcc_p: tcc.c Makefile
gcc $(CFLAGS_P) -o $@ $< $(LIBS_P)
+# libtcc generation and example
+libinstall: libtcc.a
+ $(INSTALL) -m644 libtcc.a $(prefix)/lib
+ $(INSTALL) -m644 libtcc.h $(prefix)/include
+
+libtcc.o: tcc.c i386-gen.c bcheck.c Makefile
+ gcc $(CFLAGS) -DLIBTCC -c -o $@ $<
+
+libtcc.a: libtcc.o
+ ar rcs $@ $^
+
+libtcc_test: libtcc_test.c libtcc.a
+ gcc $(CFLAGS) -I. -o $@ $< -L. -ltcc -ldl
+
# targets for development
%.bin: %.c tcc
@@ -139,6 +153,6 @@ tar:
$(FILE)/il-opcodes.h $(FILE)/il-gen.c \
$(FILE)/elf.h $(FILE)/stab.h $(FILE)/stab.def \
$(FILE)/stddef.h $(FILE)/stdarg.h $(FILE)/stdbool.h $(FILE)/float.h \
- $(FILE)/tcclib.h \
+ $(FILE)/tcclib.h $(FILE)/libtcc.h $(FILE)/libtcc_test.c \
$(FILE)/ex*.c $(FILE)/tcctest.c $(FILE)/boundtest.c )
rm -rf /tmp/$(FILE)
diff --git a/libtcc.h b/libtcc.h
new file mode 100644
index 0000000..11378ed
--- /dev/null
+++ b/libtcc.h
@@ -0,0 +1,60 @@
+#ifndef LIBTCC_H
+#define LIBTCC_H
+
+struct TCCState;
+
+typedef struct TCCState TCCState;
+
+/* create a new TCC compilation context */
+TCCState *tcc_new(void);
+
+/* free a TCC compilation context */
+void tcc_delete(TCCState *s);
+
+/* add debug information in the generated code */
+void tcc_enable_debug(TCCState *s);
+
+/*****************************/
+/* preprocessor */
+
+/* add include path */
+int tcc_add_include_path(TCCState *s, const char *pathname);
+
+/* define preprocessor symbol 'sym'. Can put optional value */
+void tcc_define_symbol(TCCState *s, const char *sym, const char *value);
+
+/* undefine preprocess symbol 'sym' */
+void tcc_undefine_symbol(TCCState *s, const char *sym);
+
+/*****************************/
+/* compiling */
+
+/* compile a file. Return non zero if error. */
+int tcc_compile_file(TCCState *s, const char *filename);
+
+/* compile a string. Return non zero if error. */
+int tcc_compile_string(TCCState *s, const char *buf);
+
+/* get last error */
+int tcc_get_error(TCCState *s, char *buf, int buf_size);
+
+/*****************************/
+/* linking commands */
+
+/* add a DYNAMIC library so that the compiled program can use its symbols */
+int tcc_add_dll(TCCState *s, const char *library_name);
+
+/* define a global symbol */
+int tcc_add_symbol(TCCState *s, const char *name, void *value);
+
+#define TCC_FILE_EXE 0 /* executable file */
+#define TCC_FILE_DLL 1 /* dynamic library */
+#define TCC_FILE_OBJ 2 /* object file */
+
+/* output an executable file */
+int tcc_output_file(TCCState *s, const char *filename, int file_type);
+
+/* link and run main() function and return its value */
+int tcc_run(TCCState *s, int argc, char **argv);
+
+#endif
diff --git a/libtcc_test.c b/libtcc_test.c
new file mode 100644
index 0000000..db85bd5
--- /dev/null
+++ b/libtcc_test.c
@@ -0,0 +1,62 @@
+/*
+ * 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 <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 main(int argc, char **argv)\n"
+"{\n"
+" int n;\n"
+" n = atoi(argv[1]);\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;
+ char *args[3];
+
+ s = tcc_new();
+ if (!s) {
+ fprintf(stderr, "Could not create tcc state\n");
+ exit(1);
+ }
+
+ tcc_compile_string(s, my_program);
+
+ /* as a test, we add a symbol that the compiled program can be
+ linked with. You can have a similar result by opening a dll
+ with tcc_add_dll(() and using its symbols directly. */
+ tcc_add_symbol(s, "add", (void *)&add);
+
+ args[0] = "";
+ args[1] = "32";
+ args[2] = NULL;
+
+ tcc_run(s, 2, args);
+
+ tcc_delete(s);
+ return 0;
+}