aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* x86-64: Now TCC can create healthy shared objects from object files ↵Shinichiro Hamaji2009-04-181-2/+8
| | | | | | | generated by GCC - Handle R_X86_64_GOTPCREL. - Output R_X86_64_RELATIVE reloc generated from R_X86_64_64.
* x86-64 bug fix: Fix stab generation for x86-64.Shinichiro Hamaji2009-04-181-3/+3
| | | | The size of a stab entry is 12 bytes even in 64bit environments. We must use int instead of long to keep the size of stab entries.
* x86-64 bug fix: Use stack with alignment just like 32bit environments.Shinichiro Hamaji2009-04-181-5/+4
|
* x86-64: Save RDX and RCX before we use them as function parameters.Shinichiro Hamaji2009-04-181-2/+2
| | | | When the function call is indirect, these registers may be broken to load a function pointer.
* Remove multiple definition error caused by combination of x86-64 and va_list.Shinichiro Hamaji2009-04-183-7/+25
| | | | | We need malloc and free to implement va_start and va_end. Since malloc and free may be replaced by #define, we add __builtin_malloc and __builtin_free.
* Add check for invalid numbers.Shinichiro Hamaji2009-04-181-0/+2
| | | | | | | | If there are some characters after TCC parses a number, it is an error. This bug was reported on list: http://www.mail-archive.com/tinycc-devel@nongnu.org/msg02014.html
* Fix overrun in decl_initializer_alloc.Shinichiro Hamaji2009-04-181-2/+4
| | | | | | | | This bug was reported on http://lists.gnu.org/archive/html/tinycc-devel/2009-03/msg00035.html This happens because parser of array initializer doesn't stop to read until semi-colon or comma.
* Better DLL support on x86-64.Shinichiro Hamaji2009-04-181-8/+39
| | | | | | | | | | | | - Add a macro TCC_OUTPUT_DLL_WITH_PLT. -- Now, the DLL with PLT support works only on x86-64, but we may be able to support it on all architectures eventually. - Define TCC_OUTPUT_DLL_WITH_PLT when target architecture is x86-64. - Current status (x86-64): -- Main program should be able to call functions in shared objects. -- Main program should be able to use global variables in shared objects. -- Shared objects should be able to call functions in main program. -- Shared objects can NOT use global variables in main program. - To fix the last issue, we may need to add support of -fPIC option in our code generator.
* First naive DLL support on x86-64.Shinichiro Hamaji2009-04-181-3/+33
| | | | This logic depends on x86_64-gen.c and doesn't work with objects compiled by GCC.
* Generate PIC for addresses of symbols.Shinichiro Hamaji2009-04-181-11/+8
|
* Suppress noisy pointer signed-ness warnings on x86-64.Shinichiro Hamaji2009-04-181-0/+4
|
* Code cleaning: utilize vpushll().Shinichiro Hamaji2009-04-181-7/+1
|
* Support long long bitfields for all architectures.Shinichiro Hamaji2009-04-182-10/+46
| | | | | | - Modified gv() and vstore(), added vpushll(). - Added a test case for long long bitfields. - Tested on x86 and x86-64.
* A uint64 bug fix on x86-64Shinichiro Hamaji2009-04-182-1/+3
| | | | | 64bit unsigned literal was handled as 32bit integer. Added a unittest to catch this.
* Allow long long as a type of bitfields on x86-64.Shinichiro Hamaji2009-04-181-1/+5
|
* win32: allow user segments as writable & executablegrischka2009-04-181-1/+3
|
* i386: align=8 for double and long longgrischka2009-04-181-1/+1
|
* win32: fix for VC8Express compilergrischka2009-04-181-2/+7
|
* tcc -E: preserve spaces (partial solution)Kirill Smelkov2009-04-181-2/+8
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Recently I needed to trim storage space on an embedded distro which has X. X depend on cpp which is ~8MB in size as shipped in Debian, so the idea was to remove cpp and use `tcc -E` instead where appropriate. I've done this with the following 'hack' put inplace of /usr/bin/cpp : #!/bin/sh -e TCC=/home/kirr/local/tcc/bin/tcc last="${!#}" # hack to distinguish between '... -D...' and '... file' if test -r "$last"; then exec $TCC -E "$@" else exec $TCC -E "$@" - fi But the problem turned out to be in `tcc -E` inability to preserve spaces between tokens. So e.g. the following ~/.Xresources XTerm*VT100*foreground: black ... got translated to XTerm * VT100 * foreground : black which is bad, bacause now X don't understand it. Below is a newbie "fix" for the problem. It still does not preserve spaces on macro expansion, but since the fix cures original problem, I think it is at least one step forward. Signed-off-by: Kirill Smelkov <kirr@landau.phys.spbu.ru>
* string_test: we should always use 'unsigned int' for bKirill Smelkov2009-04-181-4/+0
| | | | | | | | | | | | | | | | | | | | As recently shown in fb0ac2 (s/int/unsigned/ since GCC 4.3.2 produces code which doesn't stop) comparing (signed) int variable to 0x80000000 is not idea for x86_64. This is not a good idea for x86_32 either, because GCC 4.3.2 (the one in Debian Lenny) rightly assumes that a signed int could be never 0x80000000, and thus removes the check from while (b != 0x80000000) { ... completely. If we want this check, we need b to be always 'unsigned' Signed-off-by: Kirill Smelkov <kirr@landau.phys.spbu.ru>
* type_size function returned incorrect sizeAlexander Egorenkov2009-04-181-1/+8
| | | | of multi dimensional arrays if dimension is divisable by 2
* fix constant optimization for unsignedsgrischka2009-04-181-2/+14
|
* fix data overflow with init_putvgrischka2008-12-021-0/+4
| | | | | The simplest code to reproduce this bug seems to be int a[][] = {{1,1,1,1,1,1,1}};
* Add several test cases.Shinichiro Hamaji2008-12-021-0/+141
|
* Add support of x86-64.Shinichiro Hamaji2008-12-027-15/+1724
| | | | | | | | | | | | | | | | | | | | | | Most change was done in #ifdef TCC_TARGET_X86_64. So, nothing should be broken by this change. Summary of current status of x86-64 support: - produces x86-64 object files and executables. - the x86-64 code generator is based on x86's. -- for long long integers, we use 64bit registers instead of tcc's generic implementation. -- for float or double, we use SSE. SSE registers are not utilized well (we only use xmm0 and xmm1). -- for long double, we use x87 FPU. - passes make test. - passes ./libtcc_test. - can compile tcc.c. The compiled tcc can compile tcc.c, too. (there should be some bugs since the binary size of tcc2 and tcc3 is differ where tcc tcc.c -o tcc2 and tcc2 tcc.c -o tcc3) - can compile links browser. It seems working. - not tested well. I tested this work only on my linux box with few programs. - calling convention of long-double-integer or struct is not exactly the same as GCC's x86-64 ABI. - implementation of tcc -run is naive (tcc -run tcctest.c works, but tcc -run tcc.c doesn't work). Relocating 64bit addresses seems to be not as simple as 32bit environments. - shared object support isn't unimplemented - no bounds checker support - some builtin functions such as __divdi3 aren't supported
* s/int/unsigned/ since GCC 4.3.2 produces code which doesn't stop.Shinichiro Hamaji2008-12-021-0/+4
|
* Suport LDOUBLE_SIZE == 16 environment.Shinichiro Hamaji2008-12-021-3/+15
|
* silly bug fix: s/#ifdef PTR_SIZE == 4/#if PTR_SIZE == 4/Shinichiro Hamaji2008-12-021-1/+1
|
* Make tccelf.c 64bit ready.Shinichiro Hamaji2008-12-021-9/+20
| | | | | | | - Use REL_SECTION_FMT instead of ".rel%s". - Use PTR_SIZE instead of sizeof(int) for GOT entries. - Use sizeof(ElfW(Dyn)) instead of magic number 8. - Use TCC_ELFCLASS instead of ELFCLASS32.
* One more s/int/long/Shinichiro Hamaji2008-12-021-1/+1
|
* Use int*2 instead of long*2 to hold double value.Shinichiro Hamaji2008-12-021-4/+4
| | | | I believe sizeof(double) is sizeof(int)*2 in most environments. On the other hand, sizeof(long) is equal to sizeof(double) in x86-64.
* Use long instead of int to hold pointer values.Shinichiro Hamaji2008-12-021-4/+4
|
* Add __builtin_frame_address(0)Shinichiro Hamaji2008-12-022-0/+19
| | | | | Adding the GCC extension __builtin_frame_address(). We support only zero as the argument for now. With this functionality, we can implement GCC compatible stdarg by macros in x86-64.
* Imported several macros required by x86-64Shinichiro Hamaji2008-12-021-3/+74
|
* Introduce ElfW macro and ELFW to encapsulate the difference between Elf32_* ↵Shinichiro Hamaji2008-12-023-177/+198
| | | | and Elf64_*. Also, introduce ElfW_Rel and SHT_RELX for difference between REL and RELA.
* Futher changes to castsDaniel Glöckner2008-11-301-3/+6
| | | | | | | | | nocode_wanted can't be used to enforce constant expressions, as it is set f.ex. by __builtin_constant_p. A null pointer is unequal to a pointer to any object or function. Assuming symbols always point to memory, a symbol+constant cast to bool is always true.
* Fix get_tok_str wrt wide charactersDaniel Glöckner2008-11-301-2/+4
| | | | Fixes both, character constants and string literals.
* Rewrote '?' for constantsDaniel Glöckner2008-11-301-7/+10
| | | | | The condition is now cast to _Bool and it now works with return types bigger than 32 bit.
* Cast parameter of '!' to _BoolDaniel Glöckner2008-11-301-2/+5
|
* Rewrote castsDaniel Glöckner2008-11-301-115/+101
| | | | | | | | | Casting of constants was done only inside functions. I restructured the code and used intermediate types (long double/long long) for most conversions to have less ifs. Please review. There are lots of cases to take care of and lots of mistakes to make.
* line-numbers output for TCC -Egrischka2008-11-301-12/+25
|
* win32/build-tcc.bat: define CONFIG_SYSROOTgrischka2008-11-301-0/+1
|
* was hash, not linkgrischka2008-09-151-1/+1
|
* update changeloggrischka2008-09-151-2/+9
|
* Display error on statement expressions with complex return typeDaniel Glöckner2008-09-121-0/+14
| | | | | | | | | | | The return type of a statement expression (a GCC extention) may involve elements on the symbol stack that have been put there by the expression. These will be freed at the end of the expression so that the calling block can not use them. Contrary to the comment (written in 2003), this bug no longer shows up in Valgrind, as freed symbols are now put onto a stack for later reuse.
* Fix bitfields with non-int types and in unionsDaniel Glöckner2008-09-121-8/+28
| | | | | | | | | | | | | | | | | The ISO C draft allow only signed/unsigned int and _Bool as base type for bitfields. TinyCC ever since allowed a wider range of types, but there were many bugs that shifted values when they shouldn't, etc.. The patch introduces a restriction to the layout of bitfields with mixed types that makes it incompatible with GCC. In struct { typeA x:1; typeB y:1; }; y is combined with x in the same byte iff typeA is typeB (neglecting signedness). This is done to avoid alignment issues and exceeding the width of typeA.
* Force null pointer exception for code outside of a functionDaniel Glöckner2008-09-121-0/+3
| | | | | | | | | | TinyCC sometimes has problems to evaluate constant expressions at compile time. This leads to code being generated outside of functions. Without this patch some of these bugs are not caught, because cur_text_section still points to the section of the last function. Before the first function cur_text_section is uninitialized. Setting cur_text_section to a null pointer should make TinyCC die in all cases.
* Optimize arithmetic with pointer to value on stack + constantDaniel Glöckner2008-09-121-2/+3
|
* Fix gv for long longsDaniel Glöckner2008-09-121-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | long long a(); long long b() { return a(); } At the end of b there will be some useless register shuffling. This is because return wants to have the result of a in REG_IRET. gv checks if this is the case for BOTH registers of the long long. After this test it uses REG_LRET for the second register if the first is supposed to be REG_IRET. In other cases it uses RC_INT. The patch compares the second register against the class it will have in the end instead of the register class the first register will have. At this point I would like to remind those who pick up the patches that there are two other mails by me with uncommitted fixes: http://lists.gnu.org/archive/html/tinycc-devel/2003-10/msg00044.html http://lists.gnu.org/archive/html/tinycc-devel/2008-08/msg00007.html Daniel
* Allow to use libgcc instead of libtcc1Daniel Glöckner2008-09-123-4/+28
| | | | | | | | | | | | | | | This patch adds a switch --with-libgcc to configure. When passed it prevents libtcc1.a from being built and links to /lib/libgcc_s.so.1 instead of PREFIX/lib/tcc/libtcc1.a. It will work on ARM when using libgcc from GCC >= 4.2.0. Prior versions don't have the __floatun[sd]i[sdx]f functions. It won't work on i386 because of two missing symbols emitted when floats are cast to integers, but users can provide those symbols (global short constants) in their code if needed. Daniel