Commit Graph

124 Commits

Author SHA1 Message Date
florian
a286ad9d77 * do not extend 8 bit return values to 32 bit when loading them into eax,
this is not required by the api, neither does e.g. clang it

git-svn-id: trunk@48136 -
2021-01-11 21:47:32 +00:00
florian
ad8b2eaf8a * mm registers 16-31 are also volatile during a call
git-svn-id: trunk@47077 -
2020-10-10 21:08:12 +00:00
florian
6f661e44d0 * do not throw an internal error later on in case of a recursive call, if the declaration of the function was faulty, resolves #37460
git-svn-id: trunk@45975 -
2020-07-31 21:03:35 +00:00
Jonas Maebe
1a9e246c29 * added is_normal_fieldvarsym() helper and use it
o fixes several places where there was a check whether something is a
     fieldvarsym, but not whether it's an instance rather than a class field

git-svn-id: trunk@43786 -
2019-12-24 22:12:44 +00:00
Jonas Maebe
b89487e721 * fix paraloc def for vectors with vectorcall calling convention (was a single
element instead of a vector)

git-svn-id: trunk@43784 -
2019-12-24 22:12:37 +00:00
pierre
0fa70759a2 * cutils.pas (size_2_align): Move to..
globals.pas (size_2_align): ...here.
     Change parameter type to asizeuint to avoid overflows.
     (var_align_size, const_align_size): Also change parameter type to asizeuint.
     i386/cpupara.pas, i8086/cpupara.pas, x86_64/cpupara.pas: Add globals
     to implementation uses clause because of size_2_align move.

