aboutsummaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
* inline asm: accept concatenated strings in constraintsMichael Matz2016-12-154-7/+8
| | | | | This really should be handled implicitly in the preprocessor, but for now this is enough.
* inline asm: Fix 'P' and accept some r<nr> registersMichael Matz2016-12-152-5/+13
| | | | | | A 'P' template modifier should avoid adding a '$' to literal arguments. Also accept the numbered r8+ registers in an inline asm clobber list (ignoring them for now).
* Accept symbols in initializers also on 64 bitMichael Matz2016-12-152-3/+20
| | | | Those should use long or long long type, and generate a 64bit reloc.
* x86-64-asm: More opcodesMichael Matz2016-12-153-0/+22
| | | | Implement some more opcodes, syscall, sysret, lfence, mfence, sfence.
* tccasm: Implement compare expressionsMichael Matz2016-12-152-1/+51
| | | | | I.e. implement < > <= >= == !=. Comparisons are signed and result is -1 if true, 0 if false.
* x86-64-asm: Accept expressions for .quadMichael Matz2016-12-154-1/+14
| | | | | The x86-64 target has 64bit relocs, and hence can accept generic expressions for '.quad'.
* inline asm: Accept 'p' constraint and 'P' template modMichael Matz2016-12-153-1/+15
| | | | | 'p' is conservatively the same as 'r' and 'P' as template modifier can be ignored in TCC.
* tccasm: Accept .balignMichael Matz2016-12-153-1/+4
|
* Accept more asm expressionsMichael Matz2016-12-154-23/+60
| | | | | | In particular subtracting a defined symbol from current section makes the value PC relative, and .org accepts symbolic expressions as well, if the symbol is from the current section.
* tccasm: Implement .pushsection and .popsectionMichael Matz2016-12-154-3/+40
|
* Accept empty struct member declsMichael Matz2016-12-152-1/+9
| | | | | | | struct S { /*nothing*/; int a; }; is an acceptable struct declaration, there may be stray semicolons in the member list.
* x86-asm: Accept 'q' modifierMichael Matz2016-12-152-1/+12
| | | | In inline extended asm '%q1' refers to the 64bit register of operand 1.
* 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.
* Accept -Wp,argsMichael Matz2016-12-151-0/+6
| | | | | | | These are preprocessor cmdline arguments, but even in GCC they aren't specified but rather left as being subject to changes. Nobody should use them, but let's to a half-assed attempt at accepting them.
* Change dependency file format a bitMichael Matz2016-12-151-1/+1
| | | | | | | The linux fixdep parse is very stupid and only recognizes a target token when ':' is part of it. A space is permitted in Makefile syntax, but it's easier to change our emitter than all fixdep parsers out there.
* Add --param, reject -mARG if ARG not 32 or 64Michael Matz2016-12-151-0/+4
|
* Implement -include cmdline optionMichael Matz2016-12-153-0/+24
| | | | | | This option includes a file as if '#include "file"' is the first line of compiled files. It's processed after all -D/-U options and is processed per input file.
* Free defines before gen_inline_functionsMichael Matz2016-12-151-2/+2
| | | | | | | | gen_inline_functions uses the macro facilities of the preprocessor, which would interact when macros would still be defined in a different pre-processor implementation I'm working on. So always free defines before generating inline functions, they are all macro expanded already.
* tccpp: Fix macro_is_equalMichael Matz2016-12-153-4/+10
| | | | | | | When tokens in macro definitions need cstr_buf inside get_tok_str, the second might overwrite the first (happens when tokens are multi-character non-identifiers, see testcase) in macro_is_equal, failing to diagnose a difference. Use a real local buffer.
* tccpp: free defines also with PP_BENCHMichael Matz2016-12-151-1/+3
| | | | | When benchmarking preprocessing of multiple files we need to free the defines like when not benchmarking.
* x86-asm: Get rid of OPC_JMP and OPC_SHORTJMPMichael Matz2016-12-153-28/+28
| | | | | Those two insn types are nicer to handle as operand types, because the pressure for bits on instr_type is higher than for operands.
* x86-64-asm: TidyMichael Matz2016-12-152-5/+3
|
* x86-asm: Correct mem64->xmm movqMichael Matz2016-12-153-11/+6
| | | | | | Now we can express prefixes with 0x0fxx opcodes we can correct the movq mem64->xmm opcode, and restrict the movq xmm->mem64 movq to not invalidly accept mmx.
* x86-asm: Remove OPC_D16Michael Matz2016-12-153-10/+6
| | | | | Now that we can store prefixes even for 0x0fXX opcodes we can remove the OPC_D16 bit.
* x86-asm: Fix register orderMichael Matz2016-12-151-1/+1
| | | | | Inserting random registers in the middle of the 8-blocks breaks register assignment.
* x86-asm: Reorganize instr_typeMichael Matz2016-12-153-46/+65
| | | | | | | | | Disjoint instruction types don't need to be a bit field, so introduce an enumeration (3 bits). Also the 0x0f prefix can be expressed by a bit, doesn't need a byte in the opcode field. That enables to encode further prefixes still in 16 bit. To not have to touch all insns do some macro fiddling filtering out a 0x0f byte in the second position.
* x86-asm: move stats codeMichael Matz2016-12-152-32/+40
| | | | | The old place (tccasm.c) didn't have access to the variables anymore and was ifdefed out. Move it to i386-asm.c.
* x86-asm: Add more SSE2 instructionsMichael Matz2016-12-154-119/+257
| | | | | | | | In particular those that are extensions of existing mmx (or sse1) instructions by a simple 0x66 prefix. There's one caveat for x86-64: as we don't yet correctly handle the 0xf3 prefix the movq mem64->xmm is wrong (tested in asmtest.S). Needs some refactoring of the instr_type member.
* tests: add .so/.dll creation testgrischka2016-12-153-9/+23
| | | | | Also remove bitfield test from tcctest.c because gcc versions don't agree among each other.
* tccelf: some linker cleanupgrischka2016-12-159-441/+466
| | | | | | | | | | - generate and use SYM@PLT for plt addresses - get rid of patch_dynsym_undef hack (no idea what it did on FreeBSD) - use sym_attrs instead of symtab_to_dynsym - special case for function pointers into .so on i386 - libtcc_test: test tcc_add_symbol with data object - move target specicic code to *-link.c files - add R_XXX_RELATIVE (needed for PE)
* Use functions to get relocation infoThomas Preud'homme2016-12-107-109/+320
| | | | | | | MSVC does not support array designator so cannot compile source using relocs_info. This commit replace the relocs_info array into a set of functions, each returning the value given by a given field of the struct reloc_info.
* Remove now useless pltoff_addend reloc infoThomas Preud'homme2016-12-106-70/+69
| | | | | | Last use for pltoff_addend field of relocs_info array was removed in commit 25927df3b75c5ce2b64ab8acdcc5974b4e1c89c1. It is now useless so this commit removes it and all initialization related to it.
* Add missing relocation info for C67 targetThomas Preud'homme2016-12-102-4/+14
| | | | | Fill in relocs_info table for C67 and fix R_C60_NUM value to really be greater than all relocation values known to TCC.
* Error out in put_got_entry if no dynamic symbolThomas Preud'homme2016-12-101-0/+2
|
* Allow PLT/GOT entry for weak static symbolThomas Preud'homme2016-12-101-0/+1
|
* Fix PLT creation for i386Thomas Preud'homme2016-12-106-1/+16
| | | | | | | | | | | | | | | | | | | i386 target does not have PC relative loads. Its ABI therefore require ebx register to points to the GOT when executing a PLT entry. This means that PLT entry cannot be used transparently, the compiler needs to expect execution of a PLT entry to be able to use one, that is a PLT entry should only be created if the relocation explicitely asks for it (eg. R_386_PLT32). This patch creates a new target macro PCRELATIVE_DLLPLT to indicate whether a target can do a PC relative load in PLT entry when building a dynamic library. Executable do not normally pose a problem because they are loaded at a fixed address and thus the absolute address of GOT can be used. Note that in such a case, if the compiler does not use a PLT aware relocation for external access then the code relocation will fall on the dynamic loader since there is no PLT entry to relocate too.
* arm64: Fix regression introduced by 6245db9.Edmund Grimley Evans2016-12-051-0/+4
|
* Fix set but not used error in arm64-link.cThomas Preud'homme2016-12-051-5/+4
|
* Fix tcc_error params for R_AARCH64_(JUMP|CALL)26Thomas Preud'homme2016-12-051-3/+2
|
* Error on unrecognized relocationsThomas Preud'homme2016-12-052-1/+6
|
* Add relocs_info array to c67 backendThomas Preud'homme2016-12-051-0/+2
|
* Fix relocs_info declaration in tcc.hThomas Preud'homme2016-12-0512-90/+129
| | | | | | | | | C standard specifies that array should be declared with a non null size or with * for standard array. Declaration of relocs_info in tcc.h was not respecting this rule. This commit add a R_NUM macro that maps to the R_<ARCH>_NUM macros and declare relocs_info using it. This commit also moves all linker-related macros from <arch>-gen.c files to <arch>-link.c ones.
* Control symbol table of which to relocate symbolsThomas Preud'homme2016-12-034-6/+6
| | | | Pass pointer to symbol table to relocate the symbols of in relocate_syms
* Code simplification in relocate_symsThomas Preud'homme2016-12-031-7/+4
|
* Consolidate all relocations in relocate_sectionThomas Preud'homme2016-12-034-66/+22
| | | | | | | | | | | | | | | | | | | | | | | | | | | | Static relocation of functions in dynamic libraries must use the PLT entry as the target. Before this commit, it used to be done in 2 parts for ARM, with the offset of the PLT entry from the beginning of the PLT being put in the relocated place in build_got_entries () and then the address of the PLT being added in relocate_section. This led to code dealing with reading the offset of a bl instruction in build_got_entries. Furthermore, the addition of the address of the start of the PLT was done based on the relocation type which does not convey whether a PLT entry should be used to reach the symbol. This commit moves the decision to use the PLT as the target in relocate_section, therefore having the instruction aware code contained to the target-specific bit of that function (in <target>-link.c). Note that relocate_syms is *not* the right place to do this because two different relocations for the same symbol can make different decision. This is the case in tcc -run mode where the static and dynamic relocation are done by tcc. Storing the PLT entry address in the symbol's st_value field and relying on the specific relocation type being used for dynamic relocation would work but the PLT entry address would then appear in the static symbol table (symtab). This would also make the static symbol table entry differ from the dynamic symbol table entry.
* Allow to get sym attr and fail if no entryThomas Preud'homme2016-12-032-23/+27
| | | | | | Change alloc_sym_attr into get_sym_attr and add a parameter to control whether to allocate a new symattr structure or return NULL if symbol is not found;
* Consolidate GOT creation in build_got_entriesThomas Preud'homme2016-12-032-17/+25
| | | | | | | | | | | | | | | | | | Currently GOT/PLT creation happens in two locations depending on whether the GOT/PLT [entry] is required by the symbol or the relocation: - bind_exe_dynsym for relocations to undefined symbol - build_got_entries/put_got_entry for relocations that require a GOT/PLT entry This commit consolidate GOT/PLT creation in build_got_entries by reducing bind_exe_dynsym's job to create a dynamic symbol for undefined symbols. build_got_entries then invoke put_got_entry if the symbol being relocated is undefined or the relocation asks for a PLT or GOT [entry]. put_got_entry is also modified to only export a symbol in the dynamic symbol table when we are in the case of PLT/GOT [entry] required by the relocation (since undefined symbol are already exported by bind_exe_dynsym).
* Make build_got_entries more target independentThomas Preud'homme2016-12-0311-210/+178
| | | | | Factor most of common logic between targets in build_got_entries by defining target specific info into structures in the backends.
* Only create GOT or GOT entry when neededThomas Preud'homme2016-12-031-22/+27
| | | | | | | | | | | | Currently we always build a GOT when we recognize a relocation in build_got_entries even if the relocation does not require one. In the same spirit, when the relocation does require one we always create a GOT entry even if not entry is necessary. This patch restricts the creation of a GOT and a GOT entry to relocations that needs it, ie: - do not create a GOT if relocation is not related to GOT and symbol is not UNDEF - do not create a GOT entry if relocation only relates to beginning of GOT
* Recognize more relocations as needing GOT/PLT entryThomas Preud'homme2016-12-031-16/+41
|