aboutsummaryrefslogtreecommitdiff
path: root/tccgen.c
Commit message (Collapse)AuthorAgeFilesLines
* 64bit: Fix addends > 32 bitsMichael Matz2016-12-151-1/+6
| | | | | | If a symbolic reference is offsetted by a constant > 32bit the backends can't deal with that, so don't construct such values.
* Fix initializing members multiple timesMichael Matz2016-12-151-0/+11
| | | | | | | When intializing members where the initializer needs relocations and the member is initialized multiple times we can't allow that to lead to multiple relocations to the same place. The last one must win.
* Support local register variablesMichael Matz2016-12-151-3/+17
| | | | | | | | | Similar to GCC a local asm register variable enforces the use of a specified register in asm operands (and doesn't otherwise matter). Works only if the variable is directly mentioned as operand. For that we now generally store a backpointer from an SValue to a Sym when the SValue was the result of unary() parsing a symbol identifier.
* Fix const folding of 64bit pointer constantsMichael Matz2016-12-151-2/+2
| | | | See testcase.
* struct-init: Copy relocs for compound literalsMichael Matz2016-12-151-0/+26
| | | | | When copying the content of compound literals we must include relocations as well.
* opt: Don't emit inline functions from dead codeMichael Matz2016-12-151-1/+1
| | | | | Inside dead code don't regard inline functions as being referenced.
* opt: constprop also 'cond && 0'Michael Matz2016-12-151-62/+74
| | | | | | We didn't handle constants in logical expressions when they weren't the first operand. Some reordering in the loop structure is enough to handle them.
* opt: Make break and goto not fallthroughMichael Matz2016-12-151-2/+17
| | | | | As we can optimize dead code a bit already it's fitting to disable code emission after break and goto.
* opt: Start optimizing dead code a bitMichael Matz2016-12-151-2/+15
| | | | | | | If a condition is always zero/non-zero we can omit the then or else code. This is complicated a bit by having to deal with labels that might make such code reachable without us yet knowing during parsing.
* Revert "Reject jumping inside stmtexprs"Michael Matz2016-12-151-7/+1
| | | | | | | | | | | | | Not fully thought out. You can't jump inside stmt exprs, but you can jump out of them. So there's a difference between undefined but declared labels at the end of stmt exprs and those defined inside. Additionally it should also be checked if a label defined inside a stmt expr was tentatively created as declared from outside. I'm not prepared doing that right now, so simply revert. This reverts commit 9160e4cab9147d77840cc44a285031fdb4640cf9.
* Factor out const condition detectionMichael Matz2016-12-151-10/+22
| | | | Creating condition_3way for this.
* Reject jumping inside stmtexprsMichael Matz2016-12-151-1/+7
| | | | | | | | | | | | One can't jump into statement expressions from outside them, like the following: int i = ({ label: foo(); 42; }); goto label; We reject this by making the labels simply not available outside (GCC has a nicer error message about jumping into a statement expression).
* Fix more nocode_wanted jump problemsMichael Matz2016-12-151-4/+10
| | | | | | | In statement expression we really mustn't emit backward jumps under nocode_wanted (they will form infinte loops as no expressions are evaluated). Do-while and explicit loop with gotos weren't handled.
* Fix aliases on 64 bitMichael Matz2016-12-151-2/+2
| | | | Use correct width ELF structure.
* Fix sizeof(char[a])Michael Matz2016-12-151-12/+15
| | | | | The sizes of VLAs need to be evaluated even inside sizeof, i.e. when nocode_wanted is set.
* Fix __builtin_constant_p(1000/x)Michael Matz2016-12-151-0/+17
| | | | | was incorrectly treated as constant because the vpop removed all traces of non-constness.
* Fix enum bitfields passed to stdarg functionsMichael Matz2016-12-151-0/+1
| | | | | VT_ENUM types use the .ref member and can be VT_BITFIELD, so we need to copy it as well. Simply do it always.
* Addresses of non-weak symbols are non-zeroMichael Matz2016-12-151-1/+3
| | | | Use this fact in some foldings of comparisons. See testcase.
* Fix access-after-free with statement expressionsMichael Matz2016-12-151-26/+27
| | | | | | | | | | | | The return value of statement expressions might refer to local symbols, so those can't be popped. The old error message always was just a band-aid, and since disabling it for pointer types it wasn't effective anyway. It also never considered that also the vtop->sym member might have referred to such symbols (see the testcase with the local static, that used to segfault). For fixing this (can be seen better with valgrind and SYM_DEBUG) simply leave local symbols of stmt exprs on the stack.
* enums and ints are compatibleMichael Matz2016-12-151-11/+31
| | | | | | | But like GCC do warn about changes in signedness. The latter leads to some changes in gen_assign_cast to not also warn about unsigned* = int* (where GCC warns, but only with extra warnings).
* enums and ints are compatibleMichael Matz2016-12-151-0/+8
|
* struct-init: Support range inits for local varsMichael Matz2016-12-151-17/+28
| | | | Implement missing support for range init for local variables.
* struct-init: Allow member initialization from qualified lvaluesMichael Matz2016-12-151-1/+4
| | | | See testcase.
* struct-init: Correctly parse unnamed member initializersMichael Matz2016-12-151-21/+51
| | | | | | | | | | | | | For union U { struct {int a,b}; int c; }; union U u = {{ 1, 2, }}; The unnamed first member of union U needs to actually exist in the structure so initializer parsing isn't confused about the double braces. That means also the a and b members must be part of _that_, not of union U directly. Which in turn means we need to do a bit more work for field lookup. See the testcase extension for more things that need to work.
* struct-init: Cleanup some moreMichael Matz2016-12-151-98/+103
| | | | | Some parameters aren't actually necessary. Also join the two parsing loops for the initializer list of arrays and structs.
* struct-init: CleanupMichael Matz2016-12-151-102/+12
| | | | | | | Remove dead code and variables. Properly check for unions when skipping fields in initializers. Make tests2/*.expect depend on the .c files so they are automatically rebuilt when the latter change.
* struct-init: Implement initializing subaggregatesMichael Matz2016-12-151-39/+59
| | | | | | E.g. "struct { struct S s; int a;} = { others, 42 };" if 'others' is also a 'struct S'. Also when the value is a compound literal. See added testcases.
* struct-init: ReimplementMichael Matz2016-12-151-78/+106
| | | | | | Start reimplementing the whole initializer handling to be conforming to ISO C. This patch just reimplements current functionality to prepare for further changes, all tests pass.
* Support attribute between double pointer starsMichael Matz2016-12-151-4/+5
| | | | "int * __attribute__((something)) *" is supported by GCC.
* Fix function to pointer conversionMichael Matz2016-12-151-0/+13
| | | | | | | | This snippet is valid: void foo(void); ... foo + 42 ... the function designator is converted to pointer to function implicitely. gen_op didn't do that and bailed out.
* Fix parsing array typedefs of unknown sizeMichael Matz2016-12-151-0/+8
| | | | | | | | | | | This must compile: typedef int arrtype1[]; arrtype1 sinit19 = {1}; arrtype1 sinit20 = {2,3}; and generate two arrays of one resp. two elements. Before the fix the determined size of the first array was encoded in the type directly, so sinit20 couldn't be parsed anymore (because arrtype1 was thought to be only one element long).
* Implement __builtin_choose_exprMichael Matz2016-12-151-0/+29
| | | | Follows GCC implementation.
* Fix parsing attributes for struct declsMichael Matz2016-12-151-4/+2
| | | | | | | | | | | Given this code: struct __attribute__((...)) Name {...}; TCC was eating "Name", hence generating an anonymous struct. It also didn't apply any packed attributes to the parsed members. Both fixed. The testcase also contains a case that isn't yet handled by TCC (under a BROKEN #define).
* inline asm: accept concatenated strings in constraintsMichael Matz2016-12-151-1/+1
| | | | | This really should be handled implicitly in the preprocessor, but for now this is enough.
* Accept symbols in initializers also on 64 bitMichael Matz2016-12-151-3/+13
| | | | Those should use long or long long type, and generate a 64bit reloc.
* Accept empty struct member declsMichael Matz2016-12-151-1/+4
| | | | | | | struct S { /*nothing*/; int a; }; is an acceptable struct declaration, there may be stray semicolons in the member list.
* Accept concatenated strings in attributesMichael Matz2016-12-151-25/+29
| | | | | attribute(section("one" "two")) should be accepted (the section name being "onetwo"), it's normal string concatenation.
* arm64: Fix regression introduced by 6245db9.Edmund Grimley Evans2016-12-051-0/+4
|
* Rename add_elf_sym to set_elf_symThomas Preud'homme2016-12-031-1/+1
| | | | | | | | | | add_elf_sym is a confusing name because it is not clear what the function does compared to put_elf_sym. As a matter of fact, put_elf_sym also adds a symbol in a symbol table. Besides, "add_elf_sym" fails to convey that the function can be used to update a symbol (for instance its value). "set_elf_sym" seems like a more appropriate name: it will set a symbol to a given set of properties (value, size, etc.) and create a new one if non exist for that name as one would expect.
* Implement gcc bitfield algorithm; add -mms-bitfieldsDavid Mertens2016-11-281-7/+23
|
* tccgen: fix inline_functions double free fixgrischka2016-11-111-4/+2
|
* tccgen: inline_functions double free fixgrischka2016-11-111-7/+9
| | | | | | Fix double free of the inline function token_string which could happen when an error/longjmp occurred while compiling the inline function.
* bcheck: access fields of local structs w/o bcheckPavlas, Zdenek2016-11-101-3/+3
| | | | Revert previous commit, this is probably a better fix.
* bcheck: add structs to local regionsPavlas, Zdenek2016-11-091-2/+2
| | | | | | | | int test() { struct { int i; } s = { 42 }; return s.i; // bound checked }
* tccpp_new/delete and other cleanupsgrischka2016-10-171-20/+13
|
* x86-64: Fix long long bugMichael Matz2016-10-171-2/+7
| | | | | | | With the last improvements to lexpand it's now harmful to use on native 64bit platforms when not necessary. For gv_dup it's not necessary there. It can still be used with really transforming a 64bit value into two 32bit ones.
* i386: do not 'lexpand' into registers necessarilygrischka2016-10-161-10/+16
| | | | | | | | | | | | | | Previously, long longs were 'lexpand'ed into two registers always. Now, it expands - constants into two constants (lo-part, hi-part) - variables into two lvalues with offset+4 for the hi-part. This makes long long operations look a bit nicer. Also: don't apply i386 'inc/dec' optimization if carry generation is wanted.
* tccgen/32bits: fix unsigned long long -> int castgrischka2016-10-161-3/+3
| | | | | | | | | | | | | | | | | | | gen_cast() failed to truncate long long's if they were unsigned, which was causing mess on the vstack. There was a similar bug here tccgen: 32bits: fix PTR +/- long long ed15cddacd145c74e4600af50f6616ba59ca0d8d Both were not visible until this patch tccgen: arm/i386: save_reg_upstack b691585785086024549cfb9ac65f3397263965aa I'd still assume that this patch is correct per se. Also: - remove 2x !nocode_wanted (we are already under a general "else if (!nocode_wanted)" clause above).
* #define __GNUC__ = 2.1grischka2016-10-151-0/+4
| | | | | | | | | | __GNUC__ nowadays as macro seems to mean the "GNU C dialect" rather than the compiler itself. See also http://gcc.gnu.org/ml/gcc/2008-07/msg00026.html This patch will probably cause problems of various kinds but maybe we should try nonetheless.
* tccgen/tccelf: move code from libtcc.cgrischka2016-10-151-14/+214
|