Jonas Maebe
bd8079f896
* cache and reuse procvardefs internally created to get the address of a
...
procdef (halves the amount of memory needed to compile the googlapi
package using a build unit, as done by fpmake)
git-svn-id: trunk@30856 -
2015-05-14 15:36:20 +00:00
Jonas Maebe
8034ef1f31
* support for dynamic strings and arrays in update_reference_reg_mul()
...
git-svn-id: trunk@30784 -
2015-05-03 16:51:13 +00:00
Jonas Maebe
eae68e86a1
* don't insert a typeconversion from pasbool to int in case the left
...
location was LOC_JUMP or LOC_FLAGS, as in that case the generic
code has already done this using location_force_reg()
git-svn-id: trunk@30783 -
2015-05-03 16:51:10 +00:00
Jonas Maebe
8f1fb60f61
* also collect the llvm type info from the initialisation data of typed
...
constants
git-svn-id: trunk@30782 -
2015-05-03 16:51:06 +00:00
Jonas Maebe
74da8720c5
* insert type conversions in case a symbol is declared via 'external' as an
...
alias for another symbol with a different type (such as
FPC_ANSISTR_UNIQUE, which is defined as a function and referenced as a
procedure)
git-svn-id: trunk@30781 -
2015-05-03 16:51:02 +00:00
Jonas Maebe
d546e74d1c
* don't write newlines after nested taillvm instructions (since they're
...
embedded in the middle of another instruction)
git-svn-id: trunk@30779 -
2015-05-03 16:50:55 +00:00
Jonas Maebe
4a5b7b7d50
* once we've defined a symbol as an alias, it's declared to the same extent
...
as a regular symbol definition
git-svn-id: trunk@30778 -
2015-05-03 16:50:51 +00:00
Jonas Maebe
8234fcd229
* implemented thlcgllvm.g_external_wrapper by just declaring the new symbol
...
as an alias for the old one (rather than creating an interprocedural
jump, which is not possible in llvm IR and which is less efficient
anyway) (declaration for this method was already accidentally committed
in r30722)
git-svn-id: trunk@30777 -
2015-05-03 16:50:47 +00:00
Jonas Maebe
72277f5098
* store the used tabstractprocdef when generating an llvm call instruction,
...
because due to aliasing symbols a single symbol may be called using
different procdefs (e.g. FPC_ANSISTR_UNIQUE in the system unit is defined
as an alias for a function and called as a procedure). This means we have
to insert extra type conversions for llvm, which requires both the source
and destination type
git-svn-id: trunk@30776 -
2015-05-03 16:50:43 +00:00
Jonas Maebe
864f9b24cc
* handle indexing implicit pointer types on llvm
...
git-svn-id: trunk@30723 -
2015-04-25 15:51:39 +00:00
Jonas Maebe
98c5f7d20f
* simplify references before generating getelementptr instructions with them
...
git-svn-id: trunk@30722 -
2015-04-25 15:51:36 +00:00
Jonas Maebe
78e68b89df
* gen_load_cgpara_loc() should only honour reusepara if it's a memory
...
parameter
git-svn-id: trunk@30721 -
2015-04-25 15:51:33 +00:00
Jonas Maebe
03a3136525
* since extended values are represented as "array[1..10] of byte" in records
...
for llvm in order to ensure that it doesn't allocate the ABI-specified
size, we have to convert the resulting pointer to an array of 10 bytes
into a pointer to extended when we subscript the record (like is already
done for arrays)
git-svn-id: trunk@30720 -
2015-04-25 15:51:30 +00:00
Jonas Maebe
b9138a1c90
* changed the llvm type of comp/currency in parameter and return type
...
on platforms that use the x87 for these types to extended in order
to gaurantee the expected parameter passing conventions
git-svn-id: trunk@30719 -
2015-04-25 15:51:27 +00:00
Jonas Maebe
491d9cfff1
* fixed reuse of the same register for different types in
...
a_loadaddr_ref_reg()
git-svn-id: trunk@30718 -
2015-04-25 15:51:25 +00:00
Jonas Maebe
b3e786eb77
- don't specify lef_inaggregate when getting the llvm type representation
...
for function results and parameters (they're not in an aggregate, and this
caused 80 bits extended floating point types to be translated into arrays
of 10 bytes, which have different ABI meanings)
git-svn-id: trunk@30714 -
2015-04-25 15:51:13 +00:00
Jonas Maebe
bb4f8e62bf
* sign/zero-extend a Pascal boolean (translated to i1) when assigning to
...
an i8, even though both have byte size 1
git-svn-id: trunk@30713 -
2015-04-25 15:51:09 +00:00
Jonas Maebe
394091ab75
* don't generate parameter attributes for llvm function alias declarations
...
git-svn-id: trunk@30712 -
2015-04-25 15:51:06 +00:00
Jonas Maebe
70ffaba901
* ensure that the loading of the uninitialised function result for llvm
...
doesn't result in a temp allocation, since this can happen while
generating the exit code
git-svn-id: trunk@30711 -
2015-04-25 15:51:04 +00:00
Jonas Maebe
f7b5ee64ae
* always insert type conversion for pasbool to int on llvm, as pasbool is
...
represented by i1 while equally sized integers are i8
git-svn-id: trunk@30709 -
2015-04-25 15:50:58 +00:00
Jonas Maebe
62239ba890
* handle named registers correctly for fpu and mm loads
...
git-svn-id: trunk@30677 -
2015-04-19 21:37:52 +00:00
Jonas Maebe
3496129f79
* only handle a_load_const_ref() directly when storing ordinals, as in case
...
of pointers llvm only supports 0 (as null, which we don't generate either)
git-svn-id: trunk@30676 -
2015-04-19 21:37:49 +00:00
Jonas Maebe
e2cf90ad8a
* add type declarations for structure types in the llvm code so that we can
...
handle recursive record references (rec= record prec: ^rec)
o llvm unfortunately does not support recursive references to array types
or function pointers, so those will currently still result in endless
recursion when the compiler tries to write them out. Solving those
will require a lot of typecasting in the generated code
git-svn-id: trunk@30675 -
2015-04-19 21:37:46 +00:00
Jonas Maebe
2bb4a729c0
* procvardefs must be encoded without any parameter attributes
...
git-svn-id: trunk@30673 -
2015-04-19 21:37:40 +00:00
Jonas Maebe
c8e44e4a7c
* keep track of whether we're in an inline assembly block in the llvm
...
assembler writer, and for now skip writing labels if we are (they
will have to emitted as part of an actual inline assembly block,
not as llvm-style labels)
git-svn-id: trunk@30672 -
2015-04-19 21:37:37 +00:00
Jonas Maebe
4a25afb839
* load an undef value in the function result in the exit code of a pure
...
assembler function, as the inline assembly code itself will be
responsible for returning the function result (we will have to add
the "return" instruction to it) while llvm requires a terminator
at the end of the function and it must return something
git-svn-id: trunk@30671 -
2015-04-19 21:37:34 +00:00
Jonas Maebe
ff3061a7cf
+ thlcgllvm.gen_load_uninitialized_function_result
...
git-svn-id: trunk@30670 -
2015-04-19 21:37:31 +00:00
Jonas Maebe
07141e92d3
+ support for llvm "undef" operand
...
git-svn-id: trunk@30669 -
2015-04-19 21:37:27 +00:00
Jonas Maebe
6391794958
* fixed -Oodfa warnings
...
git-svn-id: trunk@30500 -
2015-04-08 19:08:39 +00:00
Jonas Maebe
af61923dc3
* don't write parameter attributes in procvardefs
...
git-svn-id: trunk@30499 -
2015-04-08 19:08:36 +00:00
Jonas Maebe
a8cefa8fcd
- removed aggas.pas leftovers
...
git-svn-id: trunk@30498 -
2015-04-08 19:08:33 +00:00
Jonas Maebe
101fc3d4ec
* translate formaldef into "i8*", as intended, instead of "i8**" due to
...
the fact that this type is always passed by reference
git-svn-id: trunk@30486 -
2015-04-07 19:35:22 +00:00
Jonas Maebe
f94f9f44e4
* convert all arguments to integers in case of comparisons of pointers with
...
constants on llvm, as you can only compare with "null" in that case
* convert all arguments to integers in case of pointer subtractions,
as pointer subtractions are not supported by llvm
git-svn-id: trunk@30485 -
2015-04-07 19:35:08 +00:00
Jonas Maebe
94aadb23ab
+ implemented getintparaloc() for llvm
...
git-svn-id: trunk@30430 -
2015-04-04 14:29:19 +00:00
Jonas Maebe
2336d22985
* override instr_get_oper_spilling_info and substitute_spilled_registers for
...
llvm (add support for top_para)
git-svn-id: trunk@30428 -
2015-04-04 14:29:12 +00:00
Jonas Maebe
e12dff9a5e
* support top_para in trgllvm.get_spill_temp()
...
git-svn-id: trunk@30426 -
2015-04-04 14:29:06 +00:00
Jonas Maebe
ee7198aa57
* fixed memory leak in case one tai operand is replaced by another
...
git-svn-id: trunk@30424 -
2015-04-04 14:29:00 +00:00
Jonas Maebe
3279cc052a
* moved llvm-specific code from aasmtai to aasmllvm
...
* call add_reg_instruction_hook() for top_para parameters
git-svn-id: trunk@30423 -
2015-04-04 14:28:57 +00:00
Jonas Maebe
2ef753faae
* support llvm spilling_get_reg_type() for the destination of call/invoke
...
git-svn-id: trunk@30422 -
2015-04-04 14:28:54 +00:00
Jeppe Johansen
e2272c8a7e
Added aitconst_gs for AVR pointer references to Flash.
...
git-svn-id: trunk@30419 -
2015-04-04 10:29:11 +00:00
Jonas Maebe
f631430775
* made the allocation of labels for internal data in typed const builders
...
overridable, and implement those routines for llvm
git-svn-id: branches/hlcgllvm@30348 -
2015-03-28 11:34:04 +00:00
Jonas Maebe
e12bd99b59
* fixed compilation with -dllvm after r30343
...
git-svn-id: branches/hlcgllvm@30347 -
2015-03-28 11:34:02 +00:00
Jonas Maebe
5a2609933f
* fixed crash in r30244 (we only have to get a new elementdef if we didn't
...
already initialise the location, and we won't get a new elementdef if
the location is already assigned)
git-svn-id: branches/hlcgllvm@30346 -
2015-03-28 11:33:59 +00:00
Jonas Maebe
e924dbed90
* moved the specification of the options for a ttai_typedconstbuilder from
...
get_final_asmlist() to the constructor, in preparation of supporting the
creation of internal builders for local data that will ignore some of the
irrelevant flags (at creation time)
git-svn-id: branches/hlcgllvm@30334 -
2015-03-27 21:25:27 +00:00
Jonas Maebe
765044aede
* fixed a number of (mostly false) warnings regarding uninitialised
...
variables with -Oodfa
git-svn-id: branches/hlcgllvm@30244 -
2015-03-15 21:10:50 +00:00
Jonas Maebe
bc7ba58798
* fixed compilation after removal of ait_set, ait_thumb_set and ait_symbol_pair
...
git-svn-id: branches/hlcgllvm@30243 -
2015-03-15 21:10:47 +00:00
Jonas Maebe
c1e7c9de02
* support for flushing a ttai_typedconstbuilder queue with an ordinal
...
constant at the end (in case of e.g. ordinal -> pointer type
conversions)
git-svn-id: branches/hlcgllvm@30128 -
2015-03-07 21:43:57 +00:00
Jonas Maebe
eba3f534de
* correctly handle empty ansistring constants for llvm
...
git-svn-id: branches/hlcgllvm@30127 -
2015-03-07 21:43:52 +00:00
Jonas Maebe
935c0c86aa
* write all ait_const's of value 0 as 'zeroinitializer' so they also work
...
for pointer constants
git-svn-id: branches/hlcgllvm@30126 -
2015-03-07 21:43:47 +00:00
Jonas Maebe
9c42437326
* moved tasmlisttypedconstbuilder.tc_emit_string_offset() to
...
ttai_typedconstbuilder.emit_string_offset() so it can also be used outside
the context of parsing a Pascal-level typed constant
git-svn-id: branches/hlcgllvm@30111 -
2015-03-06 19:45:04 +00:00
Jonas Maebe
511e878606
* fixed pointer plus/minus integer on llvm (since a_op_* only gets a single
...
def, we have to ensure that both arguments have in fact the same type)
git-svn-id: branches/hlcgllvm@30108 -
2015-03-05 22:45:32 +00:00
Jonas Maebe
f9ae2aadac
* fixed llvm unsigned greater/lower than condition mnemoniics
...
git-svn-id: branches/hlcgllvm@30107 -
2015-03-05 22:20:50 +00:00
Jonas Maebe
ea00e559f8
* fixed compilation after previous merge
...
git-svn-id: branches/hlcgllvm@30106 -
2015-03-05 22:20:45 +00:00
Jonas Maebe
cc596225fa
+ thlcg.g_ptrtypecast_reg/ref() to typecast a pointer in a register, or the
...
pointer type describing a reference, to another pointer type
git-svn-id: branches/hlcgllvm@28781 -
2014-10-06 20:54:33 +00:00
Jonas Maebe
76e0ee7a41
* fixed adding padding bytes before anonymous records: the alignment of such
...
records is only known once we have completely parsed all of their data
(the alignment of a record depends on the alignment requirements of its
field with the largest alignment) -> only insert the padding bytes after
completely parsing them
git-svn-id: branches/hlcgllvm@28765 -
2014-10-06 20:53:51 +00:00
Jonas Maebe
5a9b931e5c
* renamed ttai_lowleveltypedconstbuilder to ttai_typedconstbuilder
...
git-svn-id: branches/hlcgllvm@28764 -
2014-10-06 20:53:49 +00:00
Jonas Maebe
d2b55b6f07
* moved the recording of aggregate type information during typed constant
...
parsing from nllvmtcon to aasmcnst
o added automatic insertion of padding bytes when fields need to be aligned,
so that once ncgvmt (and hopefully ncgrtti) are converted to the typed
constant builder class, we can get rid of all the explicit alignment
directives (only supported for non-bitpacked records for now)
git-svn-id: branches/hlcgllvm@28763 -
2014-10-06 20:53:46 +00:00
Jonas Maebe
bdb22772d9
* fixed whitespace
...
git-svn-id: branches/hlcgllvm@28756 -
2014-10-06 20:53:28 +00:00
Jonas Maebe
210b532832
* split up specifying the type of the section of a typed constant and whether
...
it should be put in a new section
git-svn-id: branches/hlcgllvm@28753 -
2014-10-06 20:53:20 +00:00
Jonas Maebe
6677e698cd
* record the alignment in taillvmdecl, as it can be different from the
...
default
git-svn-id: branches/hlcgllvm@28752 -
2014-10-06 20:53:17 +00:00
Jonas Maebe
37009c917b
* pass alignment to tnodeutils.insertbsssym()
...
git-svn-id: branches/hlcgllvm@28751 -
2014-10-06 20:53:14 +00:00
Jonas Maebe
864b36fbe5
* create the recorddef at the start when building an anonymous recorddef,
...
so that we can already refer to its def while we are sill parsing
individual elements
git-svn-id: branches/hlcgllvm@28750 -
2014-10-06 20:53:12 +00:00
Jonas Maebe
b710220a5e
* fixed calldef specified in case of calling a varargs C function
...
git-svn-id: branches/hlcgllvm@28494 -
2014-08-19 20:22:59 +00:00
Jonas Maebe
d09243c8c1
* correctly handle make_simple_ref() for voidpointers
...
git-svn-id: branches/hlcgllvm@28493 -
2014-08-19 20:22:56 +00:00
Jonas Maebe
33c277b3a7
+ temp_to_ref() implementation for llvm
...
git-svn-id: branches/hlcgllvm@28491 -
2014-08-19 20:22:50 +00:00
Jonas Maebe
0fbaa9e924
* record the alignment of temps, and set it when creating a reference based
...
on a temp instead of assuming it's always aligned to a multiple of
the stackpointer size
git-svn-id: branches/hlcgllvm@28490 -
2014-08-19 20:22:48 +00:00
Jonas Maebe
9880b53242
* changed all alignment parameters in the temp manager to shortint
...
git-svn-id: branches/hlcgllvm@28489 -
2014-08-19 20:22:45 +00:00
Jonas Maebe
dd733bd5b5
* changed all size parameters in the temp manager from longint to asizeint
...
git-svn-id: branches/hlcgllvm@28488 -
2014-08-19 20:22:42 +00:00
Jonas Maebe
344acef9b5
* separate tracking the def of a temp and whether or not it needs to be
...
finalised (for llvm, we always keep track of the def)
git-svn-id: branches/hlcgllvm@28485 -
2014-08-19 20:22:34 +00:00
Jonas Maebe
3b7f43ad77
* renamed (hl)gettemptyped() to (hl)gettempmanaged() to better indicate the
...
meaning
git-svn-id: branches/hlcgllvm@28484 -
2014-08-19 20:22:32 +00:00
Jonas Maebe
9d118567cd
+ support for a_call_reg() on the llvm target (can call simple procvars now)
...
git-svn-id: branches/hlcgllvm@28480 -
2014-08-19 20:22:21 +00:00
Jonas Maebe
bd3f0b3ada
* factored out the common calling code from a_call_name (to reuse in
...
a_call_reg()
git-svn-id: branches/hlcgllvm@28478 -
2014-08-19 20:22:16 +00:00
Jonas Maebe
b6fc2f1542
* don't emit the */pointer suffix for procdefs in llvmaddencodedtype_intern(),
...
so that if a_loadaddr_ref_reg() is used to load the address of a procdef
into a register, the getpointerdef(procdef) won't (wrongly) result in two
*'s
o the previous behaviour was necessary for the tck_simple_procvar2proc
special case that was removed in the previous commit
git-svn-id: branches/hlcgllvm@28477 -
2014-08-19 20:22:13 +00:00
Jonas Maebe
cc4482d6f8
- removed tck_simple_procvar2proc, instead use
...
procdef.getcopyas(procvardef,pc_address_only) as the def if we want to
specify that we're interested in the address of a procedure/procvar of
object
git-svn-id: branches/hlcgllvm@28476 -
2014-08-19 20:22:11 +00:00
Jonas Maebe
4e3f504caa
* don't try to check whether the last parameter of a cdecl function is a
...
varargs parameter if it doesn't have any parameters
git-svn-id: branches/hlcgllvm@28399 -
2014-08-12 23:17:43 +00:00
Jonas Maebe
6aafe209d0
+ llvm second_length() implementation (can't use generic one because of its
...
use of cg.makeregsize())
git-svn-id: branches/hlcgllvm@28389 -
2014-08-12 18:59:19 +00:00
Jonas Maebe
a2e0f729c6
* use the correct opcode when loading integer pointer constants (such as nil)
...
git-svn-id: branches/hlcgllvm@28386 -
2014-08-12 18:59:10 +00:00
Jonas Maebe
0867b6e4f8
* added missing {$i fpcdefs.inc}
...
git-svn-id: branches/hlcgllvm@28378 -
2014-08-10 19:40:34 +00:00
Jonas Maebe
4acd43c643
* don't force simple function results in memory
...
o results in simpler code, and more importantly is required for some code
that expects a LOC_REGISTER after calling certain system unit helpers
(e.g. in ncgutil.new_exception)
git-svn-id: branches/hlcgllvm@28375 -
2014-08-10 19:40:26 +00:00
Jonas Maebe
ac4c455991
* handle non-integer/non-record memory destinations in gen_load_cgpara_loc()
...
git-svn-id: branches/hlcgllvm@28374 -
2014-08-10 19:40:24 +00:00
Jonas Maebe
50274f58b6
* ignore get/unget/alloc/dealloc of cpu registers when generating llvm code
...
o there are no cpu registers on the llvm target, but generic code may still
occasionally allocate them via the generic routines in case of e.g. a
hardcoded use of a function return register
git-svn-id: branches/hlcgllvm@28373 -
2014-08-10 19:40:21 +00:00
Jonas Maebe
0aab46b97f
+ tllvmtypeconvnode.second_int_to_bool() implementation
...
git-svn-id: branches/hlcgllvm@28370 -
2014-08-10 19:40:13 +00:00
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
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
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
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
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
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
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
bfe431913d
* fixed writing hex-encoded characters in string constants
...
git-svn-id: branches/hlcgllvm@28209 -
2014-07-12 22:42:20 +00:00