3 days agofinal update for 0.9.27mastermob
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



3 days 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)

5 days 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

11 days 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.

11 days 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

11 days 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.

12 days 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.

2 weeks 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.

2 weeks 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.

2 weeks 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.

3 weeks 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.

3 weeks 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.

3 weeks 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

4 weeks 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.

4 weeks 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.

4 weeks 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.

6 weeks 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

8 weeks 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

2 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

2 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.

2 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)

2 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

2 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

2 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.

2 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

2 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.

2 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

2 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

2 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

2 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

3 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)

3 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

3 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

3 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

3 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.

3 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)

3 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.

3 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

4 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.

4 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.

4 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.

4 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

4 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

4 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

4 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'

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

4 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

4 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.

4 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.

4 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_...

4 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"

4 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 ... */

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

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

4 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

5 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.

5 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

5 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"

5 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.

5 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).

5 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).

5 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.

5 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.

5 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.

5 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()

5 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

5 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.

5 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.

5 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.

5 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.

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

5 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.

5 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.

5 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)".

5 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).

5 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.

6 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)

6 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.

6 months agoWhen creating a staticaly linked ELF program should not include
Emil [Fri, 9 Jun 2017 18:44:29 +0000 (9 19:44 +0100)]
When creating a staticaly linked ELF program should not include
any dyn symbols. The if( !s1->static_link ) prevents tcc from
crashing when buiding a program linked to dietlibc.

The section header should not contain the number of local symbols when
the sh_size is null. This makes the header compliant and IDA will not
issue any warnings when an executable is disassembled.

6 months agoforce i386-win32-tcc.exe to be a 32bit binary. Run tests in both 32/64 bits on Windows.
U-NELSON\jullien [Mon, 5 Jun 2017 06:18:11 +0000 (5 08:18 +0200)]
force i386-win32-tcc.exe to be a 32bit binary. Run tests in both 32/64 bits on Windows.

6 months agoAdd more common tests to be run from win32/Makefile
U-NELSON\jullien [Sun, 4 Jun 2017 07:27:48 +0000 (4 09:27 +0200)]
Add more common tests to be run from win32/Makefile

6 months agoWindows test Makefile target also test pp tests.
Christian Jullien [Sun, 28 May 2017 05:12:57 +0000 (28 07:12 +0200)]
Windows test Makefile target also test pp tests.

6 months agoLimit access end-of-struct warning a bit
Michael Matz [Sat, 27 May 2017 20:44:53 +0000 (27 22:44 +0200)]
Limit access end-of-struct warning a bit

