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

9 days agovarious stuffmaster
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

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

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

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

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

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

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

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

Comments only, no change to functionality

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

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

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

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

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

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

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

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

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

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

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

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

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

2 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

2 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

2 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

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

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

2 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

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

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

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

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

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

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

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

3 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

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

3 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

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

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

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

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

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

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

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

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

3 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4 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

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

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

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

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

5 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

5 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

5 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

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

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

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

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

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

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

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

5 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

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

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

5 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

5 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

5 months agoFix a warning
Michael Matz [Mon, 8 May 2017 03:29:54 +0000 (8 05:29 +0200)]
Fix a warning

"missing intitializer for field op_type" with gcc -Wextra.  It's
zero-initialized anyway, and not that much a hassle to explicitely
initialize either, so let's be nice and make it not warn.

5 months agomore minor fixes
grischka [Sun, 7 May 2017 10:41:29 +0000 (7 12:41 +0200)]
more minor fixes

* tccgen: re-allow long double constants for x87 cross
  sizeof (long double) may be 12 or 16 depending on host platform
  (i386/x86_64 on unix/windows).
  Except that it's 8 if the host is on windows and not gcc
  was used to compile tcc.

* win64: fix builtin_va_start after VT_REF removal
  See also a8b83ce43a95fa519dacfe7690a3a0098af7909c

* tcctest.c: remove outdated limitation for ll-bitfield test
  It always worked, there is no reason why it should not work
  in future.

* libtcc1.c: exclude long double conversion on ARM

* Makefile: remove CFLAGS from link recipes

* lib/Makefile: use target DEFINES as passed from main Makefile

* lib/armflush.c lib/va_list.c: factor out from libtcc1.c

* arm-gen.c: disable "depreciated" warnings for now

5 months agoAccept extern initialized file-scope variables
Michael Matz [Sun, 7 May 2017 06:10:06 +0000 (7 08:10 +0200)]
Accept extern initialized file-scope variables

'extern int i = 42;' at file scope (but not in function scope!) is
allowed and is a proper definition, even though questionable style;
some compilers warn about this.

5 months agoelf: Fix last commit
Michael Matz [Sun, 7 May 2017 02:52:21 +0000 (7 04:52 +0200)]
elf: Fix last commit

Forgot to mark tccelf.c as to be committed in last commit :-/

5 months agoelf: Support STB_LOCAL dynamic symbols
Michael Matz [Sun, 7 May 2017 02:41:40 +0000 (7 04:41 +0200)]
elf: Support STB_LOCAL dynamic symbols

local symbols can be resolved statically, they don't have to be
done dynamically, so this is a slight speedup at load time for
produced executables and shared libs.  The musl libc also rejects
any STB_LOCAL symbols for dynamic symbol resolution, so there it
also fixes use of shared libs created by tcc.

5 months agoelf: Ignore SHF_COMPRESSED sections
Michael Matz [Sat, 6 May 2017 05:30:44 +0000 (6 07:30 +0200)]
elf: Ignore SHF_COMPRESSED sections

some newer systems have debug sections compressed by default, which
includes those in the crt[1in].o startup files.  These can't simply
be concatenated like all others (which leads to invalid section contents
ultimately making gdb fail) but need special handling.

Instead of that special handling (decompressing, which in turn requires
linking against zlib) let's just ignore such sections, even though that
means to also ignore all other debug sections from that particular input
file.  Our own generated files of course don't have the problem.

5 months agostruct-init: Fix zero initialization with multi-level designators
Michael Matz [Sat, 6 May 2017 03:28:13 +0000 (6 05:28 +0200)]
struct-init: Fix zero initialization with multi-level designators

See the added testcase.  When one used designators like .a.x to initialize
sub-members of members, and didn't then initialize all of them the
required zero-initialization of the other sub-members wasn't done.
The fix also enables tiny code cleanups.

5 months agoFix unsigned enum bit-fields
Michael Matz [Fri, 5 May 2017 21:16:43 +0000 (5 23:16 +0200)]
Fix unsigned enum bit-fields

See testcase.  If an enum has only positive values, fits N bits,
and is placed in a N-bit bit-field that bit-fields must be treated
as unsigned, not signed.

5 months agoFix segfault with invalid function def
Michael Matz [Fri, 5 May 2017 20:01:02 +0000 (5 22:01 +0200)]
Fix segfault with invalid function def

This invalid function definition:
  int f()[] {}
was tried to be handled but there was no testcase if it actually worked.
This fixes it and adds a TCC only testcase.

5 months agoRebuild cross compilers when sources change
Michael Matz [Mon, 1 May 2017 23:39:01 +0000 (2 01:39 +0200)]
Rebuild cross compilers when sources change

ONE_SOURCE=yes cross-compilers currently only depend on tcc.c, which
itself has no further deps.  So e.g. changing tccgen.c or tcctok.h
don't automatically rebuild cross compilers.  Let's go over
the intermediate $(X)tcc.o file which automatically depends on
LIBTCC_INC, which are all relevant source files.

5 months agoTidy decl_designator
Michael Matz [Sat, 15 Apr 2017 18:07:26 +0000 (15 20:07 +0200)]
Tidy decl_designator

Removing the need for the notfirst local variable, and tidy loop structure
and error messaging a bit.

5 months agoRemove label_or_decl
Michael Matz [Sat, 15 Apr 2017 18:05:39 +0000 (15 20:05 +0200)]
Remove label_or_decl

The only use of this function can be rewritten in terms of
is_label (if one other use of that one are a bit amended).

5 months agoCleanups (float consts, sections, symbols)
Michael Matz [Sun, 12 Mar 2017 04:25:09 +0000 (12 05:25 +0100)]
Cleanups (float consts, sections, symbols)

introduce common_section (SHN_COMMON), factorize some handling
in decl_initializer_alloc, add section_add and use it to factorize
some code that allocates stuff in sections (at the same time also fixing
harmless bugs re section alignment), use init_putv to emit float consts
into .data from gv() (fixing an XXX).

5 months agoMerge func_decl_list into decl0
Michael Matz [Sat, 11 Mar 2017 01:13:59 +0000 (11 02:13 +0100)]
Merge func_decl_list into decl0

Removes some code duplication and also implements one feature:
checking for duplicate decls for old style parameters.

5 months agoTidy decl_designator
Michael Matz [Mon, 6 Mar 2017 21:38:45 +0000 (6 22:38 +0100)]
Tidy decl_designator

The fixme therein is long solved.

5 months agoTidy unary() a bit
Michael Matz [Mon, 6 Mar 2017 20:45:41 +0000 (6 21:45 +0100)]
Tidy unary() a bit

factor code a bit for transforming tokens into SValues.  This revealed
a bug in TOK_GET (see testcase), which happened to be harmless before.
So fix that as well.

5 months agoFactor some code
Michael Matz [Mon, 6 Mar 2017 20:43:48 +0000 (6 21:43 +0100)]
Factor some code

Three places that skip (and store) tokens in some fashion can
be factored a bit.