Commit Graph

14698 Commits

Author SHA1 Message Date
svenbarth
ccecf2c13c Fix comparisons (aka usage of flag/CCR register)
m68k/aasmcpu.pas, taicpu.spilling_get_operation_type:
  * add all Sxx instructions as "operand_write" instructions

m68k/n68kadd.pas, t68kaddnode.getresflags:
  * use the correct operation in case of swapped nodes

m68k/cgcpu.pas, tcg68k.g_flags2reg:
  - don't move a 0 to the register, because this will CLR it and thus the flags won't be valid anymore...
  - NEG would have been the wrong operation (NOT would have been correct), but it isn't needed anyway...
  * simplify the method by handling the address register case only when necessary

git-svn-id: trunk@23383 -
2013-01-14 20:31:15 +00:00
svenbarth
741992bae4 m68k/n68kmat.pas, tm68kshlshrnode.first_shlshr64bitint:
use RTL helper functions (through the inherited method) if we're not shifting by a constant

This fixes test/cg/tshlshr

git-svn-id: trunk@23378 -
2013-01-13 19:33:23 +00:00
sergei
162896e7d7 * MIPS code generator fixes and improvements:
- removed a_jmp_cond, it's not virtual and not applicable to this CPU.
* a_loadfpu_reg_cgpara: use direct register moves for simple destinations.
* g_concatcopy: don't take address of source/destination for small amounts of data if possible, for single 32-bit moves this reduces number of generated instructions from 4 to 2.
* g_intf_wrapper: 'Self' is in R4 (a0), not R2. Fixes test/tinterface1.pp.

* mips/cpupara.pas: for functions with result returned in parameter, pass its address in a0 only if result is a record. ABI does not specify behavior for types except records/unions. At the same time, Pascal code relies on the fact that results like strings/interfaces does not change their locations, i.e. "function foo(<self>): IInterface" can be invoked as "procedure foo(<self>, out obj)". This fixes test/tdel1.pp and some Variant-related tests.

git-svn-id: trunk@23377 -
2013-01-13 18:24:06 +00:00
sergei
32ffddaad8 + ELF linker back-ends for ARM and MIPS.
ARM status: roughly corresponds to i386 one, passes the test suite. Handles libraries, can link static libc code including basic PIC and TLS IE/LE stuff. Completely misses Thumb support. Also does not handle ABI-specific stuff, for this reason internally linked .so cannot be used for linking executables with ld. Little-endian only. Tested only on "versatilepb" QEMU virtual machine.

MIPS status: can link the compiler and at least some dynamic executables including fpmake. Some PIC support is present but almost untested. Specific header flags and sections are also not handled yet. Written to handle both endian, but tested for big-endian only ("malta" QEMU VM), including cross-linking from x86_64.

git-svn-id: trunk@23376 -
2013-01-13 18:05:19 +00:00
sergei
af4935e346 + Support dynamic copy relocations.
* For unresolved weak symbols, provide dynamic binding only if they are referenced via GOT or PLT (ld-compatible behavior).
* Made more TElfExeOutput properties/methods usable by descendant classes.
* x86_64/cpuelf.pas: some refactoring, handle DTPOFF relocations, prohibit TPOFF relocations in shared objects.
* i386/cpuelf.pas: set symref_from_text flags for copy relocations to work correctly.

git-svn-id: trunk@23375 -
2013-01-13 17:44:14 +00:00
sergei
a1503b51f2 + chmod 755 on executable files produced by internal linker. I missed this "small" detail for half a year because all development was going on a NTFS drive where everything is executable.
git-svn-id: trunk@23374 -
2013-01-13 17:18:11 +00:00
svenbarth
252744ad24 m68k/cgcpu.pas, tcg68k.g_concatcopy:
use the correct flag for the copy loop: we jump back to the copy code as long as the value is positive aka BPL instead of BMI

This fixes around 30 tests (it fixes a quite bit more, but now some other tests seem to be broken...)

git-svn-id: trunk@23373 -
2013-01-13 16:21:59 +00:00
sergei
4b925763c3 + Enable CPU-specific descendants to write specific dynamic tags.
+ Read version definitions from shared objects.