Only warn if the struct has a non-zero size.  You can't create objects
of zero-sized structs, but they can be used inside sizeof (e.g.
"sizeof (struct {int :0;})".  The warning would always trigger for these,
but as no objects can be created no accesses can ever happen.

6 months agox86-64: Fix psABI stdarg prologue
Michael Matz [Sat, 27 May 2017 20:42:18 +0000 (27 22:42 +0200)]
x86-64: Fix psABI stdarg prologue

If there were more than 6 integer arguments before the ellipsis, or
there were used more than 8 slots used until the ellipsis (e.g. by
a large intermediate struct) we generated wrong code.  See testcase.

6 months agox86-64: Rewrite linux parameter passing
Michael Matz [Sat, 27 May 2017 19:23:13 +0000 (27 21:23 +0200)]
x86-64: Rewrite linux parameter passing

This fixes two ABI testcases involving large arguments when there
are still registers available for later args.

7 months agothe R_X86_64_GOTOFF64 relocation was missing
Aron BARATH [Tue, 16 May 2017 05:03:26 +0000 (16 07:03 +0200)]
the R_X86_64_GOTOFF64 relocation was missing

7 months agoconfigure: --config-musl/-uClibc switch & misc cleanups
grischka [Sat, 13 May 2017 06:59:06 +0000 (13 08:59 +0200)]
configure: --config-musl/-uClibc switch & misc cleanups

- configure:
  - add --config-uClibc,-musl switch and suggest to use
    it if uClibc/musl is detected
  - make warning options magic clang compatible
  - simplify (use $confvars instead of individual options)
- Revert "Remove some unused-parameter lint"
  rather use -Wno-unused-parameter (or just not -Wextra)
- #ifdef functions that are unused on some targets
- tccgen.c: use PTR_SIZE==8 instead of (X86_64 || ARM64)
- tccpe.c: fix some warnings
- integrate dummy arm-asm better

7 months agoadded 64-bit relocation types that required to linking against 64-bit (large model...
Aron BARATH [Fri, 12 May 2017 07:31:09 +0000 (12 09:31 +0200)]
added 64-bit relocation types that required to linking against 64-bit (large model) libraries

7 months agobitfields: promote to signed int
grischka [Tue, 9 May 2017 16:36:24 +0000 (9 18:36 +0200)]
bitfields: promote to signed int

For integer promotion with for example arithmetics or
expr_cond (x ? y : z), integral types need to be promoted
to signed if they fit.

According to latest standards, this also applies to bit-field
types taking into account their specific width.

In tcc, VT_BITFIELD set means width < original type width
Field-widths between 33 and 63 are promoted to signed long long

    struct { unsigned long long ullb:35; } s = { 1 };
    #define X (s.ullb - 2)

    int main (void)
        long long Y = X;
        printf("%d %016llx %016llx\n", X < 0, -X, -Y);
        return 0;

    GCC 4.7 : 0 0000000000000001 FFFFFFF800000001
    MSVC    : 1 0000000000000001 0000000000000001
    TCC     : 1 0000000000000001 0000000000000001

Also, gcc would promote long long bitfields of size < 32
to int as well.  Example:

    struct { unsigned long long x:20; } t = { 123 };
    /* with gcc: */ printf("%d %d\n", t.x, 456);
    /* with tcc: */ printf("%lld %d\n", t.x, 456);

7 months agobitfields: one more hack and a "-Wgcc-compat" switch
grischka [Tue, 9 May 2017 16:10:02 +0000 (9 18:10 +0200)]
bitfields: one more hack and a "-Wgcc-compat" switch

    bit_pos + bit_size > type_size * 8

must NEVER happen because the code generator can read/write
only the basic integral types.

Warn if tcc has to break GCC compatibility for that reason
and if -Wgcc-compat is given.

    struct __attribute__((packed)) _s
        unsigned int x  : 12;
        unsigned char y :  7;
        unsigned int z  : 28;

Expected (GCC) layout (sizeof struct = 6)

But we cannot read/write 'char y'from 2 bytes in memory.
So we have to adjust:

Now 'int z' cannot be accessed from 5 bytes.  So we arrive
at this (sizeof struct = 7):

Otherwise the bitfield load/store generator needs to be
changed to allow byte-wise accesses.

Also we may touch memory past the struct in some cases
currently.  The patch adds a warning for that too.

   0: 55                    push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 81 ec 04 00 00 00     sub    $0x4,%esp
   9: 90                    nop

    struct __attribute__((packed)) { unsigned x : 5; } b = {0} ;

   a: 8b 45 ff              mov    -0x1(%ebp),%eax
   d: 83 e0 e0              and    $0xffffffe0,%eax
  10: 89 45 ff              mov    %eax,-0x1(%ebp)

This touches -0x1 ... +0x3(%ebp), hence 3 bytes beyond
stack space.  Since the data is not changed, nothing
else happens here.

7 months agoTouch up previous "s"[i<2] patch
Larry Doolittle [Tue, 9 May 2017 14:08:43 +0000 (9 07:08 -0700)]
Touch up previous "s"[i<2] patch

The real equivalence is between the original "s" + (i<2)
and &"s"[i<2].

7 months agoGive clang one less thing to complain about
Larry Doolittle [Tue, 9 May 2017 04:56:38 +0000 (8 21:56 -0700)]
Give clang one less thing to complain about

"s"[i<2] and "s" + (i<2) are literally identical, but the latter triggers
a warning from clang because it looks so much like a noob is trying to
concatenate an integer and a string.  The former is arguably more clear.

7 months agoRemove some unused arguments
Michael Matz [Mon, 8 May 2017 18:26:59 +0000 (8 20:26 +0200)]
Remove some unused arguments

these ones are really superfluous.

7 months agobitfields: fix long bitfields
Michael Matz [Mon, 8 May 2017 17:58:31 +0000 (8 19:58 +0200)]
bitfields: fix long bitfields

now the testcase works on i386-linux as well.

7 months agoImprove musl and uclibc detection
Marc Vertes [Mon, 8 May 2017 16:14:35 +0000 (8 16:14 +0000)]
Improve musl and uclibc detection

Do not enable musl or uclibc native support if a GNU linker is
already present. This avoids interference for example on a
Debian platform with musl-dev installed. More work is required
to select musl libc in that case, with additional configure flags.

7 months agoFix spelling in help message
Larry Doolittle [Mon, 8 May 2017 15:44:52 +0000 (8 08:44 -0700)]
Fix spelling in help message

"seach" becomes "search" in help2 when not TCC_TARGET_PE

7 months agoRemove some unused-parameter lint
Larry Doolittle [Mon, 8 May 2017 15:30:43 +0000 (8 08:30 -0700)]
Remove some unused-parameter lint

Mark TCCState parameter as unused in tcc_undefine_symbol(), tcc_add_symbol(),
tcc_print_stats(), asm_get_local_label_name(), use_section1(), tccpp_delete(),
tcc_tool_ar(), tcc_tool_impdef(), and tcc_tool_cross().
Also mark it unused in tcc_add_bcheck() unless CONFIG_TCC_BCHECK.
Remove it entirely in ld_next().

7 months agoC string litteral is const, fix return type of default_elfinterp. Remove #ifndef...
Christian Jullien [Mon, 8 May 2017 07:18:27 +0000 (8 09:18 +0200)]
C string litteral is const, fix return type of default_elfinterp. Remove #ifndef TCC_IS_NATIVE in arm-gen.c as suggested by grischka.

7 months agoSpelling fixes in C comments only
Larry Doolittle [Mon, 8 May 2017 04:38:09 +0000 (7 21:38 -0700)]
Spelling fixes in C comments only

7 months agoAdd missing const and add warning flags
Larry Doolittle [Mon, 8 May 2017 04:28:05 +0000 (7 21:28 -0700)]
Add missing const and add warning flags