Commit Graph

34644 Commits

Author SHA1 Message Date
Jonas Maebe
83dc297346 + Java interface support, mostly the same as Objective-C protocols
(generalised some error messages that were specific to protocols
     so they can also be used for Java interfaces)
  o note, Java interface support requires a fix to Jasmin 2.4:
    http://sourceforge.net/tracker/?func=detail&aid=2897170&group_id=100746&atid=628212

git-svn-id: branches/jvmbackend@18344 -
2011-08-20 07:49:19 +00:00
Jonas Maebe
b0d050a490 * pass all .j files related to one unit in one go to Jasmin instead of
invoking Jasmin once for every generated .j file

git-svn-id: branches/jvmbackend@18343 -
2011-08-20 07:49:07 +00:00
Jonas Maebe
505660262d + sqr(float) and trunc() support
git-svn-id: branches/jvmbackend@18342 -
2011-08-20 07:48:47 +00:00
Jonas Maebe
d3a4866cf5 * reorder processing of left/right for add nodes somewhat to make
it easier for the register allocator/optimizer to reduce the
    number of intermediate stores to the stack

git-svn-id: branches/jvmbackend@18341 -
2011-08-20 07:48:42 +00:00
Jonas Maebe
fda72aaed6 * made the remove_dummy_load_stores() implementation more extensible
and skip comments (so it works again when -ar is used, because
    tlhcgjvm.inc/decstack() insert comments in that case)

git-svn-id: branches/jvmbackend@18340 -
2011-08-20 07:48:38 +00:00
Jonas Maebe
b023627f6a * converted tcgcasenode.pass_generate_code() to hlcgobj
o changed type of opsize field of tcgcasenode from tcgsize into tdef,
     and fixed compilation of other code generator units after this change

git-svn-id: branches/jvmbackend@18339 -
2011-08-20 07:48:33 +00:00
Jonas Maebe
71b348757b * reversed expected operand order of tjvmhlcg.a_cmp_*(), because
that's how these operations also work on other architectures
  * fixed tjvmaddnode.second_generic_compare() for this new order

git-svn-id: branches/jvmbackend@18338 -
2011-08-20 07:48:27 +00:00
Jonas Maebe
87925db8fb * fixed 64 bit shl/shr/sar operations: the second argument of the
operation is 32 bit, not 64 bit (both in the compiler and in the
    JVM)
  * request a 64 rather than a 32 bit shift operation from tjvmshlshrnode
    if the result is 64 bit (rather than in case shift value is 64 bit,
    since as described above that never happens)

git-svn-id: branches/jvmbackend@18337 -
2011-08-20 07:48:23 +00:00
Jonas Maebe
8f727557c0 + JVM support for int_to_int, int_to_real, bool_to_int and
int_to_bool type conversions (includes bool_to_bool)

git-svn-id: branches/jvmbackend@18336 -
2011-08-20 07:48:18 +00:00
Jonas Maebe
e699eb3cc5 + added "list" parameter to thlcgjvm.inc/decstack() methods, and
in case of -ar add to the assembler output the height of the
    evaluation stack every time it's increased or decreased (to
    more easily track missing/wrong inc/decstack() operations)

git-svn-id: branches/jvmbackend@18335 -
2011-08-20 07:48:00 +00:00
Jonas Maebe
e1b6398b47 * don't give an "abstract method called" error for g_rangecheck()
if range checking is disabled

git-svn-id: branches/jvmbackend@18334 -
2011-08-20 07:47:44 +00:00
Jonas Maebe
dd2862e25a + support for floating point constants
git-svn-id: branches/jvmbackend@18333 -
2011-08-20 07:47:29 +00:00
Jonas Maebe
a1c50d0576 * make sure that comparisons with NaN always return false
git-svn-id: branches/jvmbackend@18332 -
2011-08-20 07:47:21 +00:00
Jonas Maebe
f250d5d494 + full JVM implementation for add-nodes and mat-nodes, except for
u64bit division/mod, and no overflow checking for divisions
    (none yet for add nodes either, but that has to be implemented
     in hlcgcpu rather than in the add-nodes themselves)

