Commit Graph

16945 Commits

Author SHA1 Message Date
Jonas Maebe
53e1d5c26f * fixed optimised form of a_cmp_const_reg_label(): when inverting the branch, we still
have to emit the label we originally allocated for the fallthrough path (otherwise
    the branch is not inverted at all, and moreover the caller will also emit the
    original target label somewhere so it will be doubly defined)

git-svn-id: branches/hlcgllvm@28367 -
2014-08-10 19:40:06 +00:00
Jonas Maebe
082c81a191 * for now disable internal bsr/bsf for LLVM (can be implemented later
based on llvm.ctlz/cttz intrinsics)

git-svn-id: branches/hlcgllvm@28366 -
2014-08-10 19:40:03 +00:00
Jonas Maebe
ac02c92a0d * disable cg64/cg128 special cases for high level targets
git-svn-id: branches/hlcgllvm@28365 -
2014-08-10 19:40:00 +00:00
Jonas Maebe
6ab2c00ac6 * recognise LOC_CREFERENCE in tllvmsubscriptnode.handle_platform_subscript()
git-svn-id: branches/hlcgllvm@28364 -
2014-08-10 19:39:58 +00:00
Jonas Maebe
f70865fc1f * moved tjvmnotnode implementation to generic ncghlmat unit, and also use it
for llvm

git-svn-id: branches/hlcgllvm@28363 -
2014-08-10 19:39:55 +00:00
Jonas Maebe
4f2b77bc96 + support floating point reference -> integer parameter transfer in
thlcgobj.a_loadfpu_ref_cgpara()

git-svn-id: branches/hlcgllvm@28358 -
2014-08-10 13:19:37 +00:00
Jonas Maebe
39fa81eaa0 * fixed passing of C-style varargs parameters
git-svn-id: branches/hlcgllvm@28357 -
2014-08-10 13:19:29 +00:00
Jonas Maebe
db54588afa * when calling a procdef that either returns a procvardef or that accepts
(C-style) varargs, you have to specify the full function definition
    rather than only its result

git-svn-id: branches/hlcgllvm@28356 -
2014-08-10 13:19:26 +00:00
Jonas Maebe
bae1f72896 * handle cdecl varargs parameters in llvm procdef string representations
git-svn-id: branches/hlcgllvm@28355 -
2014-08-10 13:19:24 +00:00
Jonas Maebe
9225d43ccf * free temporary return parameter instance
git-svn-id: branches/hlcgllvm@28354 -
2014-08-10 13:19:10 +00:00
Jonas Maebe
ec77e64adc * fixed returns from functions that return their result in a parameter
git-svn-id: branches/hlcgllvm@28353 -
2014-08-10 13:18:59 +00:00
Jonas Maebe
575911dcb0 + support for (section-based) threadvars for LLVM
git-svn-id: branches/hlcgllvm@28352 -
2014-08-10 13:18:46 +00:00
Jonas Maebe
8e3062b1b6 * fixed the type specified to reference_reset_base() in
thlcgobj.paravarsym_set_initialloc_to_paraloc(): it has to be the type of
    pointer in the base register, not the type of the variable (and since this
    is a parameter on the stack, use voidstackpointertype rather than
    getpointerdef() for i8086 compatibility)

git-svn-id: branches/hlcgllvm@28351 -
2014-08-10 13:18:34 +00:00
Jonas Maebe
9e074d036b * migrated the handling of ansi/unicodestring constants to the high level
typed constant builder + llvm implementation

git-svn-id: branches/hlcgllvm@28327 -
2014-08-06 18:04:40 +00:00
Jonas Maebe
099588aaf5 * don't write comments in the LLVM IR about ait_section/ait_align elements,
as these can appear in the middle of aggregate constants and hence
    otherwise break the definition

git-svn-id: branches/hlcgllvm@28326 -
2014-08-06 18:04:36 +00:00
Jonas Maebe
5144a0d1e6 * only start a new object file for typed const data if we are instructed
to start a new section (no smart linking in the middle of section data)

git-svn-id: branches/hlcgllvm@28325 -
2014-08-06 18:04:33 +00:00
Jonas Maebe
c84a8a4bc2 * separate methods to get the size of the ansistring/unicode header and to
get the offset relative from the returned label from
    emit_(ansi|unicode)_string() to the start of the string data
   o corrected return value for the offset on LLVM: it's always equal to the
     header size, since we can't emit labels in the middle of structured data
     there

