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
 | 
					CFLAGS+=-m386 -malign-functions=0
 | 
				
			||||||
DISAS=objdump -d
 | 
					DISAS=objdump -d
 | 
				
			||||||
INSTALL=install
 | 
					INSTALL=install
 | 
				
			||||||
VERSION=0.9.6
 | 
					VERSION=0.9.7
 | 
				
			||||||
 | 
					
 | 
				
			||||||
all: tcc
 | 
					all: tcc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -114,6 +114,20 @@ tcc.exe: tcc_g.exe
 | 
				
			||||||
tcc_p: tcc.c Makefile
 | 
					tcc_p: tcc.c Makefile
 | 
				
			||||||
	gcc $(CFLAGS_P) -o $@ $< $(LIBS_P)
 | 
						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
 | 
					# targets for development
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%.bin: %.c tcc
 | 
					%.bin: %.c tcc
 | 
				
			||||||
| 
						 | 
					@ -139,6 +153,6 @@ tar:
 | 
				
			||||||
          $(FILE)/il-opcodes.h $(FILE)/il-gen.c \
 | 
					          $(FILE)/il-opcodes.h $(FILE)/il-gen.c \
 | 
				
			||||||
          $(FILE)/elf.h $(FILE)/stab.h $(FILE)/stab.def \
 | 
					          $(FILE)/elf.h $(FILE)/stab.h $(FILE)/stab.def \
 | 
				
			||||||
          $(FILE)/stddef.h $(FILE)/stdarg.h $(FILE)/stdbool.h $(FILE)/float.h \
 | 
					          $(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 )
 | 
					          $(FILE)/ex*.c $(FILE)/tcctest.c $(FILE)/boundtest.c )
 | 
				
			||||||
	rm -rf /tmp/$(FILE)
 | 
						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