git-svn-id: branches/jvmbackend@18331 -
2011-08-20 07:47:05 +00:00
Jonas Maebe
e9f1856a61 * converted non-exception-related nodes to thlcgobj
git-svn-id: branches/jvmbackend@18330 -
2011-08-20 07:46:46 +00:00
Jonas Maebe
332f613cd7 + thlcgobj.maketojumpbool() implementation
git-svn-id: branches/jvmbackend@18329 -
2011-08-20 07:46:41 +00:00
Jonas Maebe
eb5814a868 * implemented declaring and calling constructors for Java classes
o handle them like for regular classes (return a class instance,
     although this is technically not true since they don't return
     anything; will be changed in the future)
   o because of the previous point, make sure that we handle the
     "function result" properly and don't pop too many values from
     the evaluation stack when calling one constructor from another
   o added "extra_pre_call_code" method used by njvmcal to insert
     the "new" opcode to create the new class instance before
     calling a constructor
   o when a constructor does not call any other constructor (inherited
     or otherwise), automatically insert a call to the inherited
     parameterless constructor as required by the jvm standard)
   TODO: check that *if* an inherited or other constructor is called
     from another constructor, that it does so as the first statement/
     call

git-svn-id: branches/jvmbackend@18328 -
2011-08-20 07:46:37 +00:00
Jonas Maebe
e2e32fbbe9 * fixed temp leaking after release_unused_return_value_cpu() refactor:
renamed refactored routine to do_release_unused_return_value()
    which by default releases temps, and if something else needs to
    be done override (and call inherited if temps may have to be
    released)