git-svn-id: branches/hlcgllvm@28324 -
2014-08-06 18:04:31 +00:00
Jonas Maebe
7a10959aa0 + support for parsing structured data for which no tdef is available in
advance (e.g. ansistring constants, as they consist of a header
    followed by an array of char equal to the string length, or RTTI data)
   o use begin_anonymous_record() to start recording the field types (if
     necessary for the current target), and end_anonymous_record() at the
     end to generate the recorddef

git-svn-id: branches/hlcgllvm@28323 -
2014-08-06 18:04:28 +00:00
Jonas Maebe
5a49727cdf * moved functionality to create a global recorddef based on a tfplist of
tdefs to the new trecorddef.create_global_from_deflist() constructor

git-svn-id: branches/hlcgllvm@28322 -
2014-08-06 18:04:24 +00:00
Jonas Maebe
dedf7e9384 + tabstractrecordsymtable.findfieldbyoffset() method to get the (first, in
case of variant records) fieldvarsym corresponding to the given offset

git-svn-id: branches/hlcgllvm@28321 -
2014-08-06 18:04:21 +00:00
Jonas Maebe
4f906fb9c9 * fixed datadef for untyped string constants (terminating #0 is one
character, not two)

git-svn-id: branches/hlcgllvm@28320 -
2014-08-06 18:04:19 +00:00
Jonas Maebe
53a5ccbfba * fixed some comments so they correspond to the current implementation
git-svn-id: branches/hlcgllvm@28319 -
2014-08-06 18:04:15 +00:00
Jonas Maebe
2a45b57504 * removed todo comment, the "constant" information is already propagated in
the mean time via the section type (sec_rodata/sec_rodata_norel ->
    constant)

git-svn-id: branches/hlcgllvm@28212 -
2014-07-12 22:42:37 +00:00
Jonas Maebe
5c8e723cf8 * handle the fact that we emit constant strings that can be longer or shorter
than their type at the Pascal level

git-svn-id: branches/hlcgllvm@28211 -
2014-07-12 22:42:31 +00:00
Jonas Maebe
ea9fbe381e * converted the generation of cst_conststring and cst_shortstring string
constants to the typed constant builder

git-svn-id: branches/hlcgllvm@28210 -
2014-07-12 22:42:26 +00:00
Jonas Maebe
bfe431913d * fixed writing hex-encoded characters in string constants
git-svn-id: branches/hlcgllvm@28209 -
2014-07-12 22:42:20 +00:00
Jonas Maebe
9fada1a238 * don't internalerror when typecasting voidpointer^ or formaldef
git-svn-id: branches/hlcgllvm@28208 -
2014-07-12 22:42:15 +00:00
Jonas Maebe
27e350fa9a + llvm implementation of second_int_to_real()
git-svn-id: branches/hlcgllvm@28207 -
2014-07-12 22:42:11 +00:00
Jonas Maebe
4746e17be5 * implemented second_int_to_int() for llvm
o the generic implementation ignores the need for bitcasts from pointers to
     ordinals and vice versa, and also hacks around with offsets

git-svn-id: branches/hlcgllvm@28206 -
2014-07-12 22:14:37 +00:00
Jonas Maebe
1c9932d921 * llvm implementation of tmoddivnode
o doesn't reuse the generic code generator methods, as the div-to-mul/shift
     optimization can be performed by llvm if necessary

git-svn-id: branches/hlcgllvm@28205 -
2014-07-12 22:14:22 +00:00
Jonas Maebe
d8394fc89c * call fpc_iocheck via hlcg.g_call_system_proc()
git-svn-id: branches/hlcgllvm@28204 -
2014-07-12 22:14:11 +00:00
Jonas Maebe
2dfbee45b1 * generate the callerside para/return location info in g_call_system_proc,
so that platform-specific versions of g_call_system_proc_intern() don't
    have to take care of this (since these methods call random routines from
    the system unit, this info may not yet be available)

git-svn-id: branches/hlcgllvm@28203 -
2014-07-12 22:14:02 +00:00
Jonas Maebe
8ca4c80785 * mark tasmsymbols as declared in the taillvmdecl constructor so that we
don't have to do this everywhere such a declaration is generated

git-svn-id: branches/hlcgllvm@28202 -
2014-07-12 22:13:50 +00:00
Jonas Maebe
b494f76b81 * made internalerror unique
git-svn-id: branches/hlcgllvm@28201 -
2014-07-12 22:13:39 +00:00
Jonas Maebe
7949bebb8d * synchronised with r28168 of trunk
git-svn-id: branches/hlcgllvm@28169 -
2014-07-05 21:30:28 +00:00
Jonas Maebe
063d50b4c9 * make the string data of p(wide)char string constants local (except when
using library-based smartlinking), as it is not exported