git-svn-id: trunk@23370 -
2013-01-13 06:36:39 +00:00
sergei
f98e09d86e - TObjData.sectiontype2options: removed oso_keep flags. They don't have any effect here because this function is used only during assembling, and oso_keep cannot be represented in object files and therefore gets lost before linking.
git-svn-id: trunk@23364 -
2013-01-11 17:14:44 +00:00
sergei
ad1621df3f * Revert part of r22548, correct fix for the issue is provided by r23188.
Only referencing data labels from code should change "GOT is needed" property. Writing data labels or referencing them from data should have no effect on it.

git-svn-id: trunk@23363 -
2013-01-11 15:31:12 +00:00
sergei
bc4c1149c3 + Native threadvar implementation for Win32 and Win64 (most of it, but not yet complete).
git-svn-id: trunk@23359 -
2013-01-10 19:13:02 +00:00
svenbarth
b5827ce363 Move the handling of "misstyled" floating point constants like "2." or "2.e10" from the scanner to the parser. This way type helpers calls for integer constants can be parsed correctly in the future.
Note: the error messages for incorrect "misstyled" floating point numbers (e.g. "2e10foo") have changed because of this.

scanner.pas, tscannerfile.readtoken:
  instead of tokenizing "2.", "2.e10", "2.e+10" and "2.e-10" as "_REALNUMBER" tokenize them as "_INTCONST _POINT", "_INTCONST _POINT _ID", "_INTCONST _POINT _ID _PLUS _INTCONST" "_INTCONST _POINT _ID _PLUS _INTCONST"; tokenizing of normal floating constants is not changed

pexpr.pas:
  factor: 
    * extract the code for creating a new constant floating point from "factor" into a new function "real_const_node_from_pattern"
    + allow the parsing of postfixoperators for integer constants if a "." is encountered
  + postfixoperators: check for a "misstyled" floating point number if an ordinal const (not an enum and not a boolean) is encountered (the code is already partially prepared for type helper support)
  
+ Added tests

git-svn-id: trunk@23356 -
2013-01-10 16:23:00 +00:00
svenbarth
359a228085 Fix one problem type of Mantis #23546. A record must not contain a static array that uses itself as an element type (in can contain a dynamic array however) otherwise an infinite loop is encountered when checking whether the record needs special init/final code.
pdecvar.pas, read_record_fields:
  * if the def of the field is a static array then use the array's element def (the final element def if it is a multi dimensional array) to check for whether this is the current record type

+ added tests

git-svn-id: trunk@23352 -
2013-01-09 14:07:01 +00:00
svenbarth
29bd000a4a Fix for Mantis #23571.
ptype.pas, single_type:
  * if using a message that expects a parameter, provide that parameter...

+ added tests

git-svn-id: trunk@23349 -
2013-01-09 11:28:17 +00:00
svenbarth
6fb958a491 symdef.pas, tstoreddef:
* adjust "is_generic" so that it will really work for true generics only
  + added an analogous method "is_specialization" for specializations

Both methods are not used yet, but this will change in the future...

git-svn-id: trunk@23348 -
2013-01-09 09:34:20 +00:00
svenbarth
fdb1950227 Fix for revision 23344.
pgenutil.pas, generate_specialization:
  in case of "assigned(parsedtype)" an ">" could immediately follow (only one type parameter), so don't necessarily expect a type identifier

git-svn-id: trunk@23347 -
2013-01-09 09:12:39 +00:00
paul
97d7a4ff50 compiler: fix indentation
git-svn-id: trunk@23346 -
2013-01-09 01:26:46 +00:00
sergei
d43c38633c * Fixed tMIPSELnotnode.second_boolean do handle QWordBool type correctly and deal with difference between Pascal and C booleans. Also improved it to produce code without macros. Fixes webtbs/tw20874 (and maybe something else).
git-svn-id: trunk@23345 -
2013-01-08 17:43:33 +00:00
svenbarth
27f5e4f582 Fix for Mantis #23547. Basically we now fail with nicer error messages.
pgenutil.pas:
  generate_specialization:
    + instead of giving an internal error if "symname" is empty and "tt" is "nil" we now do an error recovery by parsing the specialization parameters and returning an errordef (this happens if the "generic" type before the "<" is not found)
    * handle "<>" specially by giving an approbiate error message (both when doing a recovery/parsing a generic and during normal specialization)
  parse_generic_parameters:
    * set the "block_type" to "bt_type" to be on the safe side
    * don't continue with inspecting the def (especially hard typecasting) if the found def is not an "objectdef"