git-svn-id: trunk@43022 -
2019-09-16 14:50:43 +00:00
Jonas Maebe
77658b925b * disable regular array -> dynamic array type coversion support unless
{$modeswitch arraytodynarray} is active (mantis #35576)
   o changed compiler to compile without this modeswitch
   o added the modeswitch to a test that depends on it

git-svn-id: trunk@42118 -
2019-05-25 12:31:32 +00:00
Jonas Maebe
281b3ad276 * fix case completeness and unreachable code warnings in compiler that would
be introduced by the next commit

git-svn-id: trunk@42046 -
2019-05-12 14:29:03 +00:00
Jonas Maebe
8b9e90dc7a * keep track of whether a routine has a C-style variadic parameter in the
procoptions even when it's through an array-of-const parameter
  * always call create_varargs_paraloc_info() instead of create_paraloc_info()
    in the former case, even when no varargs parameters are specified (because
    on some platforms even some non-variadic parameters need to be passed
    differently, such as on ARM with gnueabihf)

git-svn-id: trunk@41420 -
2019-02-23 15:42:45 +00:00
yury
a026252508 * Commented out unused "size" local var.
git-svn-id: trunk@40184 -
2018-11-02 18:47:34 +00:00
yury
4357caaad8 * Removed unused local vars.
git-svn-id: trunk@40183 -
2018-11-02 18:44:29 +00:00
Jonas Maebe
0b246f3dbd * converted Boolean8 to an internal type, and mapped Boolean to the
new internal pasbool1(type) (part of mantis #34411)
   o apply the _Bool x86-64 parameter passing rules only to pasbool1

git-svn-id: trunk@39949 -
2018-10-16 21:14:18 +00:00
nickysn
518cdf9674 * replaced the saved_XXX_registers arrays with virtual methods inside
tcpuparamanager, very similar to the existing get_volatile_registers_XXX. The
  new methods are called get_saved_registers_XXX, where XXX is the register
  type ("int", "address", "fpu" or "mm")

git-svn-id: trunk@38794 -
2018-04-19 21:22:16 +00:00
florian
112373a124 * fix passing floats on unix after vectorcall patch
git-svn-id: trunk@38209 -
2018-02-11 17:50:43 +00:00
florian
31f78ea2b6 + implementation of the vectorcall calling convention by J. Gareth Moreton
+ tests

git-svn-id: trunk@38206 -
2018-02-11 17:50:37 +00:00
florian
b1dff29cbf * removed unused units
git-svn-id: trunk@36165 -
2017-05-09 19:53:14 +00:00
Jonas Maebe
265c8e7bbc + support for specifying ms_abi_default, ms_abi_cdelc, sysv_abi_default, and
sysv_abi_cdecl calling conventions on x86-64 to force using the SYSV/
    Microsoft ABI on platforms that don't use it by default (mainly to ease
    porting pure assembler routines)

git-svn-id: trunk@35425 -
2017-02-11 19:57:12 +00:00
florian
7bb8873c83 * do not throw an internal error if in case of an previous error the parameter class of an errordef is requested, resolves #31016
git-svn-id: trunk@34984 -
2016-11-27 13:16:12 +00:00
Jonas Maebe
a27927e658 * disable parameter struct padding for llvm, as llvm does that it by itself
(and interprets our padding as extra parameters)

git-svn-id: trunk@32554 -
2015-11-29 21:46:03 +00:00
Jonas Maebe
9fd4531e79 * fixed parameter allocation if there are fewer locations than the parameter
is long (e.g. if the last 4 bytes of a record is padding) -- not triggered
    by default because we just extend the last parameter location to 8 bytes
    in such a case, but can happen when we remove that for llvm

git-svn-id: trunk@32552 -
2015-11-29 21:45:57 +00:00
Jonas Maebe
126046dabf * set the def for SSE 64 bit parameters to double instead of an
array of 2 singles

git-svn-id: trunk@32544 -
2015-11-27 14:44:32 +00:00
Jonas Maebe
fa3b0ca312 * support marking defs created via the getreusable*() class methods as
"don't free even if not registered"; use for defs that may not be written
    to a ppu file, but that must nevertheless survive the compilation of the
    current module
  * mark all defs created for para locations as "don't free even if not
    registered", because we don't discard and recalculate all para locations
    after a module has been compiled (since that's not needed)
   o solves issues if the paralocations for a routine in the interface of
     unit A are calculated while the implementation of unit B gets
     compiled, and a new reusable type is allocated at that point which
     is not used anywhere else (after r32160)

git-svn-id: trunk@32235 -
2015-11-04 20:46:18 +00:00
Jonas Maebe
f40ea04540 * changed getarraydef() into a tarraydef.getreusable() class method
git-svn-id: trunk@31147 -
2015-06-23 21:23:18 +00:00
Jonas Maebe
f402b0d7df * changed getpointerdef() into a tpointerdef.getreusable() class method
o allows removing the ugly x86 hacks

git-svn-id: trunk@31144 -
2015-06-22 08:17:49 +00:00
Jonas Maebe
6e5af0b31e * don't replace classrefdef with i64 in parameter locations (so llvm can use
the type information)

git-svn-id: trunk@30787 -
2015-05-03 16:51:23 +00:00
Jonas Maebe
bd203a5b57 * synchronised with trunk till r30240
git-svn-id: branches/hlcgllvm@30241 -
2015-03-15 19:44:58 +00:00
florian
331ace25c6 * handle undefineddef in classify_argument, resolves #27658
git-svn-id: trunk@30239 -
2015-03-15 16:19:58 +00:00
Jonas Maebe
3d9713b9c8 * has_single_field() now looks recursively into fields that are aggregate
types until it finds a non-aggregate type, and then returns "true" if
    that aggregate (record or array) contains one element
  * it now also returns the type of that element directly rather than a
    tfieldvarsym, since we only care about the type and in case of an array
    there is no field

git-svn-id: trunk@30205 -
2015-03-14 18:35:53 +00:00
Jonas Maebe
67b8aceaee * synchronized with privatetrunk till r30095
git-svn-id: branches/hlcgllvm@30101 -
2015-03-05 20:32:15 +00:00
Jonas Maebe
d8c898742a * handle the fact that records containing a single extended value are
returned on the x87 fpu stack on x86-64
   o also handle the fact that this means that we'll generated float
     loads/stores with OS_128/OS_F128 in case the surrounding record
     is padded to a multiple of its alignment

git-svn-id: trunk@28985 -
2014-11-04 21:16:27 +00:00
Jonas Maebe
6712954607 * correctly handle X86_64_X87UP_CLASS getting merged with another class and
becoming X86_64_SSE_CLASS/X86_64_INTEGER_CLASS/... This is not defined in
    the ABI because there sizeof(extended)=16 and hence the class of the upper
    eightbyte of the extended value can never be merged with the class of
    another field (except in a union, but then the class of the lower
    eightbyte will also be overwritten).

    Handle it the same as when the lower eightbyte class of an extended in an
    aggregate gets changed into something else: pass everything in memory
    (part of mantis #26993)

git-svn-id: trunk@28984 -
2014-11-04 21:16:24 +00:00
Jonas Maebe
bacd303208 * synchronized with trunk up to r27758
git-svn-id: branches/hlcgllvm@27779 -
2014-05-12 16:12:34 +00:00
sergei
8c693a3300 * Win64 apparently expects records with single field of floating-point type to be passed the same way as that only field, i.e. in xmm register. Fixes tests/cg/tcalext6.pp.
git-svn-id: trunk@27431 -
2014-04-01 17:04:47 +00:00
Jonas Maebe
41a53ef037 * don't replace some pointer types in paralocs with int64, gives nicer
results in llvm (fewer needless pointer -> int -> pointer conversions)

git-svn-id: branches/hlcgllvm@26994 -
2014-03-06 21:41:04 +00:00
Jonas Maebe
68fa17593d * no longer associated defs with size 1 to 3 bytes with paralocs, because
gcc and clang always allocate them in multiple of 4 bytes too (except in
    case of _Bool, which is 1 byte -> do the same for PasBool) and this is
    one possible interpretation of the ABI. This also frees us from having to
    perform special adjustments afterwards to ensure that smaller values are
    sign/zero-extended to 32 bits

git-svn-id: branches/hlcgllvm@26993 -
2014-03-06 21:41:00 +00:00
Jonas Maebe
e9268a0a14 * synchronised with trunk up till r26975
git-svn-id: branches/hlcgllvm@26976 -
2014-03-06 21:36:58 +00:00
sergei
2c02e8a726 - i386, x86_64, SPARC: removed paramanager.getintparaloc overrides, it is handled by generic implementation since r24716.
(This probably can be removed for all targets, but I don't want to do it without prior testing).

git-svn-id: trunk@26870 -
2014-02-24 16:01:14 +00:00
florian
4d5119bf1c * fixes several issues which cause warnings by the dfa code when using it to detect uninitialized variables
git-svn-id: trunk@26161 -
2013-12-01 17:02:08 +00:00
Jonas Maebe
99de108c68 * renamed all paramanagers to tcpuparamanager so the llvm paramanager can
derive from them without ifdefs

git-svn-id: branches/hlcgllvm@26039 -
2013-11-11 11:15:27 +00:00
Jonas Maebe
7566ddcc8f * add a tdef to each parameter location and set it for all target
backends (not yet used, will be used in high level code generator)

git-svn-id: trunk@24761 -
2013-06-02 10:24:02 +00:00
Jonas Maebe
5d628b29bb * set the subregsize of OS_M64 SSE registers to R_SUBQ so we can
differentiate between 64 bit and 128 bit (R_SUBMMWHOLE) SSE vector regs,
    and support spilling/assembling for R_SUBQ SSE registers (8 bytes)
    (mantis #23962)

    We currently never use the full 128 bit of an SSE register, and
    spilling for those hasn't been implemented yet either (R_SUBMMWHOLE
    SSE regs are spilled into a 4-byte temp currently -> can overwrite data)

git-svn-id: trunk@23700 -
2013-03-06 12:42:46 +00:00
svenbarth
7bad1763b8 Decrease amount of code duplication regarding handling of safecall and record constructors.
paramgr.pas, tparamanager:
    + add new method "handle_common_ret_in_param"
    * extract common code (safecall + record constructor handling) from "ret_in_param" to "handle_common_ret_in_param" and call the latter in "ret_in_param"
[aarch64,arm,avr,i386,x86_64]/cpupara.pas, tCPUparamanager.ret_in_param:
    * call "handle_common_ret_in_param" instead of implementing the same check again and again
ncgcal.pas, tcgcallnode.handle_return_value:
    * move the check for (record) constructors to "tparamanager.handle_common_ret_in_param"

git-svn-id: trunk@23520 -
2013-01-25 20:39:28 +00:00
paul
b2a613c17f compiler: implement record constructors + tests
git-svn-id: trunk@23395 -
2013-01-16 02:07:42 +00:00
paul
51825b6f2e compiler: change ret_in_param to accept tabstractprocdef instead of tproccalloption to allow check more options (required for record constructor implementation)
git-svn-id: trunk@23394 -
2013-01-16 01:14:23 +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
df7398977a * correctly calculate the number of words spanned by a packed aggregate
that does not start at a multiple of 8 bytes (mantis #23212)

git-svn-id: trunk@22856 -
2012-10-27 09:05:28 +00:00
Jonas Maebe
dcdcc6988d * if an agregate contains unaligned fields, it has to be passed via memory
(mantis #22878)

git-svn-id: trunk@22390 -
2012-09-14 13:59:59 +00:00
Jonas Maebe
0a1157da38 * fixed memory leaks in the compiler introduced in r21862 by marking and
releasing temporarily created function result locations

git-svn-id: trunk@21953 -
2012-07-23 13:49:29 +00:00
Jonas Maebe
bdc62289b4 * the safecall -> cdecl mapping is also activated for x86_64
(tf_safecall_clearstack is set for it) -> also use pocalls_cdecl for it
    and adjust the safecall tests not to try parameter scenarios that are
    unsupported for cdecl

git-svn-id: trunk@21948 -
2012-07-22 16:59:04 +00:00
Jonas Maebe
7a0ae38700 + also specify the parameter def when allocating a parameter via
getintparaloc + adapted all call sites of getintparaloc. This
    led to a number of additional, related changes:
   o corrected the type information for some getintparaloc parameters
   o don't allocate some intparalocs in cases they aren't used
   o changed "const tvardata" parameter into "constref tvardata" for
     fpc_variant_copy_overwrite to make pass-by-reference semantics
     explicit
   o moved a number of routines that now have to call find_system_type()
     from cgobj to hlcgobj so that cgobj doesn't have to start depending
     on the symtable unit
   o added versions of the cpureg alloc/dealloc methods to hlcgobj that
     call through to their cgobj counter parts, so we can call save/restore
     the cpu registers before/after calling system helpers from hlcgobj
     (not implemented in hlcgobj itself, because all basic register
      allocator functionality is still part of cgobj/cgcpu)

git-svn-id: trunk@21696 -
2012-06-24 15:02:12 +00:00