git-svn-id: branches/hlcgllvm@28167 -
2014-07-05 15:44:26 +00:00
Jonas Maebe
39074edf10 - removed the globalsymbolmangleprefix/suffix constants that were added for
llvm
  * instead, add LLVM-specific name mangling based on the asmsymbol's bind
    and typ whenever we write out its name

git-svn-id: branches/hlcgllvm@28166 -
2014-07-05 15:44:16 +00:00
svenbarth
441e6c6083 Fix for Mantis #26177. Use the correct value for the method data when using a method pointer of a type or record helper.
Please note that Delphi has the exact same bug as we have and thus code working in FPC will not work in Delphi.
Additionally taking the method address of a local variable or a local/global constant for a method pointer is dangerous as the variable (in case of constants is a temporary local variable) will go out of scope once the containing procedure/function/method exits!

ncgld.pas, tcgloadnode.pass_generate_code:
  * only use the value of Self if it is an implicit pointer object (class instance) or a class reference, but not for everything else (objects, records, primitive types)

+added test

git-svn-id: trunk@28160 -
2014-07-05 08:54:10 +00:00
nickysn
2b2224494b * call first_addpointer and first_cmppointer in pass_1 for pchars as well. Fixes
huge pointer arithmetic/comparison on huge pchars.

git-svn-id: trunk@28159 -
2014-07-04 23:58:26 +00:00
nickysn
c8130843b2 * fixed 'cannot convert type' error when comparing two voidhugepointers with
= or <>

git-svn-id: trunk@28158 -
2014-07-04 23:54:47 +00:00
nickysn
3bb730d5b9 + implemented normalized huge pointer comparison
git-svn-id: trunk@28157 -
2014-07-04 23:22:33 +00:00
nickysn
e80ecd4d5b + moved handling of pointer comparison in pass_1 to new virtual method
taddnode.first_cmppointer. To be overriden for i8086 huge pointer comparisons.

git-svn-id: trunk@28156 -
2014-07-04 22:47:21 +00:00
Jonas Maebe
eef6f05697 * specify the asm section type when creating an LLVM declaration
o in case it's a read-only section, mark the data as "constant"

git-svn-id: branches/hlcgllvm@28155 -
2014-07-04 20:30:24 +00:00
Jonas Maebe
394dfdd220 * ensure that all initialised items have a type (and only one):
o remove the accompanying tdef operands from tai operands, because such
     tai operands should have a tdef already
   o check that every queued tai is a tai_simpletypedconst (which have a
     type)
   o wrap queued bitcast/getelementptr tai instances with a
     tai_simpletypedconst

git-svn-id: branches/hlcgllvm@28154 -
2014-07-04 19:24:20 +00:00
Jonas Maebe
650fd162ea * fixed missing bracket in comment
git-svn-id: branches/hlcgllvm@28153 -
2014-07-04 19:24:17 +00:00
nickysn
7f9fa145e8 + added error message in case the HUGEPOINTERNORMALIZATION directive is used
with an invalid argument

git-svn-id: trunk@28152 -
2014-07-04 17:16:58 +00:00
nickysn
63305cc2e6 + added directive {$HUGEPOINTERARITHMETICNORMALIZATION} to control the
cs_hugeptr_arithmetic_normalization local setting
+ added the cs_hugeptr_comparison_normalization local setting and corresponding
  directive {$HUGEPOINTERCOMPARISONNORMALIZATION} to set it
* the {HUGEPOINTERNORMALIZATION} changed to set both of the huge pointer
  normalization settings, according to the specified compiler type ('BORLANDC',
  'MICROSOFTC' or 'WATCOMC')

git-svn-id: trunk@28151 -
2014-07-04 14:43:46 +00:00
nickysn
a3b48b79cb - rm the scan_w_hugepointernormalization_not_support message, replaced with
scanner_w_directive_ignored_on_target

git-svn-id: trunk@28150 -
2014-07-04 14:03:18 +00:00
nickysn
aee568e6fc * cs_hugeptr_normalization renamed to cs_hugeptr_arithmetic_normalization,
because we're going to also introduce cs_hugeptr_comparison_normalization as
  an independent option

git-svn-id: trunk@28149 -
2014-07-04 13:14:06 +00:00
Jonas Maebe
e18e98b540 * changed the type of the forcesize parameter of gethltemp() and friends
from aint to asizeint (fixes range check warning/error when compiling
    the AVR backend)

git-svn-id: branches/hlcgllvm@28147 -
2014-07-03 22:28:43 +00:00