Added tests.

git-svn-id: trunk@23344 -
2013-01-08 09:05:11 +00:00
sergei
7530fb3352 * tcgx86.make_simple_ref: handle references to absolute addresses (these are quite rare on x86_64, but still worth to handle correctly).
* If possible, use reference base instead of index, this yields shorter instructions.
* Added comment about offset limits for rip-relative addressing.
- Removed code related to taking threadvar address on win32, it is incorrect because Windows TLS is not directly accessible via segment registers (fs:0x2c points to array of pointers to TLS storages of each module, so at least double indirection is needed).

git-svn-id: trunk@23342 -
2013-01-07 16:00:12 +00:00
sergei
49d7448f44 * Made TElfExeOutput.CreatePLT method protected virtual, so CPU-specific handling can be provided by descendants.
* Handle SHT_GNU_ATTRIBUTES sections (ignore them for now).

git-svn-id: trunk@23339 -
2013-01-07 15:22:04 +00:00
sergei
b197919953 * Handle relocation section prefixes (.rel/.rela) in internal linker script based on ElfTarget.relocs_use_addend, getting rid of $ifdef's.
+ Linker script adjustments for ARM target.

git-svn-id: trunk@23338 -
2013-01-07 15:13:05 +00:00
florian
889b7285b1 * disable record register variables with a size of 2*sizeof(asizeint) on big endian architectures
git-svn-id: trunk@23331 -
2013-01-06 19:46:53 +00:00
Jonas Maebe
39f46d8350 * restored accidentally removed call to fpc_handleerror in r23325
git-svn-id: trunk@23330 -
2013-01-06 19:46:21 +00:00
paul
1508fd427d compiler: handle calling convention of record (class)constructors/destructors later as it is done with other record methods
git-svn-id: trunk@23329 -
2013-01-06 17:04:28 +00:00
Jonas Maebe
69c29a415f * pass the procdef to getintparaloc instead of only the proccalloption, so
that the type of the parameters can be determined automatically
   o added compilerproc declarations for all helpers called in the compiler
     via their assembler name, so we can look up the corresponding procdef

git-svn-id: trunk@23325 -
2013-01-06 15:05:40 +00:00
Jonas Maebe
4ea78538e4 * enabled threading feature for jvm target so that rtl/inc/genmath.inc
compiles again there (it's possible to take the address of arbitrary
    threadvars on the jvm platform, but not of arbitrary other variables)
  - disabled inclusion of generic thread manager and threadvar support
    on the jvm target if the threading feature is enabled

git-svn-id: trunk@23322 -
2013-01-06 15:05:24 +00:00
florian
4f30ac0247 * put records with 16 bytes size into two register on 64 bit targets if possible
* don't put records containing floats into integer registers
* copy&paste error in tcg128.a_load128_const_reg fixed

git-svn-id: trunk@23317 -
2013-01-05 22:58:32 +00:00
sergei
2bba4e2d44 + Stabs debug info needs swapping when linking for different endianness.
* A few minor tweaks for Stabs generation.

git-svn-id: trunk@23316 -
2013-01-05 12:26:23 +00:00
florian
c781f21a46 * records with two times the size of a register can be kept in registers
git-svn-id: trunk@23313 -
2013-01-04 21:48:41 +00:00
florian
b43b4bb455 + pseudo procedure aligned: tells the compiler to assume that the given parameter is naturally aligned, counterpart of unaligned
git-svn-id: trunk@23310 -
2013-01-04 19:13:24 +00:00
florian
fce9e953b4 + nested exit support
git-svn-id: trunk@23309 -
2013-01-04 19:09:04 +00:00
masta
6fabe49828 Readded cutils to compiler/arm/rgcpu.pas for DEBUG_SPILLING
Commit r23306 broke compiling with DEBUG_SPILLING set. Unit cutils will
now be included when DEBUG_SPILLING is set.

