mirror of
https://github.com/frida/tinycc
synced 2024-12-25 14:36:49 +03:00
added libtcc
This commit is contained in:
parent
7feafd2bba
commit
1e14c90c7a
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…
Reference in New Issue
Block a user