aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* refactor enumsgrischka2017-07-094-102/+107
| | | | | | 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.
* refactor sym & attributesgrischka2017-07-099-291/+286
| | | | | | | | | | | | tcc.h: * 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' tccgen.c: * refactor parse_btype()
* unsorted adjustmentsgrischka2017-07-0911-80/+105
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - 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
* tccpp: allow "#define X defined Y ..."grischka2017-07-094-26/+69
| | | | | | | 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.
* tccpp: Implement __COUNTER__Michael Matz2017-07-095-11/+72
| | | | | | | | | | | 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.
* tccpp: CleanupMichael Matz2017-07-091-126/+111
| | | | | With last change the can_read_stream flag is unneeded, so tidy this a bit.
* tccpp: Fix corner caseMichael Matz2017-07-096-10/+143
| | | | | | | | | | | | | 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.
* add _Generic testMatthias Gatto2017-07-052-0/+60
|
* add C11's _GenericMatthias Gatto2017-07-052-1/+74
| | | | | | | | | | 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.
* Revert "String literals are always const"Michael Matz2017-07-041-3/+3
| | | | | | | | | | | 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.
* Extend skip_or_save_blockMichael Matz2017-07-031-1/+1
| | | | | Make it stop also before outer level closing parens. This way we can now also skip/save the expression inside "foobar(42 + 41)".
* Improve skip_or_save_blockMichael Matz2017-07-031-7/+7
| | | | | Stop at level 0 only for matching outer '}' (which is added). Otherwise stop only at stop tokens (which aren't added).
* String literals are always constMichael Matz2017-07-031-3/+3
| | | | | | 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.
* Align 'implicit-function-declaration' option comment with other comments ↵Christian Jullien2017-06-101-1/+1
| | | | (cosmetic change)
* Add -O2 when compiling tcc on Windows. Not sure this flag is really used by tcc.Christian Jullien2017-06-101-24/+24
|
* When creating a staticaly linked ELF program should not includeEmil2017-06-091-5/+7
| | | | | | | | | 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.
* force i386-win32-tcc.exe to be a 32bit binary. Run tests in both 32/64 bits ↵U-NELSON\jullien2017-06-051-1/+5
| | | | on Windows.
* Add more common tests to be run from win32/MakefileU-NELSON\jullien2017-06-041-2/+2
|
* Windows test Makefile target also test pp tests.Christian Jullien2017-05-281-0/+1
|
* Limit access end-of-struct warning a bitMichael Matz2017-05-271-1/+1
| | | | | | | 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.
* x86-64: Fix psABI stdarg prologueMichael Matz2017-05-272-12/+37
| | | | | | 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.
* x86-64: Rewrite linux parameter passingMichael Matz2017-05-272-176/+86
| | | | | This fixes two ABI testcases involving large arguments when there are still registers available for later args.
* the R_X86_64_GOTOFF64 relocation was missingAron BARATH2017-05-161-0/+5
|
* configure: --config-musl/-uClibc switch & misc cleanupsgrischka2017-05-1318-240/+181
| | | | | | | | | | | | | | | - 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" 7443db0d5f841b81a55e918bf8c228dd20f9ddb2 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
* added 64-bit relocation types that required to linking against 64-bit (large ↵Aron BARATH2017-05-121-11/+51
| | | | model) libraries
* bitfields: promote to signed intgrischka2017-05-093-9/+126
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 accordingly. 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; } Results: 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);
* bitfields: one more hack and a "-Wgcc-compat" switchgrischka2017-05-093-6/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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. Example: struct __attribute__((packed)) _s { unsigned int x : 12; unsigned char y : 7; unsigned int z : 28; }; Expected (GCC) layout (sizeof struct = 6) .xxxxxxxx.xxxxyyyy.yyyzzzzz.zzzzzzzz.zzzzzzzz.zzzzzzz0. But we cannot read/write 'char y'from 2 bytes in memory. So we have to adjust: .xxxxxxxx.xxxx0000.yyyyyyyz.zzzzzzzz.zzzzzzzz.zzzzzzzz.zzz00000 Now 'int z' cannot be accessed from 5 bytes. So we arrive at this (sizeof struct = 7): .xxxxxxxx.xxxx0000.yyyyyyy0.zzzzzzzz.zzzzzzzz.zzzzzzzz.zzzz0000 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.
* Touch up previous "s"[i<2] patchLarry Doolittle2017-05-092-2/+2
| | | | | The real equivalence is between the original "s" + (i<2) and &"s"[i<2].
* Give clang one less thing to complain aboutLarry Doolittle2017-05-082-2/+2
| | | | | | "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.
* Remove some unused argumentsMichael Matz2017-05-082-4/+3
| | | | these ones are really superfluous.
* bitfields: fix long bitfieldsMichael Matz2017-05-081-3/+3
| | | | now the testcase works on i386-linux as well.
* Improve musl and uclibc detectionMarc Vertes2017-05-081-1/+8
| | | | | | | 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.
* Fix spelling in help messageLarry Doolittle2017-05-081-1/+1
| | | | "seach" becomes "search" in help2 when not TCC_TARGET_PE
* Remove some unused-parameter lintLarry Doolittle2017-05-085-9/+21
| | | | | | | | 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().
* C string litteral is const, fix return type of default_elfinterp. Remove ↵Christian Jullien2017-05-082-4/+4
| | | | #ifndef TCC_IS_NATIVE in arm-gen.c as suggested by grischka.
* Spelling fixes in C comments onlyLarry Doolittle2017-05-0719-48/+48
|
* Add missing const and add warning flagsLarry Doolittle2017-05-072-2/+2
|
* Fix a warningMichael Matz2017-05-081-1/+1
| | | | | | "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.
* more minor fixesgrischka2017-05-079-166/+194
| | | | | | | | | | | | | | | | | | | | | | | | | * 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
* Accept extern initialized file-scope variablesMichael Matz2017-05-072-1/+4
| | | | | | '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.
* elf: Fix last commitMichael Matz2017-05-071-7/+53
| | | | Forgot to mark tccelf.c as to be committed in last commit :-/
* elf: Support STB_LOCAL dynamic symbolsMichael Matz2017-05-075-0/+5
| | | | | | | | 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.
* elf: Ignore SHF_COMPRESSED sectionsMichael Matz2017-05-062-1/+11
| | | | | | | | | | | | 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.
* struct-init: Fix zero initialization with multi-level designatorsMichael Matz2017-05-063-67/+96
| | | | | | | 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.
* Fix unsigned enum bit-fieldsMichael Matz2017-05-053-1/+60
| | | | | | 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.
* Fix segfault with invalid function defMichael Matz2017-05-052-1/+6
| | | | | | | 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.
* Rebuild cross compilers when sources changeMichael Matz2017-05-021-1/+1
| | | | | | | | 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.
* Tidy decl_designatorMichael Matz2017-05-021-26/+15
| | | | | Removing the need for the notfirst local variable, and tidy loop structure and error messaging a bit.
* Remove label_or_declMichael Matz2017-05-021-21/+5
| | | | | 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).
* Cleanups (float consts, sections, symbols)Michael Matz2017-05-023-79/+42
| | | | | | | | 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).