added libtcc

This commit is contained in:
bellard 2002-05-13 22:58:22 +00:00
parent 7feafd2bba
commit 1e14c90c7a
3 changed files with 138 additions and 2 deletions

View File

@ -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
View 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
View 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;
}