tinycc.git
11 days agofix-mixed-struct (patch by Pip Cet)mob
seyko [Thu, 14 May 2015 04:32:24 +0000 (14 07:32 +0300)]
fix-mixed-struct (patch by Pip Cet)

    Jsut for testing. It works for me (don't break anything)
    Small fixes for x86_64-gen.c in "tccpp: fix issues, add tests"
    are dropped in flavor of this patch.

    Pip Cet:

    Okay, here's a first patch that fixes the problem (but I've found
    another bug, yet unfixed, in the process), though it's not
    particularly pretty code (I tried hard to keep the changes to the
    minimum necessary). If we decide to actually get rid of VT_QLONG and
    VT_QFLOAT (please, can we?), there are some further simplifications in
    tccgen.c that might offset some of the cost of this patch.

    The idea is that an integer is no longer enough to describe how an
    argument is stored in registers. There are a number of possibilities
    (none, integer register, two integer registers, float register, two
    float registers, integer register plus float register, float register
    plus integer register), and instead of enumerating them I've
    introduced a RegArgs type that stores the offsets for each of our
    registers (for the other architectures, it's simply an int specifying
    the number of registers). If someone strongly prefers an enum, we
    could do that instead, but I believe this is a place where keeping
    things general is worth it, because this way it should be doable to
    add SSE or AVX support.

    There is one line in the patch that looks suspicious:

             } else {
                 addr = (addr + align - 1) & -align;
                 param_addr = addr;
                 addr += size;
    -            sse_param_index += reg_count;
             }
             break;

    However, this actually fixes one half of a bug we have when calling a
    function with eight double arguments "interrupted" by a two-double
    structure after the seventh double argument:

    f(double,double,double,double,double,double,double,struct { double
    x,y; },double);

    In this case, the last argument should be passed in %xmm7. This patch
    fixes the problem in gfunc_prolog, but not the corresponding problem
    in gfunc_call, which I'll try tackling next.

11 days agowin32/include/winapi changes from https://github.com/run4flat/tinycc.git
seyko [Wed, 13 May 2015 22:27:46 +0000 (14 01:27 +0300)]
win32/include/winapi changes from https://github.com/run4flat/tinycc.git

        just for testing. Is it needed? I'm not a MSYS citizen.

        run4flat is a tcc fork by David Mertens that knows how to work with
        multiple symbol tables. Excelent work. A good descriptions of the
        tcc internals inside a code comments.

11 days agoredo of the -dD option
seyko [Wed, 13 May 2015 09:16:00 +0000 (13 12:16 +0300)]
redo of the -dD option

    functionality was broken some time ago and was removed
    by the "tccpp: fix issues, add tests"

    fix: LINE_MACRO_OUTPUT_FORMAT_NONE in pp_line()
    means: output '\n' and not "don't output at all"

12 days agosome -bench fixes
seyko [Tue, 12 May 2015 19:02:51 +0000 (12 22:02 +0300)]
some -bench fixes

    print stats to stderr, not to stdout

12 days agominor pp optimizations
seyko [Tue, 12 May 2015 18:32:32 +0000 (12 21:32 +0300)]
minor pp optimizations

    * remove free_defines() from tcc_preprocess()
        all cleanup will be done in tcc_delete
    * move a preprocessor file closing to tcc_delete too

12 days agorestore a max memory usage printing for a new MEM_DEBUG when -bench
seyko [Tue, 12 May 2015 13:07:09 +0000 (12 16:07 +0300)]
restore a max memory usage printing for a new MEM_DEBUG when -bench

12 days agoSYMBOL_NAME_LABEL(X) X##:
seyko [Tue, 12 May 2015 12:24:41 +0000 (12 15:24 +0300)]
SYMBOL_NAME_LABEL(X) X##:

    In the linux kernel sources:
      #ifdef __STDC__
        #define SYMBOL_NAME_LABEL(X) X##:
      #else
        #define SYMBOL_NAME_LABEL(X) X/**/:
      #endif
    tcc is a STDC compiler and must handle 'X##:' case.

12 days agoa new version of the MEM_DEBUG
seyko [Tue, 12 May 2015 08:56:39 +0000 (12 11:56 +0300)]
a new version of the MEM_DEBUG

12 days agoa mem leak fix for "ability to compile multiple *.c files with -c switch"
seyko [Tue, 12 May 2015 07:58:04 +0000 (12 10:58 +0300)]
a mem leak fix for "ability to compile multiple *.c files with -c switch"

    A new version of the MEM_DEBUG will be submitted next. This version is
    not depend on the malloc_usable_size() presense in the libc and
    print a places where a leaked chunks of memory was allocated.

13 days agoallow to use MEM_DEBUG with libtcc
seyko [Mon, 11 May 2015 15:05:31 +0000 (11 18:05 +0300)]
allow to use MEM_DEBUG with libtcc

2 weeks agotcc_add_dll is not used if TCC_TARGET_PE
seyko [Sun, 10 May 2015 08:37:36 +0000 (10 11:37 +0300)]
tcc_add_dll is not used if TCC_TARGET_PE

    after "tccpp: fix issues, add tests"

2 weeks agodefine __OPTIMIZE__ if -ON (N != 0)
seyko [Sun, 10 May 2015 07:21:37 +0000 (10 10:21 +0300)]
define __OPTIMIZE__ if -ON (N != 0)

    this is gcc behaviour

2 weeks agowarn if multile -o option is given
seyko [Sun, 10 May 2015 07:13:35 +0000 (10 10:13 +0300)]
warn if multile -o option is given

2 weeks agorestore "./configure --enable-tcc32-mingw" on linux
seyko [Sun, 10 May 2015 06:57:11 +0000 (10 09:57 +0300)]
restore "./configure --enable-tcc32-mingw" on linux

    commit "tccpp: fix issues, add tests" also include
        - configure/Makefile : build on windows (MSYS) was broken
    which breaks a cross compilation on linux