git-svn-id: branches/jvmbackend@18327 -
2011-08-20 07:46:31 +00:00
Jonas Maebe
1ace6ec201 + tobjectdef.jvm_full_typename() which returns the fully mangled type
name of a Java class (package/procname), extracted from jvmdef
  * several fixes to jvmmangledname (po_has_importdll only applies to
    unit-level procedures, replace incomplete mangling of class type names
    with call to jvm_full_typename()

git-svn-id: branches/jvmbackend@18326 -
2011-08-20 07:46:27 +00:00
Jonas Maebe
9a9ea1f257 + limited thlcg.gen_load_cgpara_loc() implementation (only loc_reference
support), passed through to original ncgutils version in thlcg2ll
  + thlcgobj.location_force_mem() implementation
  * order parameters for jvm similar to those for i386 without fixed_stack,
    so we don't need temporary paralocations
  * converted most of ncgcal to thlcg
  * disabled special handling for virtual methods for jvm in ncgcal, as all
    invocations are name-based there
  + njvmcal with special jvm callnode support:
   o always move the function result into a memory temp
   o when freeing an unused function result, use a_pop(2) and adjust
     the internal evaluation stack height counter
   o after the call instruction, adjust the evaluation stack height counter
     by subtracting the number of the pushed parameter slots, adjusted for
     the slots taken up by the function result

git-svn-id: branches/jvmbackend@18325 -
2011-08-20 07:46:22 +00:00
Jonas Maebe
c17d022a87 * allow overriding tparamanager.is_stack_paraloc() and let it always
return true for the JVM target (it uses the evaluation stack to
    pass all parameters)

git-svn-id: branches/jvmbackend@18324 -
2011-08-20 07:46:17 +00:00
Jonas Maebe
a5c70392c1 * also copy cgpara.def when creating temp paralocs
git-svn-id: branches/jvmbackend@18323 -
2011-08-20 07:45:56 +00:00
Jonas Maebe
b837694207 * factored out releasing an unused return value into
release_unused_return_value_cpu(), so it can be cleanly
    overridden by cpu-specific code

git-svn-id: branches/jvmbackend@18322 -
2011-08-20 07:45:44 +00:00
Jonas Maebe
817ebe5d8d + aliases for Java primitive types (jbyte, jshort, jint, jlong, jchar,
jsingle, jdouble, jboolean)

git-svn-id: branches/jvmbackend@18321 -
2011-08-20 07:45:39 +00:00
Jonas Maebe
d840d99231 + minimal Java rtl (based on embedded rtl, but with all code and most
declarations removed)

git-svn-id: branches/jvmbackend@18320 -
2011-08-20 07:45:34 +00:00
Jonas Maebe
6e82417a51 * various small support fixes for Java classes:
o support formal external definitions (like for objcclass)
   o allow specifying an "import_dll" for external Java classes, which can
     be used to specify the Java package name (like the dll for cppclass)
   o take the package name into account when mangling the Java class name
   o several messages that were specific to Objective-Pascal classes have
     been generalised because they also apply to Java classes, same for
     several compiler function names
   o disabled some proccall directives for Java, but more needs to happen
     (Java methods are always either instance-virtual or class-static)

git-svn-id: branches/jvmbackend@18319 -
2011-08-20 07:38:26 +00:00
Jonas Maebe
74d684878d * factored searching the exe directories from FindExe() into
FindFileInExeLocations()
  * search for jasmin.jar using FindFileInExeLocations and properly
    build the java command line, so jasmin can be called successfully
    by the compiler
  * properly create separate assembler files for each class, and
    correctly specify the class name and superclass for each class
    (units themselves are still hardcoded to descend from java.lang.Object)

git-svn-id: branches/jvmbackend@18318 -
2011-08-20 07:38:21 +00:00
Jonas Maebe
71deda6f50 + added interface to ncgutil.gen_load_loc_cgpara() to hlcgobj + generic
implementation (without loc_©mmregister support)
  * moved ncgutil.gen_load_return_value() to hlcgobj, and factored out
    architecture-specific behaviour to load an uninitialised function result
    into a virtual method (+ JVM-specific implementation of that method),
    gen_load_uninitialized_function_result()
  + added hlcgx86 unit and thlcgx86 type to override the
    thlcgobj.gen_load_uninitialized_function_result() method for x87
    function results; the i386 and x86_64 units now instantiate thlcgx86
    instead of thlcg2ll
  * moved calling of ncgutil.gen_load_loc_cgpara() from ncgcal also to hlcgobj
  -> returning function results works for JVM

git-svn-id: branches/jvmbackend@18317 -
2011-08-20 07:38:16 +00:00
Jonas Maebe
00cb8f5725 * made maxregs related information protected instead of private in trgobj,
as well as insert_regalloc_info_all()
  + "register" allocator for the jvm target, which simply replaces every
    virtual register with a temp. This is done for all register types in
    one pass, so that the temps can be easily reused without worrying
    about conflicts. Small optimisation: alloc/store/dealloc/load
    sequences for a single reg are removed (many of these are generated
    because most cg nodes return their value in a register which is then
    immediately consumed by the parent)
  * map addressregisters to integer registers with size R_SUBD, because
    they require one stackslot (the subregister type is used by rgcpu
    to determine the size of the temp it has to allocate)

git-svn-id: branches/jvmbackend@18316 -
2011-08-20 07:38:11 +00:00
Jonas Maebe
8439e1472e * moved def2regtyp() from jvm/hlcgcpu to defutil, and extended it to
handle vectorfpu (floatdef->MMREG) and softfloat (floatdef->INTREG)
  + thlcg.getregisterfordef(), which uses def2regtyp() to allocate a register
    appropriate to hold values of that tdef type
  + generic thlcg.location_force_reg() implementation. Note that for
    low-level code generator targets it may be slightly less efficient than
    the implementation in hlcg2ll (from ncgutil) because it does not play
    any tricks with the register or location size, or with reference offsets,
    to truncate values

git-svn-id: branches/jvmbackend@18315 -
2011-08-20 07:38:06 +00:00
Jonas Maebe
e4d322bcdb + default implementation for for the *_checkoverflow() methods in case
setflags is false
  * don't call the *_checkoverflow() methods from ncgadd with setflags
    = true in case cs_check_overflow is disabled

git-svn-id: branches/jvmbackend@18314 -
2011-08-20 07:38:01 +00:00
Jonas Maebe
4ff56b2471 + jvm compiler target
git-svn-id: branches/jvmbackend@18313 -
2011-08-20 07:37:52 +00:00
Jonas Maebe
20c577103f + list of keywords that are reserved in Java and the JVM, for future
checking by the parser

git-svn-id: branches/jvmbackend@18312 -
2011-08-20 07:37:47 +00:00
Jonas Maebe
94ed2ac649 + jvm/java target support
git-svn-id: branches/jvmbackend@18311 -
2011-08-20 07:37:42 +00:00
Jonas Maebe
9eca0dc1c2 - disabled RTTI generation for the jvm target (Delphi-style RTTI
is not (yet) supported there, use Java-style RTTI instead)

git-svn-id: branches/jvmbackend@18310 -
2011-08-20 07:37:38 +00:00
Jonas Maebe
1e2c70796e + jvm (cpu architecure) and java ("OS"/target) identifiers
+ basic target information for jvm target (assembling/linking
    helpers are still dummies for now)
  + basic jasmin assembler writer
  + cpunode and cputarg units to include the target units in the
    compiler

git-svn-id: branches/jvmbackend@18309 -
2011-08-20 07:37:33 +00:00
Jonas Maebe
742f4ee12e + first (partial) implementation of thlcg for the jvm
+ added arrayreftype field to treference for the jvm, because
    array loads have to be performed using special instructions,
    so this information has to be passed on to the code generator.
    This information will have to be added in t(cg)vecnode.
  * moved concatenating the generated code for a procedure to the
    al_procedures list to thlcg.record_generated_code_for_procdef(),
    which is overridden by jvm/hlcgcpu to attach that code to the
    procdef it belongs with. The reason is that a Java class file
    can only contain code for one class, so we have to write out
    the assembler grouped per class instead of in the order the
    routines appear in the source code
  * also committed forgotten changes in psub after moving the
    register allocator initialisation to hlcgobj

git-svn-id: branches/jvmbackend@18308 -
2011-08-20 07:37:26 +00:00
Jonas Maebe
4446be97b7 + tjvmprocinfo, only overrides set_first_temp_offset() and sets it to
procdef.calleeargareasize (since all arguments are placed on the
    locals stack on the calleeside)

git-svn-id: branches/jvmbackend@18307 -
2011-08-20 07:37:20 +00:00
Jonas Maebe
72fc911dcf + jvm parameter manager: on the caller side, all arguments are pushed
on the evaluation stack, while on the callee side they are placed
    in local variables 1..n
   o the jvm only supports call-by-value. call-by-reference parameters
     will have to be emulated at a higher level
   o similarly, ret_in_param() always returns false
   o all function results are returned on the evaluation stack (both
     on the caller and callee side)

git-svn-id: branches/jvmbackend@18306 -
2011-08-20 07:37:12 +00:00
Jonas Maebe
05b919b821 + very basic tcgjvm (basically only implements the register allocator
initialisation in addition to what tcg already supports)

git-svn-id: branches/jvmbackend@18305 -
2011-08-20 07:37:04 +00:00
Jonas Maebe
fe99c93619 + pbestrealtype for JVM
git-svn-id: branches/jvmbackend@18304 -
2011-08-20 07:36:59 +00:00
Jonas Maebe
9fc3616179 * put the code to generate the default mangled name for procdefs into
a separate method (defaultmangledname)
  * for the jvm target, call jvmmangledname() instead of defaultmangledname()
    from mangledname()
  * make non-strict private and protected methods "public" in the Java bytecode,
    because a single Java class file contains only code from one class, and such
    methods can be accessed from other classes in the same unit too
  * minor fixes to the jvm mangled name generation

git-svn-id: branches/jvmbackend@18303 -
2011-08-20 07:36:54 +00:00
Jonas Maebe
35ca5b799b * list -> current_asmdata.CurrAsmList for cpuhighleveltarget code
git-svn-id: branches/jvmbackend@18302 -
2011-08-20 07:36:48 +00:00
Jonas Maebe
07130a0c71 + added register allocation methods from cgobj also to hlcgobj,
call through to cgobj

git-svn-id: branches/jvmbackend@18301 -
2011-08-20 07:36:42 +00:00
Jonas Maebe
09ac60b084 + a_call_name_inherited(), by default calls a_call_name() (for the JVM
target you have to use a different opcode for calling inherited methods
    than for regular methods)

git-svn-id: branches/jvmbackend@18300 -
2011-08-20 07:36:35 +00:00
Jonas Maebe
9022370bde + basic defines for jvm target (CPUJVM, ...)
* disable most features for jvm target (compiler-only port)

git-svn-id: branches/jvmbackend@18299 -
2011-08-20 07:36:29 +00:00
Jonas Maebe
0b7687f4f5 * fixed compilation
git-svn-id: branches/jvmbackend@18298 -
2011-08-20 07:36:22 +00:00
Jonas Maebe
c84ec623dd * made setfirsttemp() virtual and override it in jvm/tgcpu so it no
longer aligns the temp offset in case it's odd (not required for
    jvm)
  * ignore the "def" argument in alloctemp() for the jvm since all stack
    slots can be reused for anything there, and reformatted its alloctemp()

git-svn-id: branches/jvmbackend@18297 -
2011-08-20 07:36:14 +00:00
Jonas Maebe
dc8df7fe79 * define cpu32bit for the JVM target (used by psystem to initialise
default integer types)
  * define CPUDEFINED in pp.pas if JVM is defined
  * initialise the fpu types and currency in psystem for the JVM target

  * set uinttype/sinttype to 32 bit types also for all cpu32bitaddr cpus
    by default (required for JVM, which has a 64 bit alu but 32 bit
    "addresses" -- an address takes up 1 stack slot, a 64 bit int two;
    also, array indices are limited to 32 bit)

git-svn-id: branches/jvmbackend@18296 -
2011-08-20 07:36:08 +00:00
Jonas Maebe
a19220f106 * cpu64bitaddr -> cpu64bitalu in location.free (whether or not
64 bit registers are represented as a pair of 32 bit registers
    in a register64 struct depends on whether or not the ALU can
    perform 64 bit operations -- if it can, assume there are 64
    bit registers)

git-svn-id: branches/jvmbackend@18295 -
2011-08-20 07:35:59 +00:00