2 weeks agox86-64: Fix calls via absolute function pointersmob
Michael Matz [Sun, 1 Jul 2018 23:54:45 +0000 (2 01:54 +0200)]
x86-64: Fix calls via absolute function pointers

linkers don't treat relocations using symindex 0 (undefined)
very well, it can't be misused as indicator for an absolute number.
Just don't bother with special casing this, rather emit an indirect
call/jump right away. ARM64 needs the same (and didn't handle
calls via constant absolute func pointers before).

The testcase as is doesn't fail without the patch, it actually
needs separate compilation (to -fPIC .o file, then to shared lib)
to fail.

3 weeks agoFix stored type of arguments on x86-64
Michael Matz [Sun, 24 Jun 2018 18:12:51 +0000 (24 20:12 +0200)]
Fix stored type of arguments on x86-64

the lvalue Syms for arguments didn't correctly reflect
their own types in all cases (a side-effect of the type being
stored in type->t and the ->r members (as VT_LVAL_xxx), so the below
used an int load (not a byte load) in the conditional.

extern void bar (void);
void foo (signed char c)
  signed char x = c;
  if (c)

5 weeks agoAdd linker's --export-dynamic flag alias
Andrey Gursky [Mon, 11 Jun 2018 16:15:24 +0000 (11 18:15 +0200)]
Add linker's --export-dynamic flag alias

Since 9336fa7ae50ef60cb0049136a7831e7e8d94a20a --export-dynamic is
supported. Add this conventional flag as alias.

7 weeks agomisc fixes
grischka [Thu, 31 May 2018 21:51:51 +0000 (31 23:51 +0200)]
misc fixes

misc fixes including:
- tcc.c: fix "tcc -vv" for libtcc1.a on win32/PE
- tccelf.c: fix a crash when GOT has no relocs (witn -nostdlib)
- tccelf.c: fix stab linkage for zero n_strx
- tccgen.c: fix stdcall decoration for array parameters
    int __stdcall func(char buf[10]) is _func@4 (was _func@12)
- tccgen.c: fix static variables with nocode/nodata_wanted
    see tests2/96_nodata_wanted.c
- tccrun.c: align sections using sh_addralign (for reliable function_alignment)
- tests2/Makefile sort 100 after 99
- win32/include/sys/stat.h fix _stat and _wstat
- x86_64-gen.c: win64/gfunc_call: fix a bug with xmmN register args
    previously overwrote valid other xmmN registers eventually

7 weeks agotccgen.c: fix warning for incompatible struct- and function pointers
grischka [Thu, 31 May 2018 21:52:07 +0000 (31 23:52 +0200)]
tccgen.c: fix warning for incompatible struct- and function pointers

see tests2/60_errors_and_warnings.c

7 weeks agotcc_add_file(): preserve s->filetype
grischka [Thu, 31 May 2018 21:51:59 +0000 (31 23:51 +0200)]
tcc_add_file(): preserve s->filetype

This is supposed to fix a bug where libtcc eventually was trying to
compile libtcc1.a as C source code.

Anyway, there is now only two functions that refer to s->filetype,
tcc_add_file() and tcc_add_library().

3 months agoImplement function alignment via attributes
Michael Matz [Fri, 6 Apr 2018 21:01:45 +0000 (6 23:01 +0200)]
Implement function alignment via attributes

which requires being able to emit an arbitrary number of NOP
instructions, which is also implemented here.  For x86 we
could emit other sequences but these are the easiest.

3 months agoDon't fail on const/restrict/static/* inside []
Petr Skocik [Fri, 23 Mar 2018 12:19:58 +0000 (23 13:19 +0100)]
Don't fail on const/restrict/static/* inside []

This patch makes tcc ignore them.

Normally (as per the C standard), They should
be only applicable inside parameter arrays
and affect (const/restrict) the pointer the
array gets converted to.

[matz: fix formatting, add volatile handling, add testcase,
add comment about above deficiency]

3 months agopatch type_to_str to handle complex function-ptr decls better
Petr Skocik [Thu, 15 Mar 2018 23:26:16 +0000 (16 00:26 +0100)]
patch type_to_str to handle complex function-ptr decls better

Code like:

    #include <signal.h>
    int main() { _Generic(signal, int: 0); }

should fail with
    error: type 'extern void (*(int, void (*)(int)))(int)' does not match any association
    error: type 'extern void *(int)(int, void *(int))' does not match any association

[matz: fix formatting, fix function-to-pointer decay for operands of
_Generic, add testcase for this]

3 months agoFix shortening casts of long long
Michael Matz [Sat, 31 Mar 2018 19:52:20 +0000 (31 21:52 +0200)]
Fix shortening casts of long long

see added testcase.

4 months agoSelect VFP if triplet is arm-linux-gnueabihf
Thomas Preud'homme [Thu, 15 Mar 2018 23:02:56 +0000 (15 23:02 +0000)]
Select VFP if triplet is arm-linux-gnueabihf

A target triplet of arm-linux-gnueabihf indicates that the compiler
should use the VFP variant of the calling convention which as its name
implies requires VFP. This commit enables VFP when triplet is

4 months agoRemove asm-c-connect-sep in tests clean target
Thomas Preud'homme [Fri, 9 Mar 2018 20:10:06 +0000 (9 20:10 +0000)]
Remove asm-c-connect-sep in tests clean target

4 months agoPrevent dead code on !x86 in prepare_dynamic_rel
Thomas Preud'homme [Sat, 24 Feb 2018 15:50:14 +0000 (24 15:50 +0000)]
Prevent dead code on !x86 in prepare_dynamic_rel

In prepare_dynamic_rel() on non x86 targets the count++ statements
appear before any case label and are therefore dead code. This triggers
build failure when building with -Werror. This patch adds an extra guard
around all the x86 case labels and their associated action, leaving just
the default case label for non x86 targets which builds fine.

Origin: vendor
Forwarded: no
Last-Updated: 2018-02-24

6 months agoAdd make testspp.all/testspp.20
Michael Matz [Fri, 5 Jan 2018 01:13:27 +0000 (5 02:13 +0100)]
Add make testspp.all/testspp.20

like we have already make tests2.XX.

6 months agoCode suppression fixes
Michael Matz [Tue, 14 Nov 2017 14:38:40 +0000 (14 15:38 +0100)]
Code suppression fixes

See adjusted testcase, a lone break; in a do while loop was
incorrectly disabling the exit test.

6 months agoDon't emit applied .rel sections
Michael Matz [Mon, 1 Jan 2018 04:29:46 +0000 (1 05:29 +0100)]
Don't emit applied .rel sections

for a final link we shouldn't emit relocation sections that are applied
already.  For now we need to emit ALLOCed .rel sections as they contain
dynamic relocs, they should be put into their own (new) section instead.

6 months agofix debug info with musl on x86_64
foobar [Thu, 28 Dec 2017 15:05:27 +0000 (28 15:05 +0000)]
fix debug info with musl on x86_64


6 months agoAccept more floating point constant expressions
Michael Matz [Mon, 25 Dec 2017 11:44:29 +0000 (25 12:44 +0100)]
Accept more floating point constant expressions

the rules for constant expressions in static initializers are more
relaxed than for integer constant expressions.  We need to accept
0.0/0.0 in static initializers (in non-static initializers the potential
exceptions need to be raised though, so no translation-time calculation

6 months agoMake type of __nan__ __inf__ and __snan__ be float
Michael Matz [Sun, 24 Dec 2017 12:16:09 +0000 (24 13:16 +0100)]
Make type of __nan__ __inf__ and __snan__ be float

so that those builtins can be used directly for the C99 NAN and
INFINITY math.h macros.

6 months agoFix -pthread in a different way
Michael Matz [Sat, 23 Dec 2017 13:49:07 +0000 (23 14:49 +0100)]
Fix -pthread in a different way

6 months agoRevert "Fix -pthread option handling"
Michael Matz [Sat, 23 Dec 2017 13:46:27 +0000 (23 14:46 +0100)]
Revert "Fix -pthread option handling"

This reverts commit 3f8225509b0b8af534ba0856b2aeb01a3310d826.
It fixes the linking case but introduces an ugly error with -c
about adding a library.  To fix both uses the old code structure is

6 months agoFix -pthread option handling
Michael Matz [Sat, 23 Dec 2017 13:14:57 +0000 (23 14:14 +0100)]
Fix -pthread option handling

adding -pthread confused option parsing as the number of file counting
came out wrong.  Simplify and fit it, can be handled purely within
option parsing, no need for a state flag.

7 months agofinal update for 0.9.27masterrelease_0_9_27
grischka [Tue, 12 Dec 2017 16:57:20 +0000 (12 17:57 +0100)]
final update for 0.9.27

- fix ldouble asm hack
- fix a VLA problem on Win64 (also x86_64-gen.c)
- patch_type(): make sure that no symbol ever changes
  from global to static

- tcc -vv: print libtcc1.a path also on win32

tccpe.c, tcctools.c:
- use unix LF mode to for .def output files (that is for
  creating reproducible output trees)

- suppress some warnings when makeinfo is missing
- call 'which install' only on win32

- change PATH only on WINNT systems (i.e. not if cross-compiling
  on linux for win32)
- asm-c-connect.test: slim output and do diff

tccrun.c tccpe.c *-link.c:
- integrate former 'pe_relocate_rva()' into normal relocation
  This also fixes linkage of the unwind data on WIN64 for -run
  (reported by Janus Lynggaard Thorborg)

tccasm.c, tests/tcctest.c:
- fix dot (sym_index of -1 crashed in put_elf_reloc)
- massage .set a bit (see test)

- #define SECTION_ABS removed
- ST_DATA Section *strtab_section: removed
- put_extern_sym2(): take int section number



7 months agotccgen_begin/end_file
grischka [Tue, 12 Dec 2017 16:33:37 +0000 (12 17:33 +0100)]

This is supposed to make compilation and linking with
multiple source files (tcc f1.c f2.S ...) behave just
the same as linking object files.

- use put_elf_sym to enter new symbols unconditionally

- save section state before compilation
- disable symbol hashing during compilation
- merge symbols and update relocations after compilation

- re-create s1->uw_sym for each compilation (because it
  may change)

7 months agoFix some multi-file corner cases with asm
Michael Matz [Sun, 10 Dec 2017 05:18:27 +0000 (10 06:18 +0100)]
Fix some multi-file corner cases with asm

for this we have to create also asm symbols as VT_STATIC initially
except if there's an indication that it should be global (.globl
or undefined at end of unit).  For this to work we need to
be able to globalize symbols after they were local and enter them
into the ELF hash tables, and also adjust the symbols that were
potentially already used in relocs when they were still local.

The easiest is to do a proper symbol resolution step also in multi-file
mode, for regular symbols (the non-dynamic ones, i.e. not from shared

7 months agotccgen: unify type redefinition checks
grischka [Sun, 3 Dec 2017 19:43:48 +0000 (3 20:43 +0100)]
tccgen: unify type redefinition checks

- improved function patch_storage() and added new function
  patch_type() for more consistent type redefinition and
  instance redefinition checks.

7 months agotccasm: use global(_symbol)_stack
grischka [Thu, 30 Nov 2017 14:15:22 +0000 (30 15:15 +0100)]
tccasm: use global(_symbol)_stack

* removed asm_label stack
* removed asm_free_labels() post-processing
* using "impossible C type" for asm labels (VT_ASM)
* tccgen.c:update_storage(): use it to refresh symbol attributes
* tccelf.c:find_elf_sym(): ignore STB_LOCAL symbols
* tccgen.c:unary(): asm symbols are supposed to be undeclared in C

7 months agoFix another corner case with C/asm symtable
Michael Matz [Mon, 4 Dec 2017 02:51:14 +0000 (4 03:51 +0100)]
Fix another corner case with C/asm symtable

See testcase (from grischka).  If the asm has no .globl,
but there's a (non-static) C definition the symbol should
be exported, even if the first reference comes from asm.

7 months agotccasm: Accept suffixed cmovCC
Michael Matz [Sun, 3 Dec 2017 03:53:50 +0000 (3 04:53 +0100)]
tccasm: Accept suffixed cmovCC

The length suffix for cmovCC isn't necessary as the required register
operands always allow length deduction.  But let's be nice to users
and accept them anyway.  Do that without blowing up tables, which means
we don't detect invalid suffixes for the given operands, but so be it.

7 months agotccasm: Unify C and asm symbol table
Michael Matz [Mon, 27 Nov 2017 03:03:03 +0000 (27 04:03 +0100)]
tccasm: Unify C and asm symbol table

This makes the asm symbols use the same members as the C symbols
for global decls, e.g. using the ELF symbol to hold offset and
section.  That allows us to use only one symbol table for C and
asm symbols and to get rid of hacks to synch between them.

We still need some special handling for symbols that come purely
from asm sources.

7 months agoAdjust asm-c-connect testcase for Windows
Michael Matz [Mon, 27 Nov 2017 00:09:50 +0000 (27 01:09 +0100)]
Adjust asm-c-connect testcase for Windows

Calling conventions are different, let's use functions without
any arguments.

7 months agotccasm: Don't abuse dllexport/dllimport
Michael Matz [Sat, 25 Nov 2017 18:41:03 +0000 (25 19:41 +0100)]
tccasm: Don't abuse dllexport/dllimport

For tracking if asm symbols are connected with a C symbol,
and if asm symbols need to be global use new flags, instead of
reusing dllimport/dllexport, which would cause unrequested exported
entries on Windows.

This is a stop-gap until the C and asm symtable are unified.

7 months agotccasm: synch C and asm symtab tighter
Michael Matz [Wed, 22 Nov 2017 16:57:43 +0000 (22 17:57 +0100)]
tccasm: synch C and asm symtab tighter

See testcase.  The C and asm symtab are still separate,
but integrated tighter: the asm labels are only synched at file
end, not after each asm snippet (this fixes references from one
to another asm block), the C and asm syms are synched both ways,
so defining things in asm and refering from C, or the other way
around works.  In effect this model reflects what happens with
GCC better.

For this the asm labels aren't using the C label namespace anymore,
but their own, which increases the size of each TokenSym by a pointer.

8 months agoAdjust testcase for PIE compilers
Michael Matz [Sun, 19 Nov 2017 14:36:47 +0000 (19 15:36 +0100)]
Adjust testcase for PIE compilers

one some systems GCC defaults to PIC/PIE code which is incompatible
with a unannotated asm call to a function (getenv here).  TCC doesn't
support these PIC annotations (yet), so play some pre-processor games.

8 months agoFix forward asm labels differently
Michael Matz [Sun, 19 Nov 2017 02:04:11 +0000 (19 03:04 +0100)]
Fix forward asm labels differently

while last change fixed one part of label behaviour (undefined ones
must be global) it again broke a different aspect (forward defs
without .globl must stay local).  This fixes both aspects.
That a label is local instead of global is difficult to test without
resorting to look at the symbol table or using two-file testcases,
so we do without.  In essence the local/global-ness of symbols
should be the same between GAS and TCC for this input:

    .globl glob1
    call glob1

    .globl glob2
    call glob2

    .globl glob3
    call glob3

    call glob4
    .globl glob4

    call glob5
    .globl glob5

    call glob6
    .globl glob6

    call locl1

    call locl2

    .globl unref2
    .globl unref3
    call undef

8 months agoDon't make forard asm symbols static by default
Michael Matz [Thu, 16 Nov 2017 12:29:59 +0000 (16 13:29 +0100)]
Don't make forard asm symbols static by default

fixes the problem in the testcase.  A symbolic reference
from asm, which remains undefined at the end of processing is
always a global reference, not a static (STB_LOCAL) one.
This also affected the linux kernel.

8 months agoFix absolute memory references
Michael Matz [Wed, 15 Nov 2017 12:39:28 +0000 (15 13:39 +0100)]
Fix absolute memory references

This properly fixes what 870271ea tried to fix.  Absolute memory
references can't use %rip relative addressing, and additionally,
if the address doesn't fit 32bit (signed) it must be loaded via
movabs.  No good testcase added, it would require catching signals
and still be unreliable.

8 months agoRevert "gen_addrpc32: absolute ptr needs *ABS* relocation"
Michael Matz [Tue, 14 Nov 2017 15:43:22 +0000 (14 16:43 +0100)]
Revert "gen_addrpc32: absolute ptr needs *ABS* relocation"

This reverts commit 870271ea071971002fa556e09e1873db316fa1a9.

The commit is broken, you can't unconditionally emit a PC-relative
relocation without a symbol.  And if there's a symbol the addend
need to be in the relocation, not the section.

8 months agoWin64/PE: Changed runtime function unwind info to be added after relocation, fixes...
janus.lt [Fri, 3 Nov 2017 23:16:37 +0000 (4 00:16 +0100)]
Win64/PE: Changed runtime function unwind info to be added after relocation, fixes SEH + long jmps

9 months agofixed dylib typo in libtcc.c
emekoi [Thu, 19 Oct 2017 05:55:42 +0000 (19 00:55 -0500)]
fixed dylib typo in libtcc.c

9 months agovarious stuff
grischka [Wed, 11 Oct 2017 16:13:43 +0000 (11 18:13 +0200)]
various stuff

win32/Makefile ("for cygwin") removed
- On cygwin, the normal ./configure && make can be used with either
  cygwin's "GCC for Win32 Toolchain"
      ./configure --cross-prefix=i686-w64-mingw32-
  or with an existing tcc:
      ./configure --cc=<old-tccdir>/tcc.exe

- exclude test_high_clobbers() on _WIN64 (does not work)

- use 'signed char' for ARM (where default 'char' is unsigned)

- remove -I "expr" diff option to allow tests with

libtcc.c, tcc.c:
- removed -iwithprefix option.  It is supposed to be
  combined with -iprefix which we don't have either.

- fix assignments and return of 'void', as in
     void f() {
         void *p, *q;
         *p = *q:
         return *p;
  This appears to be allowed but should do nothing.

tcc.h, libtcc.c, tccpp.c:
- Revert "Introduce VIP sysinclude paths which are always searched first"
  This reverts commit 1d5e386b0a78393ac6b670c209a185849ec798a1.

  The patch was giving tcc's system includes priority over -I which
  is not how it should be.

- add DT_TEXTREL tag only if text relocations are actually
  used (which is likely not the case on x86_64)
- prepare_dynamic_rel(): avoid relocation of unresolved
  (weak) symbols

- for HAVE_SELINUX, use two mappings to the same (real) file.
  (it was so once except the RX mapping wasn't used at all).

- fix relocation constant used for x86_64 (by Andrei E. Warentin)
- #ifndef _WIN32 do "chmod 755 ..." to get runnable exes on cygwin.

- keep forward asm labels static, otherwise they will endup
  in dynsym eventually.

configure, Makefile:
- mingw32: respect ./configure options --bindir --docdir --libdir
- allow overriding tcc when building libtcc1.a and libtcc.def with
      make XTCC=<tcc program to use>
- use $(wildcard ...) for install to allow installing just
  a cross compiler for example
      make cross-arm
      make install
- use name <target>-libtcc1.a

- add  options: -clean, -b bindir

9 months agoWin: crt, initialize global __argc, __targv and _tenviron of msvcrt
YX Hao [Sun, 8 Oct 2017 09:28:02 +0000 (8 17:28 +0800)]
Win: crt, initialize global __argc, __targv and _tenviron of msvcrt

_tenviron: as far as possible, not in ASC '-run' mode.
__argc and __targv are shortcuts for _tWinMain, when you want to use program parameters.

9 months agoFix Windows++ compilation of previous (YX Hao, Joel Bodenmann)
Steffen Nurpmeso [Mon, 9 Oct 2017 12:52:56 +0000 (9 14:52 +0200)]
Fix Windows++ compilation of previous (YX Hao, Joel Bodenmann)

9 months agoIntroduce VIP sysinclude paths which are always searched first
Steffen Nurpmeso [Fri, 29 Sep 2017 22:13:05 +0000 (30 00:13 +0200)]
Introduce VIP sysinclude paths which are always searched first

9 months agoAdjust va_list to work with musl
Steffen Nurpmeso [Fri, 29 Sep 2017 22:11:59 +0000 (30 00:11 +0200)]
Adjust va_list to work with musl

9 months agotools directory no more exists, removed in win32 tarball Makefile target.
Christian Jullien [Fri, 29 Sep 2017 05:26:21 +0000 (29 07:26 +0200)]
tools directory no more exists, removed in win32 tarball Makefile target.

9 months agoUse more conventional punctuation for sequential assignments
Larry Doolittle [Tue, 26 Sep 2017 05:16:23 +0000 (25 22:16 -0700)]
Use more conventional punctuation for sequential assignments

9 months agofreebsd: allow building tcc which targets windows
Avi Halachmi (:avih) [Mon, 25 Sep 2017 15:39:35 +0000 (25 18:39 +0300)]
freebsd: allow building tcc which targets windows

Currently tcc doesn't have a compile-time config indicating that the target
is freebsd, and as a result, the tcc binary adds freebsh stuff to elf headers
if the compile-time (of tcc) *host* is freebsd.

Test also that the target is not PE while generating an elf header.

This still likely fails (but untested) when tcc targets other non-freebsd
systems on a freebsd system, but for now fix it only when targetting windows.

9 months agoFix some spelling in documentation
Larry Doolittle [Mon, 25 Sep 2017 01:22:42 +0000 (24 18:22 -0700)]
Fix some spelling in documentation

9 months agoSpelling fixes
Larry Doolittle [Mon, 25 Sep 2017 01:03:26 +0000 (24 18:03 -0700)]
Spelling fixes

Comments only, no change to functionality

9 months agoConvert two .c files to LF line endings
Larry Doolittle [Sun, 24 Sep 2017 23:48:08 +0000 (24 16:48 -0700)]
Convert two .c files to LF line endings

... matching the other 157 .c files in the tree

9 months ago'long' review
grischka [Sun, 24 Sep 2017 16:57:48 +0000 (24 18:57 +0200)]
'long' review

add some features for more complete 'long' support

- use LONG_SIZE=4/8 instead of TCC_LONG_ARE_64_BIT
- add ptrdiff_type, update size_type
- support shift and ?: operations
- support long enum types
- display 'long' from type_to_str
- nwchar_t is unsigned short on windows
- unrelated: use memcpy in init_putv for long doubles to avoid
  random bytes in the image (if tcc was compiled by gcc) for
  diff purposes.
- make parse_number return correct types
- improve multi-character-constants 'XX' 'abcd'
- update

10 months agogen_addrpc32: absolute ptr needs *ABS* relocation
Zdenek Pavlas [Mon, 11 Sep 2017 12:56:47 +0000 (11 05:56 -0700)]
gen_addrpc32: absolute ptr needs *ABS* relocation

Dereferencing of absolute pointers is broken on x86_64, eg:

*(int*)NULL does not segfault but returns -4 instead
*(char*)(-10L << 20) does not return 0x55 (vsyscall page, push rbp)

10 months agoAdd test case for fastcall calling convention
Zhang Boyang [Sun, 10 Sep 2017 10:20:02 +0000 (10 18:20 +0800)]
Add test case for fastcall calling convention

10 months agoAdd test case for AL/AX extending problem
Zhang Boyang [Sun, 10 Sep 2017 09:02:48 +0000 (10 17:02 +0800)]
Add test case for AL/AX extending problem

10 months agoAdd test case for wide char handling in wide string literal
Zhang Boyang [Sun, 10 Sep 2017 08:50:19 +0000 (10 16:50 +0800)]
Add test case for wide char handling in wide string literal

10 months agoFix calling function pointers casted from intergers in DLL
Zhang Boyang [Sat, 9 Sep 2017 13:11:56 +0000 (9 21:11 +0800)]
Fix calling function pointers casted from intergers in DLL

The code generated for "((void (*)(void))0x12345678)()" will be a single "CALL 0x12345678" in previous code.
However, this will not work for DLLs, because "CALL imm" is PC related, DLL relocation will break the code.
This commit fixed the problem by forcing TCC generates indirect CALLs in this situation.

10 months agoFix AL/AX is not extended to EAX when calling indirectly
Zhang Boyang [Sat, 9 Sep 2017 13:01:42 +0000 (9 21:01 +0800)]
Fix AL/AX is not extended to EAX when calling indirectly

AL/AX should be extended to EAX when calling functions. However, the previous code did this only for direct calls, indirect calls were ignored.
New code also avoid redundant code when generating JMP instruction. (i.e. expanding code should be generated with CALL instruction only)

10 months agoFix wide char handling in wide string literal
Zhang Boyang [Sat, 9 Sep 2017 12:37:43 +0000 (9 20:37 +0800)]
Fix wide char handling in wide string literal

This commit fixed the problem that TCC directly cast each byte in wide string literal to wchar_t, which is wrong when wide string literal contains real wide chars.
It fixed the problem by assuming input charset is UTF-8, and wchar_t stores wide chars in UTF-16 (Windows) or UTF-32 (others).
The UTF-8 decoder is coded according to The Unicode Standard Version 10.

10 months agocalled function should pop the arguments when using fastcall
Zhang Boyang [Mon, 21 Aug 2017 11:38:11 +0000 (21 19:38 +0800)]
called function should pop the arguments when using fastcall

11 months agoConvert from ISO-8859-1 to UTF-8. See aa812e8.
Edmund Grimley Evans [Wed, 26 Jul 2017 12:07:14 +0000 (26 13:07 +0100)]
Convert from ISO-8859-1 to UTF-8. See aa812e8.

11 months agoRevert "use int for ssize_t, (u)intptr_t instead of long in stddef.h"
Matthias Gatto [Wed, 26 Jul 2017 08:23:59 +0000 (26 10:23 +0200)]
Revert "use int for ssize_t, (u)intptr_t instead of long in stddef.h"

This reverts commit 52622c3c0365ad497ce1188e433ac5f0a721c283.

Because 28b7c9 was right.

11 months agoRevert "simplify VT_LONG parsing"
matthias [Tue, 25 Jul 2017 20:04:24 +0000 (25 22:04 +0200)]
Revert "simplify VT_LONG parsing"

Too simple long parsion.
Take me a long long long time to see my mistake,

(long long long wasn't see as an error)
This reverts commit a4cd2805f95e1369254762478883e91050f2cba1.

11 months agoRemove debug echo in Cygwin Makefile
Christian Jullien [Tue, 25 Jul 2017 17:17:10 +0000 (25 19:17 +0200)]
Remove debug echo in Cygwin Makefile

11 months agoUpdate Cygwin Makefile to use -B. for bootstrap
Christian Jullien [Tue, 25 Jul 2017 17:12:04 +0000 (25 19:12 +0200)]
Update Cygwin Makefile to use -B. for bootstrap

11 months agouse int for ssize_t, (u)intptr_t instead of long in stddef.h
Matthias Gatto [Tue, 25 Jul 2017 16:56:06 +0000 (25 18:56 +0200)]
use int for ssize_t, (u)intptr_t instead of long in stddef.h

11 months agocheck that _Generic match 'signed long int' as 'long'
Matthias Gatto [Tue, 25 Jul 2017 15:57:47 +0000 (25 17:57 +0200)]
check that _Generic match 'signed long int' as 'long'

11 months agosimplify VT_LONG parsing
Matthias Gatto [Tue, 25 Jul 2017 15:55:58 +0000 (25 17:55 +0200)]
simplify VT_LONG parsing

11 months agoUpdate Cygwin Makefile to work with recent changes about ONE_SOURCE and CONFG_TCCDIR
Christian Jullien [Tue, 25 Jul 2017 15:50:28 +0000 (25 17:50 +0200)]
Update Cygwin Makefile to work with recent changes about ONE_SOURCE and CONFG_TCCDIR

11 months agodefine __SIZE_TYPE__ and __PTRDIFF_TYPE__ as unsigned int and int.
Matthias Gatto [Tue, 25 Jul 2017 14:25:27 +0000 (25 16:25 +0200)]
define __SIZE_TYPE__ and __PTRDIFF_TYPE__ as unsigned int and int.

As long is now a qualifier, and because compare_type will notice
that variables are not the same type, we can't use long as int anymore.

So, I've redefine __SIZE_TYPE__ as unsigned int and __PTRDIFF_TYPE__ as int.

11 months agoremove inside_generic hack
Matthias Gatto [Mon, 24 Jul 2017 09:52:15 +0000 (24 11:52 +0200)]
remove inside_generic hack

define uint64_t and int64_t as 'long' instead of 'long long'
when __LP64__ is define.

11 months agotccgen: nodata_wanted fix, default ONE_SOURCE, etc...
grischka [Sun, 23 Jul 2017 19:24:11 +0000 (23 21:24 +0200)]
tccgen: nodata_wanted fix, default ONE_SOURCE, etc...

  doubles need to be aligned, on ARM.  The section_reserve()
  in init_putv does not do that.
-D ONE_SOURCE: is now the default and not longer needed. Also,
  tcc.h now sets the default native target.  These both make
  compiling tcc simple as "gcc tcc.c -o tcc -ldl" again.
  enable pseudo asm also for inline asm
  disable bitfield tests except on windows and x86_64
  and don't generate-always
  fix a loop with -dt on errors
  print compiler version (as recognized)
  actually define symbols for tcc -dt
  clear static variables (needed for -dt or libtcc usage)
  use __label__ instead of asm
  use native symbols (__i386__ etc.) instead of TCC_TARGET_...

11 months agomutiples fix for _Generic
matthias [Mon, 10 Jul 2017 15:44:53 +0000 (10 17:44 +0200)]
mutiples fix for _Generic

* check that _Generic don't match unsigned char * with char *
  this case is usefull as with -funsigned-char, 'char *' are unsigned

* change VT_LONG so it's now a qualifier

  VT_LONG are never use for code generation, but only durring parsing state,
  in _Generic we need to be able to make diference between
  'long' and 'long long'
  So VT_LONG is now use as a type qualifier, it's old behaviour is still
  here, but we can keep trace of what was a long and what wasn't


  tcc was directly converting value like '7171L' into TOK_CLLONG or
  TOK_CINT depending of the machine architecture.

  because of that, we was unable to make diference between a long and a
  long long, which doesn't work with _Generic.

  So now 7171L is a TOK_CLONG, and we can handle _Generic properly

* check that _Generic can make diference between long and long long

* uncomment "type match twice" as it should now pass tests on any platforms

* add inside_generic global

  the point of this variable is to use VT_LONG in comparaison only
  when we are evaluating a _Generic.
  problem is with my lastest patchs tcc can now make the diference between
  a 'long long' and a 'long', but in 64 bit stddef.h typedef uint64_t as
  typedef signed long long int int64_t and stdint.h as unsigned long int, so tcc
  break when stdint.h and stddef.h are include together.

  Another solution woud be to modifie include/stddef.h so it define uint64_t as
  unsigned long int when processor is 64 bit, but this could break some
  legacy code, so for now, VT_LONG are use only inside generc.

* check that _Generic parse first argument correctly

* check that _Generic evaluate correctly exresion like "f() / 2"

12 months agotcc -dt -run ... : simpler is better
grischka [Thu, 20 Jul 2017 20:21:27 +0000 (20 22:21 +0200)]
tcc -dt -run ... : simpler is better

* -dt now with lowercase t

* test snippets now separated by real preprocessor statements
  which is valid C also for other compilers

    #if defined test_xxx
       < test snippet x >
    #elif defined test_yyy
       < test snippet y >
    #elif ...

* simpler implementation, behaves like -run if no 'test_...' macros
  are seen, works with -E too

* for demonstration I combined some of the small tests for errors
  and warnings (56..63,74) in "60_errors_and_warnings.c"

* libtcc.c:
  put tcc_preprocess() and tcc_assemble() under the setjmp clause
  to let them return to caller after errors.  This is for -dt -E.
* tccgen.c:
  - get rid of save/restore_parse_state(), macro_ptr is saved
    by begin_macro anyway, now line_num too.
  - use expr_eq for parsing _Generic's controlling_type
  - set nocode_wanted with const_wanted. too, This is to keep
    VT_JMP on vtop when parsing preprocessor expressions.
* tccpp.c: tcc -E: suppress trailing whitespace from lines with
  comments (that -E removes) such as
       NO_GOTPLT_ENTRY,\t    /* never generate ... */

12 months agofix typo sellector -> selector
Matthias Gatto [Fri, 7 Jul 2017 16:21:19 +0000 (7 18:21 +0200)]
fix typo sellector -> selector

12 months agofix typo: march -> match
matthias [Fri, 14 Jul 2017 14:55:24 +0000 (14 16:55 +0200)]
fix typo: march -> match

12 months agounqualify volatile in _Generic type checking
Matthias Gatto [Thu, 6 Jul 2017 11:46:28 +0000 (6 13:46 +0200)]
unqualify volatile in _Generic type checking

12 months agoFix cross compilers
Michael Matz [Sun, 16 Jul 2017 19:03:25 +0000 (16 21:03 +0200)]
Fix cross compilers

Only native compilers support -run and hence the new -dT.

12 months agotccgen: nodata_wanted
grischka [Sun, 16 Jul 2017 10:10:00 +0000 (16 12:10 +0200)]
tccgen: nodata_wanted

The existing variable 'nocode_wanted' is now used to control
output of static data too. So...

(nocode_wanted == 0)
    code and data (normal within functions)
(nocode_wanted < 0)
    means: no code, but data (global or static data)
(nocode_wanted > 0)
    means: no code and no data (code and data suppressed)
(nocode_wanted & 0xC0000000)
    means:  we're in declaration of static data

Also: new option '-dT' to be used with -run
    tcc -dT -run file.c
This will look in file.c for certain comment-boundaries:
    /*-* test-xxx: ...some description */
and then for each test below run it from memory.  This way
various features and error messages can be tested with one
single file.  See 96_nodata_wanted.c for an example.

Also: tccgen.c: one more bitfield fix

12 months ago#pragma comment(option,"-..."), bitfields test, etc...
grischka [Fri, 14 Jul 2017 17:26:01 +0000 (14 19:26 +0200)]
#pragma comment(option,"-..."), bitfields test, etc...

* #pragma comment(option,"-some-option")
  to set commandline option from C code.  May work only
  for some options.
* option "-d1..9": sets a 'g_debug' global variable.
  (for development)
* new make targets: tests2.37 / tests2.37+
  run single test from tests2,  optionally update .expect
* new variable GEN-ALWAYS to always generate certain .expects
* bitfields test
* bitfields: fix a bug and improve slightly more
* _Generic: ignore "type match twice"

12 months agoFix function types
Michael Matz [Fri, 14 Jul 2017 15:42:48 +0000 (14 17:42 +0200)]
Fix function types

various cases of function type uses were broken by recent
attribute refactoring, this fixes and adds testcases for them.

12 months agotccasm: Fix local statics referenced from asms
Michael Matz [Mon, 10 Jul 2017 20:29:28 +0000 (10 22:29 +0200)]
tccasm: Fix local statics referenced from asms

The assembler uses the ->sym_scope member to walk up the symbols
until finding a non-automatic symbol.  Since reordering the
members of Sym the sym_scope member contains a scope even for local
statics.  Formerly the use of asm_label for statics was implicitely
clearing sym_scope, now we have to do that explicitely.

Add a testcase for that, and one I encountered when moving the
clearing of sym_scope too deep into the call chain (into put_extern_sym).

12 months agoFix statement exprs returning a local label
Michael Matz [Mon, 10 Jul 2017 20:25:11 +0000 (10 22:25 +0200)]
Fix statement exprs returning a local label

Like returned local variables also labels local to a statement expression
can be returned, and so their symbols must not be immediately freed
(though they need to be removed from the symbol table).

12 months agoenums: Accept GNU extension
Michael Matz [Mon, 10 Jul 2017 20:20:34 +0000 (10 22:20 +0200)]
enums: Accept GNU extension

See testcase.  Happens e.g. in the linux kernel.

12 months agorefactor bitfields
grischka [Sun, 9 Jul 2017 10:38:59 +0000 (9 12:38 +0200)]
refactor bitfields

Use 2 level strategy to access packed bitfields cleanly:

1) Allow to override the original declaration type with
   an auxilary "access type".  This solves cases such as

    struct {
        unsigned f1:1;

    by using VT_BYTE to access f1.

2) Allow byte-wise split accesses using two new functions
   load/store_packed_bf. This solves any cases, also ones
   such as

    struct __attribute((packed)) _s {
        unsigned x : 12;
        unsigned char y : 7;
        unsigned z : 28;
        unsigned a: 3;
        unsigned b: 3;
        unsigned c: 3;

    where for field 'z':
    - VT_INT access from offset 2 would be unaligned
    - VT_LLONG from offset 0 would go past the total
      struct size (7)

    and for field 'a' because it is in two bytes and
    aligned access with VT_SHORT/INT is not possible.

Also, static bitfield initializers are stored byte-wise always.
Also, cleanup the struct_layout function a bit.

12 months agorefactor enums
grischka [Sun, 9 Jul 2017 10:38:25 +0000 (9 12:38 +0200)]
refactor enums

Eliminate VT_ENUM as a basic type.  Instead use the integral
types VT_InT/VT_LLONG with an additional flag to indicate
that it is an enum.

12 months agorefactor sym & attributes
grischka [Sun, 9 Jul 2017 10:34:11 +0000 (9 12:34 +0200)]
refactor sym & attributes

* cleanup struct 'Sym'
* include some 'Attributes' into 'Sym'
* in turn get rid of VT_IM/EXPORT, VT_WEAK
* re-number VT_XXX flags
* replace some 'long' function args by 'int'

* refactor parse_btype()

12 months agounsorted adjustments
grischka [Sun, 9 Jul 2017 10:07:40 +0000 (9 12:07 +0200)]
unsorted adjustments

- configure
  * use aarch64 instead of arm64

- Makefile
  * rename the custom include file to "config-extra.mak"
  * Also avoid "rm -r /*" if $(tccdir) is empty

- pp/Makefile
  * fix .expect generation with gcc

- tcc.h
  * cleanup #defines for _MSC_VER

- tccgen.c:
  * fix const-propagation for &,|
  * fix anonymous named struct (ms-extension) and enable
    -fms-extension by default

- i386-gen.c
  * clear VT_DEFSIGN

- x86_64-gen.c/win64:
  * fix passing structs in registers
  * fix alloca (need to keep "func_scratch" below each alloca area on stack)
    (This allows to compile a working gnu-make on win64)

- tccpp.c
  * alternative approach to 37999a4fbf3487b363fd0c2f9b7ab622401b202a
    This is to avoid some slowdown with ## token pasting.
  * get_tok_str() : return <eof> for TOK_EOF
  * -funsigned-char: apply to "string" literals as well

- tccpe/tools.c: -impdef: support both 32 and 64 bit dlls anyway

12 months agotccpp: allow "#define X defined Y ..."
grischka [Mon, 5 Jun 2017 11:21:39 +0000 (5 13:21 +0200)]
tccpp: allow "#define X defined Y ..."

That means: we do not macro-expand the argument of 'defined'

Also: store the last token position into the TokenString
structure in order to get rid of the tok_last function.

12 months agotccpp: Implement __COUNTER__
Michael Matz [Sun, 9 Jul 2017 03:30:47 +0000 (9 05:30 +0200)]
tccpp: Implement __COUNTER__

This requires one more change in how macro arguments are expanded:
the standard requires that macro args are expanded before substituting
into the replacement list.  This implies expanding them only once
even when they occur multiple times in the list.  TCC expanded
them repeatedly in that case.  Without __COUNTER__ that's harmless.

So, simply always expand arguments (when used without # and ##) once
and store the resulting tokens.

12 months agotccpp: Cleanup
Michael Matz [Sun, 9 Jul 2017 02:53:24 +0000 (9 04:53 +0200)]
tccpp: Cleanup

With last change the can_read_stream flag is unneeded, so tidy this
a bit.

12 months agotccpp: Fix corner case
Michael Matz [Sun, 9 Jul 2017 02:30:36 +0000 (9 04:30 +0200)]
tccpp: Fix corner case

See added testcase 19.c from a bug report.  The problem is reading outside
the arguments buffers, even though we aren't allowed to.  The single
can_read_stream variable is not enough, sometimes we need to be able
to pop into outer contexts but not into arbitrarily outside contexts.

The trick is to terminate argument tokens with a EOF (and not just with
0 that makes us pop contexts), and deal with that in the few places
we have to,

This enables some cleanups of the can_read_stream variable use.

12 months agoadd _Generic test
Matthias Gatto [Wed, 5 Jul 2017 14:46:20 +0000 (5 16:46 +0200)]
add _Generic test

12 months agoadd C11's _Generic
Matthias Gatto [Fri, 9 Dec 2016 10:42:41 +0000 (9 11:42 +0100)]
add C11's _Generic

Simple implementation, I'm not even sure to respect C standart here,
but it should work with most use case.

This add an case in unary(), and generate TokString depending of _Generic
controlling exression, use begin_macro to "push"
the generated TokString, then call unary() again before exiting the switch
so the just add token are reevaluate again.

12 months agoRevert "String literals are always const"
Michael Matz [Tue, 4 Jul 2017 14:37:49 +0000 (4 16:37 +0200)]
Revert "String literals are always const"

This reverts commit d4fe9aba3fc6f4b9cc97b100e86ffe7af5c29619.
I was confused by the fact that string literals aren't writable.
Nevertheless the type isn't const.  As extension in GCC it's const
with -Wwrite-string, which is exactly what we had before.

GCC also wonders in a comment if it's really a good idea to change
expression types based on warning flags (IMHO it's not), but let's
be compatible.  So restore the state from before.

12 months agoExtend skip_or_save_block
Michael Matz [Mon, 3 Jul 2017 17:15:16 +0000 (3 19:15 +0200)]
Extend skip_or_save_block

Make it stop also before outer level closing parens.  This way
we can now also skip/save the expression inside "foobar(42 + 41)".

12 months agoImprove skip_or_save_block
Michael Matz [Mon, 3 Jul 2017 16:13:15 +0000 (3 18:13 +0200)]
Improve skip_or_save_block

Stop at level 0 only for matching outer '}' (which is added).
Otherwise stop only at stop tokens (which aren't added).

12 months agoString literals are always const
Michael Matz [Mon, 3 Jul 2017 16:02:57 +0000 (3 18:02 +0200)]
String literals are always const

Don't make the standard mandated types of string literals
depends on warning options.  Instead make them always const,
but limit the emission of the warning by that option.

13 months agoAlign 'implicit-function-declaration' option comment with other comments (cosmetic...
Christian Jullien [Sat, 10 Jun 2017 04:45:51 +0000 (10 06:45 +0200)]
Align 'implicit-function-declaration' option comment with other comments (cosmetic change)

13 months agoAdd -O2 when compiling tcc on Windows. Not sure this flag is really used by tcc.
Christian Jullien [Sat, 10 Jun 2017 04:35:11 +0000 (10 06:35 +0200)]
Add -O2 when compiling tcc on Windows. Not sure this flag is really used by tcc.