git-svn-id: trunk@23308 -
2013-01-04 12:21:54 +00:00
florian
47d43750e4 * remove unused units from uses statements
git-svn-id: trunk@23306 -
2013-01-03 23:07:09 +00:00
florian
318f0e5cab * enable section smartlinking for powerpc-linux to reduce compilation
times, some testing with qemu-ppc showed no problems

git-svn-id: trunk@23305 -
2013-01-03 23:04:29 +00:00
florian
198907797b * don't replace vmt entries of empty methods by FPC_EMPTYMETHOD
if the code is compiled for x86 and returns the result in an fpu register

git-svn-id: trunk@23304 -
2013-01-03 23:01:07 +00:00
florian
7ac9f11cc7 * check if current_procinfo is assigned in paramanager code to avoid crashes
git-svn-id: trunk@23303 -
2013-01-03 23:00:03 +00:00
florian
329257d76e * check for empty procedures after helper test so even empty helper methods cannot be called directly
* don't remove calls to subroutines taking arrays of const

git-svn-id: trunk@23302 -
2013-01-03 22:58:56 +00:00
sergei
d7c5daeccd * Don't calculate data position of each object section. Instead, write out a copy of exesection's memory image, i.e. every objsection is placed at the same offset from its owning exesection both on disk and in memory. This approach is simpler and works regardless of alignment requirements, while existing one could work only if SectionDataAlign<=SectionMemAlign.
* Netware target may be broken by this change; at least it deserves a good cleanup because it contains a lot of code trying to solve similar task: to write exesections without alignment and deal with objsections that are nevertheless being aligned by TExeOutput.

git-svn-id: trunk@23291 -
2013-01-02 10:10:23 +00:00
sergei
35439c0e1d * Moved creation of GOT section into separate virtual method.
* TElfSymtab.WriteSymbol: write type of external symbols as STT_NOTYPE only in object files; external symbols in exe/so files must have type of their resolving symbol.
* TElfObjData.writeReloc_internal: RELOC_RELATIVE needs adjustment by size presumably on x86 only; ARM data relocations don't need it, other CPUs aren't checked yet.
* Use VER_xx and VERSYM_xx constants instead of literal values.

git-svn-id: trunk@23290 -
2013-01-02 08:11:49 +00:00
pierre
1dd964960c * Enable use of amd64 ld GNU linker for i386 by adding target and emul command line args for freebsd
git-svn-id: trunk@23282 -
2013-01-01 23:00:02 +00:00
florian
903f18ea38 * get rid of calls which redirect the program flow only, Bl2B optimization
git-svn-id: trunk@23279 -
2013-01-01 19:31:52 +00:00
florian
24f518f232 + redirect calls to empty virtual methods to FPC_EMPTYMETHOD
* do empty subroutine/method optimization only for O2 and higer

git-svn-id: trunk@23276 -
2013-01-01 16:43:27 +00:00
florian
4d6471fef6 * get rid of calls to empty procedures having parameters without side effect
git-svn-id: trunk@23274 -
2013-01-01 15:58:05 +00:00
florian
ff98d2567c * don't crash on thumb instructions with only two operands when optimizing ADD, SUB, AND statements
git-svn-id: trunk@23272 -
2013-01-01 12:29:48 +00:00
Károly Balogh
8fe2828e5a it seems Coldfire needs tf_requires_proper_alignment, fixes taddr1/2 tests, maybe others too (but someone with clue about RTTI should confirm)
git-svn-id: trunk@23270 -
2013-01-01 04:51:47 +00:00
florian
288820715d * don't crash in case a symbol is not found in type/var/const section
git-svn-id: trunk@23264 -
2012-12-31 20:24:55 +00:00
florian
00af813eee * write supported cpu and fpu types more compact
git-svn-id: trunk@23260 -
2012-12-31 16:45:30 +00:00
florian
a5cc48da0e * write controller types more compact
git-svn-id: trunk@23259 -
2012-12-31 16:31:23 +00:00
florian
c9d8047113 * open config files read only so they can be open by multiple compilers at once
git-svn-id: trunk@23254 -
2012-12-31 14:13:05 +00:00