History

update

bellard committed 25 years ago

Commit eb0e3e71 parent 605a0286 files · +210 −80Browse files

Unified · Split

6 files
  1. Makefile +71 −40
  2. README +111 −31
  3. TODO +14 −6
  4. stdarg.h +6 −2
  5. stddef.h +1 −1
  6. tcclib.h +7 −0
Makefile+71−40
@@ -1,61 +1,92 @@
1all: test cvt1#
2# Tiny C Compiler Makefile
3#
4prefix=/usr/local
2 5
3test: prog.bin 6CFLAGS=-O2 -g -Wall -Wno-parentheses -I.
4 cmp -l prog.bin prog.bin.ref7LIBS=-ldl
8#CFLAGS=-O2 -g -Wall -Wno-parentheses -I. -pg -static -DPROFILE
9#LIBS=
5 10
6run: tcc prog.c11CFLAGS+=-m386 -malign-functions=0
7 ./tcc prog.c12DISAS=objdump -D -b binary -m i386
13INSTALL=install
14VERSION=0.9
8 15
9run2: tcc tcc1.c prog.c16all: tcc
10 ./tcc tcc1.c prog.c
11 17
12run3: tcc tcc1.c prog.c18# auto test
13 ./tcc tcc1.c tcc1.c prog.c
14 19
15prog.bin: prog.c tcc20test: test.ref test.out
16 ./tc prog.c $@21 @if diff -u test.ref test.out ; then echo "Auto Test OK"; fi
17 ndisasm -b 32 $@
18 22
19p2.bin: p2.c tcc23prog.ref: prog.c
20 ./tcc $< $@24 gcc $(CFLAGS) -o $@ $<
21 ndisasm -b 32 $@
22 25
23# Tiny C Compiler26test.ref: prog.ref
27 ./prog.ref > $@
28
29test.out: tcc prog.c
30 ./tcc -I. prog.c > $@
31
32run: tcc prog.c
33 ./tcc -I. prog.c
34
35run2: tcc tcc.c prog.c
36 ./tcc -I. tcc.c -I. prog.c
24 37
25tcc: tcc.c38run3: tcc tcc.c prog.c
26 gcc -O2 -Wall -g -o $@ $< -ldl39 ./tcc -I. tcc.c -I. tcc.c -I. prog.c
27 40
28tcc1: tcc1.c41# speed test
29 gcc -O2 -Wall -g -o $@ $<42speed: tcc ex2 ex3
43 time ./ex2 1238 2 3 4 10 13 4
44 time ./tcc -I. ./ex2.c 1238 2 3 4 10 13 4
45 time ./ex3 35
46 time ./tcc -I. ./ex3.c 35
30 47
31tcc1.i: tcc.c Makefile48ex2: ex2.c
32 gcc -E -P -o $@ $<49 gcc $(CFLAGS) -o $@ $<
33 50
34tcc1.c: tcc1.i cvt Makefile51ex3: ex3.c
35 ./cvt -d $< $@52 gcc $(CFLAGS) -o $@ $<
36 @ls -l $@
37 53
38# obfuscated C compiler54# Tiny C Compiler
39otcc: otcc.c55
40 gcc -O2 -Wall -g -o $@ $< -ldl56tcc_g: tcc.c Makefile
57 gcc $(CFLAGS) -o $@ $< $(LIBS)
58
59tcc: tcc_g
60 strip -s -R .comment -R .note -o $@ $<
41 61
42otcc.i: otcc.c Makefile62install: tcc
43 gcc -E -P -DTINY -o $@ $<63 $(INSTALL) -m755 tcc $(prefix)/bin
64 mkdir -p $(prefix)/lib/tcc
65 $(INSTALL) -m644 stdarg.h stddef.h tcclib.h $(prefix)/lib/tcc
44 66
45otcc1.c: otcc.i cvt Makefile67clean:
46 ./cvt $< $@68 rm -f *~ *.o tcc tcc1 tcct tcc_g prog.ref *.bin *.i ex2 \
47 @ls -l $@69 core gmon.out test.out test.ref a.out
48 70
49orun: otcc otcc1.c71# target for development
50 ./otcc otcc1.c ex1.c
51 72
52# misc73%.bin: %.c tcct
74 ./tcct -I. $< $@
75 $(DISAS) $@
53 76
54cvt: cvt.c77tcct: tcc.c
55 gcc -O2 -Wall -g -o $@ $<78 gcc -DTEST $(CFLAGS) -o $@ $< -ldl
56 79
57instr.o: instr.S80instr.o: instr.S
58 gcc -O2 -Wall -g -c -o $@ $<81 gcc -O2 -Wall -g -c -o $@ $<
59 82
60clean:83FILE=tcc-$(VERSION)
61 rm -f *~ *.o tcc tcc1 cvt 84
85tar:
86 rm -rf /tmp/$(FILE)
87 cp -r ../tcc /tmp/$(FILE)
88 ( cd /tmp ; tar zcvf ~/$(FILE).tar.gz \
89 $(FILE)/Makefile $(FILE)/README $(FILE)/TODO $(FILE)/COPYING \
90 $(FILE)/tcc.c $(FILE)/stddef.h $(FILE)/stdarg.h $(FILE)/tcclib.h \
91 $(FILE)/ex*.c $(FILE)/prog.c )
92 rm -rf /tmp/$(FILE)
README+111−31
@@ -1,49 +1,129 @@
1Tiny C Compiler - Make the best x86 Linux C compiler in less than 8192 bytes.1Tiny C Compiler - C Scripting Everywhere - The Smallest ANSI C compiler
2-----------------------------------------------------------------------------2-----------------------------------------------------------------------
3 3
4Differences with ANSI C:4Features:
5-----------------------5--------
6 6
7- Preprocessor: only '#define xx yy' is supported. Recursive defined7- SMALL! You can compile and execute C code everywhere, for example on
8 supported. All other directives are not supported.8 rescue disks.
9 9
10- Types: int, char, void, pointers and functions are10- FAST! tcc generates optimized x86 code. No byte code overhead.
11 supported. Function pointers are also supported. struct, union and
12 typedef not supported.
13 11
14- Operations: 'x=' not supported.12- UNLIMITED! Any C dynamic library can be used directly. TCC is
13 heading torwards full ANSI C compliance. TCC can of course compile
14 itself.
15 15
16- Keywords: the following keywords are supported: int void char if16- Compile and execute C source directly. No linking or assembly
17 else while break return for.17 necessary. Full C preprocessor included.
18 18
19- Symbol scope: local variables supported, but they cannot have the19- C script supported : just add '#!/usr/local/bin/tcc' at the first
20 same name as global variables.20 line of your C source, and execute it directly from the command line !
21 21
22Features:22- For adventurers, tcc is conceived to be able to generate code for
23--------23 other targets.
24 24
25- SMALL! You can compile and execute C code everywhere, for example on25Documentation:
26 rescue disks.26-------------
27
281) Installation
29
30***TCC currently only work on Linux x86***.
31
32Type 'make install' to compile and install tcc in /usr/local and
33/usr/local/lib/tcc.
34
352) Introduction
36
37We assume here that you know ANSI C. Look at the example ex1.c to know
38what the programs look like.
39
40The main limitations of tcc are that you cannot use floats.
41
42The include file <tcclib.h> can be used if you want a small basic libc
43include support (especially useful for floppy disks). Of course, you
44can also use standard headers, although they are slower to compile.
45
46You can begin your C script with '#!/usr/local/bin/tcc' on the first
47line and set its execute bits (chmod a+x your_script). Then, you can
48launch the C code as a shell or perl script :-) The command line
49arguments are put in 'argc' and 'argv' of the main functions, as in
50ANSI C.
51
523) Invokation
53
54'-Idir' : specify an additionnal include path. The
55default ones are: /usr/include, /usr/lib/tcc, /usr/local/lib/tcc.
56
57'-Dsym' : define preprocessor symbol 'sym' to 1.
58
59'-lxxx' : dynamically link your program with library
60libxxx.so. Standard library paths are checked, including those
61specificed with LD_LIBRARY_PATH.
62
63Only one source code can be compiled. If you have multiple source
64files, add one which includes all your sources.
65
664) Examples
67
68ex1.c: simplest example (hello world). Can also be launched directly
69as a script: ./ex2.c.
70
71ex2.c: more complicated example: find a number with the four
72operations given a list of numbers (benchmark).
73
74ex3.c: compute fibonacci numbers (benchmark).
75
76ex4.c: more complicated: X11 program. Very complicated test in fact
77because standard headers are being used ! Currently slow because
78parsing does not use hash tables.
79
80ex5.c: 'hello world' with standard glibc headers.
81
82tcc.c: TCC can compile itself. Used to check the code generator.
83
84prog.c: auto test for TCC which tests many subtle possible bugs. Used
85when doing 'make test'.
86
87Exact differences with ANSI C:
88-----------------------------
89
901) Preprocessor
91
92 - the preprocessor tokens are the same as C. It means that in some
93 rare cases, preprocessed numbers are not handled exactly as in ANSI
94 C. This approach has the advantage of being simpler and FAST!
95
96 - __LINE__, __FILE__, __DATE__, __TIME__ are currently not handled.
97
98 - #line not handled
99
1002) C language
101
102- Parsing: variables cannot be initialized ('int a = 1' or 'int tab[2] =
103 {1, 2}' not supported).
104
105- Cannot pass struct/union as value. Cannot assign struct/union (use
106 memcpy instead).
27 107
28- FAST! tcc generate x86 code. No byte code overhead.108- Types: floating point numbers are not supported.
29 109
30- Compile and execute C source directly. No linking necessary.110- (BUG) 'char' and 'short' casts do not truncate correctly.
31 111
32- C script supported : just add '#!/usr/bin/tcc' at the first line of112- 'sizeof' may not work if too complex expression is given.
33 your C source, and execute it directly from the command line !
34 113
35- All C library functions can be used via dynamic linking.114Supported C extensions:
115----------------------
36 116
37-------------------------------------------------------------------------117- 'inline' keyword is ignored.
38An even smaller compiler can be build from tcc by activating the
39define 'TINY'. The following changes from tcc:
40 118
41- Comments are not supported.
42 119
43- Parsing: No char constants. No '\r' and '\t' in strings. Only base120License:
44 10 numbers are supported.121-------
45 122
46- no 'for' loops.123TCC is distributed under the GNU Generic Public License (see COPYING
124file).
47 125
48- Operations: '?:', ',', 'x=', shifts, '&&', '||', '!', '~' not supported.126I accept only patches where you give your copyright explictely to me
127to simplify licensing issues.
49 128
129Fabrice Bellard - Nov 11, 2001.
TODO+14−6
@@ -1,7 +1,15 @@
1TODO list:
1 2
2- static arrays3Critical:
3- external symbols (vars)4
4- continue/do while/switch/case/goto5- add hash tables for symbols (useful for long programs)
5- 'x'=6- 0 is pointer - fix type compare
6- constant propagation for '+', '-' and [].7- add message if external function or variable not found.
7- verify function types8
9Not critical:
10
11- fix preprocessor symbol redefinition
12- better constant opt (&&, ||, ?:)
13- function pointers to forward reference (patch code generator)
14- add PowerPC code generator.
15- add portable byte code generator and interpreter.
stdarg.h+6−2
@@ -4,8 +4,12 @@ · 3 unmodified lines
4typedef char *va_list;4typedef char *va_list;
5 5
6/* only correct for i386 */6/* only correct for i386 */
7#define va_start(ap,last) ap=(char *)&(last); 7/* XXX: incorrect for type size different than 4 bytes*/
8#define va_arg(ap,type) (ap-=sizeof (type), *(type *)(ap))8#define va_start(ap,last) ap = ((char *)&(last)) + sizeof(int);
9#define va_arg(ap,type) (ap += sizeof(int), *(type *)(ap - sizeof(int)))
9#define va_end(ap)10#define va_end(ap)
10 11
12/* fix a buggy dependency on GCC in libio.h */
13typedef va_list __gnuc_va_list;
14
11#endif15#endif
stddef.h+1−1
@@ -3,7 +3,7 @@ · 2 unmodified lines
3 3
4/* TCC include file */4/* TCC include file */
5#define NULL ((void *)0)5#define NULL ((void *)0)
6
7typedef unsigned int size_t;6typedef unsigned int size_t;
7typedef int wchar_t;
8 8
9#endif9#endif
tcclib.h+7−0
@@ -19,6 +19,9 @@ unsigned long int strtoul(const char *nptr, char **endptr, int base); · 18 unmodified lines
19/* stdio.h */19/* stdio.h */
20typedef struct __FILE FILE;20typedef struct __FILE FILE;
21#define EOF (-1)21#define EOF (-1)
22extern FILE *stdin;
23extern FILE *stdout;
24extern FILE *stderr;
22FILE *fopen(const char *path, const char *mode);25FILE *fopen(const char *path, const char *mode);
23FILE *fdopen(int fildes, const char *mode);26FILE *fdopen(int fildes, const char *mode);
24FILE *freopen(const char *path, const char *mode, FILE *stream);27FILE *freopen(const char *path, const char *mode, FILE *stream);
@@ -58,6 +61,10 @@ void *memset(void *s, int c, size_t n); · 33 unmodified lines
58char *strdup(const char *s);61char *strdup(const char *s);
59 62
60/* dlfcn.h */63/* dlfcn.h */
64#define RTLD_LAZY 0x001
65#define RTLD_NOW 0x002
66#define RTLD_GLOBAL 0x100
67
61void *dlopen(const char *filename, int flag);68void *dlopen(const char *filename, int flag);
62const char *dlerror(void);69const char *dlerror(void);
63void *dlsym(void *handle, char *symbol);70void *dlsym(void *handle, char *symbol);