2 weeks agotccpp: fix issues, add tests
grischka [Sat, 9 May 2015 12:29:39 +0000 (9 14:29 +0200)]
tccpp: fix issues, add tests

* fix some macro expansion issues
* add some pp tests in tests/pp
* improved tcc -E output for better diff'ability
* remove -dD feature (quirky code, exotic feature,
  didn't work well)

Based partially on ideas / researches from PipCet

Some issues remain with VA_ARGS macros (if used in a
rather tricky way).

Also, to keep it simple, the pp doesn't automtically
add any extra spaces to separate tokens which otherwise
would form wrong tokens if re-read from tcc -E output
(such as '+' '=')  GCC does that, other compilers don't.

 * cleanups
  - #line 01 "file" / # 01 "file" processing
  - #pragma comment(lib,"foo")
  - tcc -E: forward some pragmas to output (pack, comment(lib))
  - fix macro parameter list parsing mess from
    a3fc54345949535524d01319e1ca6378b7c2c201
    a715d7143d9d17da17e67fec6af1c01409a71a31
    (some coffee might help, next time ;)
  - introduce TOK_PPSTR - to have character constants as
    written in the file (similar to TOK_PPNUM)
  - allow '\' appear in macros
  - new functions begin/end_macro to:
      - fix switching macro levels during expansion
      - allow unget_tok to unget more than one tok
  - slight speedup by using bitflags in isidnum_table

Also:
  - x86_64.c : fix decl after statements
  - i386-gen,c : fix a vstack leak with VLA on windows
  - configure/Makefile : build on windows (MSYS) was broken
  - tcc_warning: fflush stderr to keep output order (win32)

3 weeks agoVLA code: minor fix
Philip [Mon, 4 May 2015 03:42:02 +0000 (4 03:42 +0000)]
VLA code: minor fix

Don't try to call get_flags() on the mob branch, where it's not defined.

3 weeks agoVLA code minor fix
seyko [Mon, 4 May 2015 01:19:24 +0000 (4 04:19 +0300)]
VLA code minor fix

3 weeks agoa lot simpler VLA code
seyko [Mon, 4 May 2015 01:09:05 +0000 (4 04:09 +0300)]
a lot simpler VLA code

    Author: Philip <pipcet@gmail.com>
    Our VLA code can be made a lot simpler (simple enough for
    even me to understand it) by giving up on the optimization idea, which
    is very tempting. There's a patch to do that attached, feel free to
    test and commit it if you like. (It passes all the tests, at least

3 weeks ago-traditional and -iwithprefix options
seyko [Sun, 3 May 2015 17:10:57 +0000 (3 20:10 +0300)]
-traditional and -iwithprefix options

3 weeks agofix "tcc test.c -Wl,,--oformat,binary"
seyko [Sun, 3 May 2015 11:17:18 +0000 (3 14:17 +0300)]
fix "tcc test.c -Wl,,--oformat,binary"

    set linker options only when "s->output_type == TCC_OUTPUT_EXE"
    otherwise tcc will produce a wrong object file

3 weeks agofix "tcc test.c -UAAA -UBBB"
seyko [Sun, 3 May 2015 10:58:27 +0000 (3 13:58 +0300)]
fix "tcc test.c -UAAA -UBBB"

    no need to call tcc_free() inside tcc_undefine_symbol()
    Otherwise we get segmentation fault inside tcc_delete()

3 weeks agoMostly revert "tccpp.c: minor fix I'd accidentally not committed"
Philip [Sat, 2 May 2015 20:30:07 +0000 (2 20:30 +0000)]
Mostly revert "tccpp.c: minor fix I'd accidentally not committed"

This reverts commit 27ec4f67a33a354c8f377dd4a5b42491c2b43beb.

Sorry about that, I included changes which are still being tested, by
accident.

3 weeks agotccpp.c: minor fix I'd accidentally not committed
Philip [Sat, 2 May 2015 17:14:07 +0000 (2 17:14 +0000)]
tccpp.c: minor fix I'd accidentally not committed

Sorry about that. This should definitely fix Sergey's issue.

3 weeks agominor fix
Philip [Sat, 2 May 2015 16:49:12 +0000 (2 16:49 +0000)]
minor fix

Fixes the issue reported by Sergey at
http://lists.nongnu.org/archive/html/tinycc-devel/2015-05/msg00007.html

I hope.

3 weeks agotccpp.c: unterminated macro argument error message
Philip [Sat, 2 May 2015 14:47:11 +0000 (2 14:47 +0000)]
tccpp.c: unterminated macro argument error message

    #define a(x) x
    a((

would produce "error: , expected" when what's actually expected is a
')'.

3 weeks agotccpp.c: fix GNU comma handling
Philip [Sat, 2 May 2015 14:27:49 +0000 (2 14:27 +0000)]
tccpp.c: fix GNU comma handling

This requires moving TOK_PLCHLDR handling, but the new logic should make
things easier even if (when?) GNU comma handling is removed.

(Somewhat confusingly, GCC no longer supports GNU commas. See
http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html for a description
of past and current GCC behaviour.)

3 weeks agotccpp.c: restore whitespace after failed macro
Philip [Sat, 2 May 2015 13:55:42 +0000 (2 13:55 +0000)]
tccpp.c: restore whitespace after failed macro

This fixes test7 described in:

http://lists.nongnu.org/archive/html/tinycc-devel/2015-05/msg00002.html

Note that the current code still adds excessive forced blank characters
to its output, so this patch might not change visible behaviour.

3 weeks agotccpp.c: correct # stringification
Philip [Sat, 2 May 2015 13:19:14 +0000 (2 13:19 +0000)]
tccpp.c: correct # stringification

Fix handling of escape characters, spaces, and line feeds in macros or
macro arguments that might yet be subject to # stringification.

Should this be an -f option? I think memory usage increases only very
slightly (in particular, while line feeds, stray \s, and spaces are
preserved, comments are not), so it's probably not worth it to make it
one.

Note that macro_subst now checks for stray \s which are still left in
the input stream after macro substitution, if desired.

This patch depends on the previous patch, so if you revert that, please
revert this patch, too.

See http://lists.nongnu.org/archive/html/tinycc-devel/2015-05/msg00002.html

3 weeks agotccpp.c: parse flag to accept stray \
Philip [Sat, 2 May 2015 12:58:37 +0000 (2 12:58 +0000)]
tccpp.c: parse flag to accept stray \

This adds a PARSE_FLAG_ACCEPT_STRAYS parse flag to accept stray
backslashes in the source code, and uses it for pure preprocessing.

For absolutely correct behaviour of # stringification, we need to use
this flag when parsing macro definitions and in macro arguments, as
well; this patch does not yet do so. The test case for that is something
like

    #define STRINGIFY2(x) #x
    #define STRINGIFY(x) STRINGIFY2(x)

    STRINGIFY(\n)

which should produce "\n", not a parse error or "\\n".

See http://lists.nongnu.org/archive/html/tinycc-devel/2015-05/msg00002.html

3 weeks agotccpp.c: fix endless loop
Philip [Sat, 2 May 2015 12:33:45 +0000 (2 12:33 +0000)]
tccpp.c: fix endless loop

Perhaps a better fix would be to ensure tok is set to TOK_EOF rather
than 0 at the end of a macro stream.

This partially fixes test2 of the examples given in:
http://lists.nongnu.org/archive/html/tinycc-devel/2015-05/msg00002.html

It's still failing, but at least it's not running out of memory now.

3 weeks agotccpp.c: reset spc after macro_subst_tok()
Philip [Sat, 2 May 2015 12:26:10 +0000 (2 12:26 +0000)]
tccpp.c: reset spc after macro_subst_tok()

This bug doesn't seem to affect anything currently, but does interfere
with miscellaneous tccpp.c fixes for the test cases described here:

http://lists.nongnu.org/archive/html/tinycc-devel/2015-05/msg00002.html

3 weeks agotccpp.c: fix ##-in-macros logic
Philip [Sat, 2 May 2015 12:14:14 +0000 (2 12:14 +0000)]
tccpp.c: fix ##-in-macros logic

The old code had an inverted condition, so

    #define a(b)## b

would be accepted while

    #define a(b,c) b ## ## c

would be rejected with the confusing error message "'##' invalid at
start of macro".

3 weeks agotccpp.c: fix empty stringify
Philip [Fri, 1 May 2015 14:48:25 +0000 (1 14:48 +0000)]
tccpp.c: fix empty stringify

    #define STRINGIFY2(x) #x
    #define STRINGIFY(x) STRINGIFY2(x)
    STRINGIFY()

should produce "", not "\301".

3 weeks agofix a potential end-of-buffer issue in tccelf.c
Philip [Thu, 30 Apr 2015 21:31:32 +0000 (30 21:31 +0000)]
fix a potential end-of-buffer issue in tccelf.c

also read characters one at a time when PARSE_DEBUG is set; after this
patch, things seem to work with that.

3 weeks agofix end-of-buffer error in tccpp.c
Philip [Thu, 30 Apr 2015 19:07:44 +0000 (30 19:07 +0000)]
fix end-of-buffer error in tccpp.c

Quick fix for
http://lists.nongnu.org/archive/html/tinycc-devel/2015-04/msg00160.html.

I don't fully understand the intended semantics of when file->buf_ptr[0]
is valid, but the rest of the code doesn't have any obvious spots with
the same bug.

Feel free to revert this if I'm mistaken or we need to discuss this
change further.

3 weeks agofix vstack leak
Philip [Wed, 29 Apr 2015 21:32:14 +0000 (29 21:32 +0000)]
fix vstack leak

I think this code only affects the ARM EABI target, and only when
returning small structures that might be unaligned. However, it was both
leaking vstack entries and failing to achieve what I think is its
purpose, to ensure the sret argument would be aligned properly. Both
issues fixed.

3 weeks agoVLA fix: save stack pointer right after modification
Philip [Tue, 28 Apr 2015 09:23:29 +0000 (28 09:23 +0000)]
VLA fix: save stack pointer right after modification

This patch disables the optimization of saving stack pointers lazily,
which didn't fully take into account that control flow might not reach
the stack-saving instructions. I've decided to leave in the extra calls
to vla_sp_save() in case anyone wants to restore this optimization.

Tests added and enabled.

There are two remaining bugs: VLA variables can be modified, and jumping
into the scope of a declared VLA will cause a segfault rather than a
compiler error. Both of these do not affect correct C code, but should
be fixed at some point. Once VLA variables have been made properly
immutable, we can share them with the saved stack pointer and save stack
and instructions.

3 weeks agofix VLA/continue issue
Philip [Mon, 27 Apr 2015 16:38:27 +0000 (27 16:38 +0000)]
fix VLA/continue issue

as reported in
http://lists.nongnu.org/archive/html/tinycc-devel/2015-04/msg00131.html. Note
that this is one of two separate VLA bugs:

 A. labels aren't reached by program execution, so the stack pointer is
 never saved
 B. continue doesn't restore the stack pointer as goto does

This fixes only B. I'm not sure whether the same issue applies to break
as well as continue.

Add a test case, but disable tests #78 and #79 for now as they're not
fully fixed until the issue described in
http://lists.nongnu.org/archive/html/tinycc-devel/2015-04/msg00110.html
is resolved.

3 weeks agoadd test case for VLA segfaults
Philip [Mon, 27 Apr 2015 14:41:57 +0000 (27 14:41 +0000)]
add test case for VLA segfaults

This test obviously shouldn't segfault, but currently does so. The
problem is in the VLA code, which fails to save the stack pointer before
taking a conditional branch in some cases.

See this thread:
http://lists.nongnu.org/archive/html/tinycc-devel/2015-04/msg00130.html

3 weeks agoreplace PARSE_FLAG_ASM_COMMENTS with PARSE_FLAG_ASM_FILE
seyko [Mon, 27 Apr 2015 13:36:58 +0000 (27 16:36 +0300)]
replace PARSE_FLAG_ASM_COMMENTS with PARSE_FLAG_ASM_FILE

    after "assign PARSE_FLAG_ASM_COMMENTS only for asm files"
    functions of this flags are identical

3 weeks agowarn about declarations after statements when compiling with gcc.
Philip [Mon, 27 Apr 2015 13:28:03 +0000 (27 13:28 +0000)]
warn about declarations after statements when compiling with gcc.

3 weeks agofixes for "tcc -E -dD"
seyko [Mon, 27 Apr 2015 13:04:54 +0000 (27 16:04 +0300)]
fixes for "tcc -E -dD"

    * print "// #pragma push_macro(XXX)"
    * keep output line numbers in sync with source
      (don't output \n in printf)

3 weeks agopreprocess: "assign PARSE_FLAG_ASM_COMMENTS only for asm files"
seyko [Mon, 27 Apr 2015 12:25:49 +0000 (27 15:25 +0300)]
preprocess: "assign PARSE_FLAG_ASM_COMMENTS only for asm files"

    resolve a problem with the following test.c program, tcc -E test.c

    #ifdef _XOPEN_SOURCE
    # define __USE_XOPEN 1
    # if (_XOPEN_SOURCE - 0) >= 500
    #  define __USE_XOPEN_EXTENDED 1
    #  define __USE_UNIX98 1
    #  undef _LARGEFILE_SOURCE
    #  define _LARGEFILE_SOURCE 1
    #  if (_XOPEN_SOURCE - 0) >= 600
    #   define __USE_XOPEN2K 1
    #   undef __USE_ISOC99
    #   define __USE_ISOC99 1
    #  endif
    # else
    #  ifdef _XOPEN_SOURCE_EXTENDED
    #   define __USE_XOPEN_EXTENDED 1
    #  endif
    # endif
    #endif

    int main() {}

    // # 17 "aaa.c"
    // aaa.c:17: error: #endif without matching #if

4 weeks agofix another x86_64 ABI bug
Philip [Sun, 26 Apr 2015 17:31:39 +0000 (26 17:31 +0000)]
fix another x86_64 ABI bug

The old code assumed that if an argument doesn't fit into the available
registers, none of the subsequent arguments do, either. But that's
wrong: passing 7 doubles, then a two-double struct, then another double
should generate code that passes the 9th argument in the 8th register
and the two-double struct on the stack. We now do so.

However, this patch does not yet fix the function calling code to do the
right thing in the same case.

4 weeks agoFix zero-length struct/union test. Remove nonsensical test.
Philip [Sat, 25 Apr 2015 19:17:37 +0000 (25 19:17 +0000)]
Fix zero-length struct/union test. Remove nonsensical test.

The comment suggests this was meant to detect unions, but in fact it
compared f->c, the union/struct size, against f->next->c, the first
element's offset.

This affected only zero-length structs/unions with a first (zero-length)
element, as in this code:

    struct u2 {
    };

    struct u {
      struct u2 u2;
    } u;

    struct u f(struct u x)
    {
      return x;
    }

However, such structures turned out to be broken anyway, as code like this
was generated for the above f:

0000000000000000 <f>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 81 ec 10 00 00 00    sub    $0x10,%rsp
   b:   66 0f d6 45 f8          movq   %xmm0,-0x8(%rbp)
  10:   66 0f 6e 45 f8          movd   -0x8(%rbp),%xmm0
  15:   e9 00 00 00 00          jmpq   1a <f+0x1a>
  1a:   c9                      leaveq
  1b:   c3                      retq

4 weeks agox86_64 ABI tests, which currently cause failures
Philip [Sat, 25 Apr 2015 10:49:55 +0000 (25 10:49 +0000)]
x86_64 ABI tests, which currently cause failures

With the x86_64 Linux ELF ABI, we're currently failing two of these
three tests, which have been disabled for now.  The problem is mixed
structures such as struct { double x; char c; }, which the x86_64 ABI
specifies are to be passed/returned in one integer register and one SSE
register; our current approach, marking the structure as VT_QLONG or
VT_QFLOAT, fails in this case.

(It's possible to fix this by getting rid of VT_QLONG and VT_QFLOAT
entirely as at https://github.com/pipcet/tinycc, but the changes aren't
properly isolated at present. Anyway, there might be a less disruptive
fix.)

4 weeks agoa test for the #pragma push/pop_macro
seyko [Sat, 25 Apr 2015 12:03:50 +0000 (25 15:03 +0300)]
a test for the #pragma push/pop_macro

4 weeks agotccpp: alternative #pragma push/pop_macro
grischka [Thu, 23 Apr 2015 21:27:36 +0000 (23 23:27 +0200)]
tccpp: alternative #pragma push/pop_macro

using next_nomacro() so that for example
    #define push_macro foobar
does not affect how the pragma works (same behavior
as gcc, albeit not MS's cl).

4 weeks agoRevert "* and #pragma pop_macro("macro_name")"
grischka [Thu, 23 Apr 2015 21:26:46 +0000 (23 23:26 +0200)]
Revert "* and #pragma pop_macro("macro_name")"

- pop_macro incorrect with initially undefined macro
- horrible implementation (tcc_open_bf)
- crashes eventually (abuse of Sym->prev_tok)

- the (unrelated) asm_label part is the opposite of a fix
  (Despite of its name this variable has nothing to do with
  the built-in assembler)

This reverts commit 0c8447db7970813292a8be74ee50e49091be5d15.

4 weeks agofix a subtle x86-64 calling bug
Philip [Thu, 23 Apr 2015 18:08:28 +0000 (23 18:08 +0000)]
fix a subtle x86-64 calling bug

I ran into an issue playing with tinycc, and tracked it down to a rather
weird assumption in the function calling code. This breaks only when
varargs and float/double arguments are combined, I think, and only when
calling GCC-generated (or non-TinyCC, at least) code. The problem is we
sometimes generate code like this:

804a468: 4c 89 d9 mov %r11,%rcx
804a46b: b8 01 00 00 00 mov $0x1,%eax
804a470: 48 8b 45 c0 mov -0x40(%rbp),%rax
804a474: 4c 8b 18 mov (%rax),%r11
804a477: 41 ff d3 callq *%r11

for a function call. Note how $eax is first set to the correct value,
then clobbered when we try to load the function pointer into R11. With
the patch, the code generated is:

804a468: 4c 89 d9 mov %r11,%rcx
804a46b: b8 01 00 00 00 mov $0x1,%eax
804a470: 4c 8b 5d c0 mov -0x40(%rbp),%r11
804a474: 4d 8b 1b mov (%r11),%r11
804a477: 41 ff d3 callq *%r11

which is correct.

This becomes an issue when get_reg(RC_INT) is modified not always to
return %rax after a save_regs(0), because then another register (%ecx,
say) is clobbered, and the function passed an invalid argument.

A rather convoluted test case that generates the above code is
included. Please note that the test will not cause a failure because
TinyCC code ignores the %rax argument, but it will cause incorrect
behavior when combined with GCC code, which might wrongly fail to save
XMM registers and cause data corruption.

4 weeks agoBugfix: 32-bit vs 64-bit bug in x86_64-gen.c:gcall_or_jmp
Philip [Thu, 23 Apr 2015 17:30:16 +0000 (23 17:30 +0000)]
Bugfix: 32-bit vs 64-bit bug in x86_64-gen.c:gcall_or_jmp

Verify an immediate value fits into 32 bits before jumping to it/calling
it with a 32-bit immediate operand. Without this fix, code along the
lines of

  ((int (*)(const char *, ...))140244834372944LL)("hi\n");

will fail mysteriously, even if that decimal constant is the correct
address for printf.

See https://github.com/pipcet/tinycc/tree/bugfix-1

4 weeks ago"#pragma once" implementation
seyko [Tue, 21 Apr 2015 12:46:29 +0000 (21 15:46 +0300)]
"#pragma once" implementation

4 weeks ago * and #pragma pop_macro("macro_name")
seyko [Tue, 21 Apr 2015 03:34:35 +0000 (21 06:34 +0300)]
* and #pragma pop_macro("macro_name")
    * give warning if pragma is unknown for tcc
    * don't free asm_label in sym_free(),
      it's a job of the asm_free_labels().

    The above pragmas are used in the mingw headers.
    Thise pragmas are implemented in gcc-4.5+ and current
    clang.

4 weeks agoadd missing test from -fdollar-in-identifiers commit
Ramsay Jones [Mon, 20 Apr 2015 11:02:57 +0000 (20 12:02 +0100)]
add missing test from -fdollar-in-identifiers commit

Commit 5ce2154c ("-fdollar-in-identifiers addon", 20-04-2015) forgot
to include the test files from Daniel's patch.

Signed-off-by: Ramsay Jones <ramsay@ramsay1.demon.co.uk>
5 weeks ago-fdollar-in-identifiers addon
seyko [Mon, 20 Apr 2015 00:44:08 +0000 (20 03:44 +0300)]
-fdollar-in-identifiers addon

    * disable a -fdollar-in-identifiers option in assembler files
    * a test is added

    This is a patch addon from Daniel Holden.

5 weeks agoFix program symbols exported in dynsym section
Thomas Preud'homme [Sat, 18 Apr 2015 07:28:02 +0000 (18 15:28 +0800)]
Fix program symbols exported in dynsym section

Prior to this commit TinyCC was exporting symbols defined in programs
only when they resolve an undefined symbol of a library. However, the
expected behavior (see --export-dynamic in GNU ld manpage) is that all
symbols used by libraries and defined by a program should be exported in
dynsym section. This is because symbol resolution search first in
program and then in libraries, thus allowing program symbol to interpose
symbol defined in a library.

5 weeks agoclarify error message when library not found
seyko [Thu, 16 Apr 2015 04:30:24 +0000 (16 07:30 +0300)]
clarify error message when library not found

    a prior error message: cannot find 'program_resolve_lib'
    after a patch: cannot find library 'libprogram_resolve_lib'

5 weeks agoimplement #pragma comment(lib,...)
Steven G. Messervey [Thu, 16 Apr 2015 02:56:21 +0000 (15 22:56 -0400)]
implement #pragma comment(lib,...)

5 weeks agoRevert "implement #pragma comment(lib,...)"
Steven G. Messervey [Thu, 16 Apr 2015 01:24:15 +0000 (15 21:24 -0400)]
Revert "implement #pragma comment(lib,...)"

This reverts commit 8615bb40fb39bf7435462ca54cbbc24aaecae502.

Reverting as it breaks on MinGW targets

5 weeks agoimplement #pragma comment(lib,...)
Steven G. Messervey [Wed, 15 Apr 2015 21:00:26 +0000 (15 17:00 -0400)]
implement #pragma comment(lib,...)

6 weeks agoability to compile multiple *.c files with -c switch
seyko [Sun, 12 Apr 2015 12:39:48 +0000 (12 15:39 +0300)]
ability to compile multiple *.c files with -c switch

    Usage example: tcc -c -xc ex5.cgi -xn ex2.c ex7.c ex6.cgi

6 weeks agoability to specify a type of the input file with the -x switch
seyko [Sun, 12 Apr 2015 12:35:37 +0000 (12 15:35 +0300)]
ability to specify a type of the input file with the -x switch

    Usage example: tcc -xc ex5.cgi
    From a gcc docs:

    You can specify the input language explicitly with the -x option:

    -x language
    Specify explicitly the language for the following input files
    (rather than letting the compiler choose a default based on the file
    name suffix). This option applies to all following input files until
    the next -x option. Possible values for language are:

        c  c-header  c-cpp-output
        c++  c++-header  c++-cpp-output
        objective-c  objective-c-header  objective-c-cpp-output
        objective-c++ objective-c++-header objective-c++-cpp-output
        assembler  assembler-with-cpp
        ada
        f77  f77-cpp-input f95  f95-cpp-input
        java

    -x none
    Turn off any specification of a language, so that subsequent files
    are handled according to their file name suffixes (as they are if -x
    has not been used at all)

6 weeks ago-fdollar-in-identifiers switch which enables '$' in identifiers
seyko [Sun, 12 Apr 2015 12:32:03 +0000 (12 15:32 +0300)]
-fdollar-in-identifiers switch which enables '$' in identifiers

    library Cello: http://libcello.org/ which uses `$` and several
    variations of as macros.

    There is also RayLanguage which also uses it as a macro for a kind of
    ObjC style message passing: https://github.com/kojiba/RayLanguage

    This is a patch from Daniel Holden.

6 weeks agoA new file CodingStyle with rules for indentation
seyko [Sun, 12 Apr 2015 06:26:28 +0000 (12 09:26 +0300)]
A new file CodingStyle with rules for indentation

6 weeks agoreplace a method to force bcheck.o linking
seyko [Sun, 12 Apr 2015 01:47:15 +0000 (12 04:47 +0300)]
replace a method to force bcheck.o linking

    * define __bound_init as external_global_sym insteed of the compiling
      a tiny program
    * remove warning about buf[] when CONFIG_TCC_BCHECK is not defined

6 weeks agoFix for Microsoft compilers
seyko [Sat, 11 Apr 2015 13:22:34 +0000 (11 16:22 +0300)]
Fix for Microsoft compilers

    Correction for the commit db08122d31a681e593c6679140d2df0cc63c8784
    As pointed Thomas Preud'homme buf[] may be used outside of the block
    whit code:
        name = block;

6 weeks agooption to use an old algorithm of the array in struct initialization
seyko [Fri, 10 Apr 2015 20:44:10 +0000 (10 23:44 +0300)]
option to use an old algorithm of the array in struct initialization

    This is for a case when no '{' is used in the initialization code.
    An option name is -fold-struct-init-code. A linux 2.4.26 can't
    find initrd when compiled with a new algorithm.

6 weeks agofix "handle a -s option" commit
seyko [Fri, 10 Apr 2015 14:35:54 +0000 (10 17:35 +0300)]
fix "handle a -s option" commit

    for targets which don't support variable length arrays.

6 weeks agofix a preprocessor for .S
seyko [Fri, 10 Apr 2015 13:53:29 +0000 (10 16:53 +0300)]
fix a preprocessor for .S

    Lets assume that in *.S files a preprocessor directive
    follow '#' char w/o spaces between. Otherwise there is
    too many problems with the content of the comments.

6 weeks agofix a preprocessor for .S
seyko [Fri, 10 Apr 2015 13:40:30 +0000 (10 16:40 +0300)]
fix a preprocessor for .S

    A test program (tcc -E test.S):
      # .. or else we have a high. This is a test.S

6 weeks agofix a preprocessor for .S
seyko [Fri, 10 Apr 2015 13:31:12 +0000 (10 16:31 +0300)]
fix a preprocessor for .S

    * tell a right line number in error message
      if a #line directive is wrong

    * don't print an error message if we preprocess a .S file
      and #line directive is wrong. This is the case of
      the
        # 4026 bytes
      comment in *.S file.

    * preprocess_skip: skip a line with
    if (parse_flags & PARSE_FLAG_ASM_COMMENTS)
        p = parse_line_comment(p);
      if line starts with # and a preprocessor command not found.

      A test program:
      #if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
# This repeats until either a device doesn't exist, or until
      #endif

    * remove a second definition of the TOK_FLAG_* and PARSE_FLAG_*
      from the tccpp.c

6 weeks agoa bounds checking code for the ARCH=x86_64
seyko [Fri, 10 Apr 2015 12:17:22 +0000 (10 15:17 +0300)]
a bounds checking code for the ARCH=x86_64

6 weeks agoAdd a demo.bat file to the examples directory on Windows
seyko [Fri, 10 Apr 2015 04:46:04 +0000 (10 07:46 +0300)]
Add a demo.bat file to the examples directory on Windows

    And a new console demo program: taxi and passengers simulator

6 weeks agofix installation amd bcheck for Windows
seyko [Fri, 10 Apr 2015 04:37:31 +0000 (10 07:37 +0300)]
fix installation amd bcheck for Windows

    * define targetos=Windows when --enable-tcc32-mingw, --enable-cygwin, ...
    * use TARGETOS insteed HOST_OS when selecting PROGS
    * use "$(tccdir)" insteed $(tccdir) on install (spaces in path)
    * install tcc.exe too
    * produce bcheck.o when cross-compiling too (lib/Makefile)
    * force bcheck.o linking by compiling inside tcc_set_output_type()
      a dummy program with local array. Otherwise bcheck.o may be not linked.
    * replace %xz format specifier with %p in bcheck (don't supported on
      Windows)
    * call a __bound_init when __bound_ptr_add, __bound_ptr_indir,
      __bound_new_region, __bound_delete_region called.
      This is because a __bound_init inside ".init" section is not called
      on Windows for unknown reason.
    * print on stderr a message when an illegal pointer is returned:
        there is no segmentation violation on Windows for a program
        compiled with "tcc -b"
    * remove "C:" subdir on clean if $HOST_OS = "Linux"
    * default CFLAGS="-Wall -g -O0" insteed CFLAGS="-Wall -g -O2"
      to speed up compilation and more precise debugging.

6 weeks agohandle a -s option by executing sstrip/strip program
seyko [Fri, 10 Apr 2015 03:53:48 +0000 (10 06:53 +0300)]
handle a -s option by executing sstrip/strip program

6 weeks agooutput all sections if we produce an executable file
seyko [Fri, 10 Apr 2015 03:49:24 +0000 (10 06:49 +0300)]
output all sections if we produce an executable file

    tcc w/o -g option generate an executable file which format
    is not recognized by binutils. It is like stripped one but
    binutils don't think so. Solution: generate not stripped
    file which can be correctly stripped by external utils.

    may be there is a need to handle a -s option and call
    a sstrip/strip program to do a job.

6 weeks agoremove a compilation warnings for libtest and test3
seyko [Fri, 10 Apr 2015 03:44:34 +0000 (10 06:44 +0300)]
remove a compilation warnings for libtest and test3

    ------------ libtest ------------
    ./libtcc_test lib_path=..
    <string>:11: warning: implicit declaration of function 'printf'
    <string>:13: warning: implicit declaration of function 'add'
    ------------ test3 ------------
    tcctest.c:1982: warning: implicit declaration of function 'putchar'
    tcctest.c:2133: warning: implicit declaration of function 'strlen'

6 weeks agofix the bug #31403: parser bug in structure
seyko [Fri, 10 Apr 2015 03:31:58 +0000 (10 06:31 +0300)]
fix the bug #31403: parser bug in structure

    - a warning: unnamed struct/union that defines no instances
    - allow a nested named struct declaration w/o identifier
      only when option -fms-extensions is used

6 weeks agoFix to accommodate missing i386/bcheck.o during install on Mac OS X
Raphael Cohn [Tue, 7 Apr 2015 15:34:37 +0000 (7 16:34 +0100)]
Fix to accommodate missing i386/bcheck.o during install on Mac OS X

6 weeks agoFix to test for HOST_OS not TARGETOS
Raphael Cohn [Tue, 7 Apr 2015 15:06:43 +0000 (7 16:06 +0100)]
Fix to test for HOST_OS not TARGETOS

6 weeks agoFixing bug for Linux x86_64 introduced in previous macosx commit
Raphael Cohn [Tue, 7 Apr 2015 14:55:41 +0000 (7 15:55 +0100)]
Fixing bug for Linux x86_64 introduced in previous macosx commit

6 weeks agoAdjusted configure host_os to use uname for Darwin
Raphael Cohn [Tue, 7 Apr 2015 14:28:31 +0000 (7 15:28 +0100)]
Adjusted configure host_os to use uname for Darwin
Adjusted Makefile to make it Darwin (Mac OS X 10.10)-friendly for cross-compilers
by removing the creation of arm64 cross-compilers on this platform.

6 weeks agoAdjusted configure to be more BSD friendly
Raphael Cohn [Tue, 7 Apr 2015 14:18:34 +0000 (7 15:18 +0100)]
Adjusted configure to be more BSD friendly

8 weeks agoa small revers for bcheck.o changes (d80593bc4d43)
seyko [Mon, 30 Mar 2015 03:15:47 +0000 (30 06:15 +0300)]
a small revers for bcheck.o changes (d80593bc4d43)

    replacing (addr > e->size) with (addr >= e->size)
    was correct only in one place, a second replacing
    is reversed by this commit.

8 weeks agoFix for Microsoft compilers
seyko [Sun, 29 Mar 2015 08:52:16 +0000 (29 11:52 +0300)]
Fix for Microsoft compilers

    Miccrosoft Visual Sudio (Express) 2008 and 2010 do not accept variable
    definitions C99 style, reported by Fabio <oldfaber@gmail.com>

8 weeks agofix for the bcheck.o (bug #14958)
seyko [Sun, 29 Mar 2015 08:28:02 +0000 (29 11:28 +0300)]
fix for the bcheck.o (bug #14958)

    - care about __attribute__ redefinition in the system headers
    - an invalid pointer must be returned when (addr >= e->size),
      and not (addr > e->size)

    A test program:
    #include <stdio.h>
    #include <stdlib.h>
    int main ()
    {
int v[10];
fprintf(stderr, "&v[0]  = %p\n", &v[0]);
fprintf(stderr, "&v[10] = %p\n", &v[10]);
exit(1);
return 0;
    }
    // tcc -b test.c

    The output before a patch:
    &v[0]  = 0xbf929d8c
    &v[10] = 0xbf929db4

    The output after a patch:
    &v[0]  = 0xbff6e33c
    &v[10] = 0xfffffffe

8 weeks agofix: try to add a bounds.o only if __bounds_init not found
seyko [Sat, 28 Mar 2015 16:41:01 +0000 (28 19:41 +0300)]
fix: try to add a bounds.o only if __bounds_init not found

    /usr/local/lib/tcc/i386/bcheck.o: error: '__bound_error_msg' defined twice
    #include <stdio.h>
    int main ()
    {
        #if 1
         int v[10];
            v[10] = 0;
            fprintf(stderr, "is bounds error catched?\n");
        #endif
        return 0;
    }
    // tcc -b test.c

8 weeks agofix for the previous commit (compilation on RPi)
seyko [Thu, 26 Mar 2015 08:28:11 +0000 (26 11:28 +0300)]
fix for the previous commit (compilation on RPi)

8 weeks agomake a bound checking more compatible with Windows 64
seyko [Thu, 26 Mar 2015 04:47:45 +0000 (26 07:47 +0300)]
make a bound checking more compatible with Windows 64

    On Linux 32:   sizeof(long)=32 == sizeof(void *)=32
    on Linux 64:   sizeof(long)=64 == sizeof(void *)=64
    on Windows 64: sizeof(long)=32 != sizeof(void *)=64

8 weeks agofix for the previous commit: tcc_add_support() was used before definition
seyko [Thu, 26 Mar 2015 03:22:37 +0000 (26 06:22 +0300)]
fix for the previous commit: tcc_add_support() was used before definition

8 weeks agofix: enforce bcheck.o linking when -b option is used
seyko [Thu, 26 Mar 2015 03:04:36 +0000 (26 06:04 +0300)]
fix: enforce bcheck.o linking when -b option is used

    fixes a crash for the empry program (tcc -b empty.c)
    empty.c: int main() { return 0; }

8 weeks agofix a bug #43984: tcc -run reports errno=2
seyko [Wed, 25 Mar 2015 10:26:11 +0000 (25 13:26 +0300)]
fix a bug #43984: tcc -run reports errno=2

    The following program (errno.c) reports errno=2 when run
    using "tcc -run errno.c"

    #include <errno.h>
    #include <stdio.h>
    int main(void) { printf("errno=%d\n", errno); return 0; }

2 months agofix for a -dumpversion option: move it before -dD
seyko [Mon, 23 Mar 2015 17:58:27 +0000 (23 20:58 +0300)]
fix for a -dumpversion option: move it before -dD
Options must be sorted and a long one must preceed a short one.
What was before:
    tcc -dumpversion
    tcc: error: invalid option -- '-dumpversion'

2 months agofix for: x86_64-tcc compiled by i386-tcc is wrong
seyko [Mon, 23 Mar 2015 16:24:55 +0000 (23 19:24 +0300)]
fix for: x86_64-tcc compiled by i386-tcc is wrong
A test program (must be compiled by the above version of the tcc):

    /* Tickle a bug in TinyC on 64-bit systems:
     * the LSB of the top word or ARGP gets set
     * for no obvious reason.
     *
     * Source: a legacy language interpreter which
     * has a little stack / stack pointer for arguments.
     *
     * Output is: 0x8049620 0x10804961c
     * Should be: 0x8049620 0x804961c
     */
    #include <stdio.h>
    #define NARGS 20000
    int ARG[NARGS];
    int *ARGSPACE = ARG;
    int *ARGP = ARG - 1;
    main() { printf("%p %p\n", ARGSPACE, ARGP); }

2 months agofix a gcc compiler warning for the previous commit
seyko [Mon, 23 Mar 2015 13:36:09 +0000 (23 16:36 +0300)]
fix a gcc compiler warning for the previous commit
mark a constant as long long (or -std=gnu99 is needed)

2 months agorevert a commit: Work around for the issue TCC doesn't handle -2147483648 properly
seyko [Mon, 23 Mar 2015 12:31:10 +0000 (23 15:31 +0300)]
revert a commit: Work around for the issue TCC doesn't handle -2147483648 properly
because a tcc handle now -2147483648 properly. Look a commit:
    Make integer constant parsing C99 compliant

2 months agoA right fix for the array in struct initialization w/o '{'
seyko [Mon, 23 Mar 2015 05:27:16 +0000 (23 08:27 +0300)]
A right fix for the array in struct initialization w/o '{'
Parse a type if there is only one '(' before a type token.
Otherwise a recursion will perform a job.

2 months agoRevert of the commit: fix for the array in struct initialization w/o '{', case 2
seyko [Mon, 23 Mar 2015 04:40:41 +0000 (23 07:40 +0300)]
Revert of the commit: fix for the array in struct initialization w/o '{', case 2
A right solution for this problem will follow.

2 months agoquick fix for the native tcc on debian/ubuntu
seyko [Sun, 22 Mar 2015 15:05:29 +0000 (22 18:05 +0300)]
quick fix for the native tcc on debian/ubuntu

    Force to use a NATIVE_DEFINES insteed of the DEFINES for the
    native tcc. After this change we have on debian/ubuntu

    # ./x86_64-tcc -vv
    tcc version 0.9.26 (x86-64, Linux)
    install: /usr/local/lib/tcc
    crt:
      /usr/lib/x86_64-linux-gnu
    libraries:
      /usr/lib/x86_64-linux-gnu
      /usr/lib
      /lib/x86_64-linux-gnu
      /lib
      /usr/local/lib/x86_64-linux-gnu
      /usr/local/lib
    include:
      /usr/local/include/x86_64-linux-gnu
      /usr/local/include
      /usr/include/x86_64-linux-gnu
      /usr/include
      /usr/local/lib/tcc/include
    elfinterp:
      /lib64/ld-linux-x86-64.so.2

    Before this change the output was
    # ./x86_64-tcc -vv
    tcc version 0.9.26 (x86-64, Linux)
    install: /usr/local/lib/tcc
    crt:
      /usr/lib
    libraries:
      /usr/lib
      /lib
      /usr/local/lib
    include:
      /usr/local/include
      /usr/include
      /usr/local/lib/tcc/include
    elfinterp:
      /lib64/ld-linux-x86-64.so.2

    This change don't fix a cross compilers

2 months agoconfigure: don't output CONFIG_LDDIR when build_cross = "yes"
seyko [Sat, 21 Mar 2015 04:16:33 +0000 (21 07:16 +0300)]
configure: don't output CONFIG_LDDIR when build_cross = "yes"

This fixes i386-tcc on CentOS 7. After patch
    [root@centos7 tinycc]# ./i386-tcc -vv
    tcc version 0.9.26 (i386, Linux)
    install: /usr/local/lib/tcc
    crt:
      /usr/lib
    libraries:
      /usr/lib
      /lib
      /usr/local/lib

Before patch:
    [root@centos7 tinycc]# ./i386-tcc -vv
    tcc version 0.9.26 (i386, Linux)
    install: /usr/local/lib/tcc
    crt:
      /usr/lib64
    libraries:
      /usr/lib64
      /lib64
      /usr/local/lib64