added libtcc
This commit is contained in:
		
							parent
							
								
									7feafd2bba
								
							
						
					
					
						commit
						1e14c90c7a
					
				
					 3 changed files with 138 additions and 2 deletions
				
			
		
							
								
								
									
										18
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								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) | ||||
|  |  | |||
							
								
								
									
										60
									
								
								libtcc.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								libtcc.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -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 | ||||
							
								
								
									
										62
									
								
								libtcc_test.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								libtcc_test.c
									
										
									
									
									
										Normal file
									
								
							|  | @ -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; | ||||
| } | ||||
		Loading…
	
	Add table
		
		Reference in a new issue