From 1e14c90c7ab78e9669733c82c1cee280efab1a3b Mon Sep 17 00:00:00 2001 From: bellard Date: Mon, 13 May 2002 22:58:22 +0000 Subject: [PATCH] added libtcc --- Makefile | 18 +++++++++++++++-- libtcc.h | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ libtcc_test.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 libtcc.h create mode 100644 libtcc_test.c diff --git a/Makefile b/Makefile index 3b49aae2..d5456a31 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 00000000..11378ed0 --- /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 00000000..db85bd58 --- /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 +#include + +#include + +/* 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; +} -- 2.11.4.GIT