* lib/jit_alpha.c: Correct wrong bitmask of most argument
float register arguments, that were being set as callee
save instead of argument registers class.
* lib/jit_arm-sz.c: Regenerate table of known maximum
instruction sizes for the software float fallback,
that implements "virtual" float registers in the stack
and operations as calls to libgcc.
* size.c: Correct typo in the generated jit_arm-sz.c file.
* include/lightning/jit_alpha.h, lib/jit_alpha-cpu.c,
lib/jit_alpha-fpu.c, lib/jit_alpha-sz.c, lib/jit_alpha.c:
New files implementing a lightning Alpha port. Thanks
to Trent Nelson and snakebit.net staff for providing access
to an Alpha system.
* check/float.tst, check/lightning.c, configure.ac,
include/lightning.h, include/lightning/Makefile.am,
include/lightning/jit_private.h, lib/Makefile.am,
lib/jit_disasm.c, lib/jit_size.c, lib/lightning.c:
Minor changes to adapt for the new Alpha port.
* lib/lightning.c: Always mark JIT_RET and JIT_FRET as
live in a function epilog. This is required because
on some ports a complex sequence, allocating one or more
registers, may be required to jump from a ret* to the
epilog, and the lightning api does not have annotations
to know if a function returns a value, or the type of
the return value.
* lib/jit_memory.c: Do not call free on NULL pointers.
* include/lightning/jit_private.h, lib/jit_note.c,
lib/lightning.c: Add a wrapper to memcpy and memmove
to not actually call those functions with a zero size
argument, and likely also a null src or dst.
* include/lightning/jit_private.h, lib/jit_disasm.c,
lib/lightning.c: Remove the global jit_progname variable.
It was being only used in jit_init_debug, that is called
from init_jit, so, just pass an argument.
* include/lightning/jit_aarch64.h, include/lightning/jit_arm.h,
include/lightning/jit_hppa.h, include/lightning/jit_ia64.h,
include/lightning/jit_mips.h, include/lightning/jit_ppc.h,
include/lightning/jit_private.h, include/lightning/jit_s390x.h,
include/lightning/jit_sparc.h, include/lightning/jit_x86.h:
Do not add jit_regset_t, JIT_RA0, and JIT_FA0 to the installed
header file. These types and definitions are supposed to be
only used internally.
lib/jit_arm-cpu.c: Only adjust stack pointer in prolog if
need stack space, that is, do not emit a nop instruction
subtracting zero from the stack pointer.
* lib/jit_disasm.c: Correct a crash in the doc/printf example
on arm due to releasing the data_info information in
jit_clear_state. This is a special case for arm only, and
actually, only armv5 or older uses the data_info buffer,
or when forcing arm instruction set mode besides thumb
available.
* doc/body.texi: Write detailed description and examples for
jit_get_memory_functions, jit_set_memory_functions,
jit_get_code, jit_set_code, jit_get_data and jit_set_data.
* include/lightning.h, include/lightning/jit_private.h,
lib/lightning.c: Implement the new jit_set_data() interface,
and the new jit_get_data() helper. Like jit_set_code(),
jit_realize() should be called before jit_set_data().
The most common usage should be jit_set_data(JIT_DISABLE_DATA
| JIT_DISABLE_NOTE), to force synthesize any float/double
constant in the stack and not generate any debug information.
* lib/jit_note.c: Minor change to debug note generation as
now it uses an alternate temporary data buffer during constants
and debug generation to accommodate the possibility of the user
setting an alternate data buffer.
* lib/jit_hppa-fpu.c, lib/jit_s390x.c, lib/jit_s390x-cpu.c,
lib/jit_s390x-fpu.c, lib/jit_sparc.c, lib/jit_sparc-fpu.c,
lib/jit_x86-sse.c, lib/jit_x86-x87.c: Implement jit_set_data.
* lib/jit_hppa-sz.c, lib/jit_sparc-sz.c, lib/jit_x86-sz.c,
lib/jit_s390x-sz.c: Update for several instructions that now
have a different maximum length due to jit_set_data.
* lib/jit_mips-fpu.c: Implement jit_set_data, but missing
validation on n32 and n64 abis (and/or big endian).
* lib/jit_mips-sz.c: Update for changes in o32.
* lib/jit_ppc-fpu.c: Implement jit_set_data, but missing
validation on Darwin PPC.
* lib/jit_ppc-sz.c: Update for changes in powerpc 32 and
64 bit.
* lib/jit_ia64-fpu.c: Implement untested jit_set_data.
* TODO: Add note to list ports that were not tested for the
new jit_set_data() feature, due to no longer having access
to them.
* check/nodata.c: New file implementing a simple test exercising
several different conditions created by jit_set_data().
* check/check.nodata.sh: New file implementing a wrapper
over the existing *.tst files, that runs all tests without
using a data buffer for constants; only meaningful (and
enabled) on architectures that used to store float/double
constants on a read only data buffer.
* configure.ac, check/Makefile.am: Update for the new test
cases.
* check/lightning.c: Implement the new "-d" option that
sets an internal flag to call jit_set_data() disable
constants and debug, that is, using only a pure code
buffer.
* include/lightning.h, include/lightning/jit_private.h,
lib/lightning.c: Implement the new jit_set_code() interface,
that allows instructing lightning to use an alternate code
buffer. The new jit_realize() function should be called
before jit_set_code(), and usually call jit_get_code()
to query the amount of bytes expected to be required for
the code.
* lib/jit_size.c: Minor update to have less chances of
miscalculating the code buffer by starting the counter
with the size of the longest instruction instead of zero,
as code emit fails if at any moment less than the longest
instruction bytes are available.
* check/setcode.c: New file implementing some basic tests
of the new jit_set_code() interface.
* check/Makefile.am: Update for newer test case.
* include/lightning.h, lib/lightning.c: Add the new
jit_indirect() call, that returns a special label node,
and tells lightning that the label may be the target of
an indirect jump.
* doc/body.texi: Document the new jit_indirect() call, and
add examples of different ways to create labels and branches.
* lib/jit_x86.c: Rewrite previous patch to inline save/restore
because clobbering %ebx in x86 is treated as an error
(jit_x86.c:239:5: error: PIC register clobbered by 'ebx' in 'asm').
* lib/jit_x86.c: Rewrite incorrect inline assembly that could
truncate a variable in a callee save register. Now it simply
tells gcc that the register is clobbered, instead of using a
*32 bit* swap with a temporary variable. The problem only
happens when compiling with optimization.
* lib/jit_x86-cpu.c: Use the emms instruction before
calling any function. This is particularly important
when using c99 complex functions as it can easily
overflow the x87 stack due to the way lightning uses
the x87 stack as a flat register file.
* include/lightning/jit_arm.h, lib/jit_arm-cpu.c: Do not use
by default load/store instructions that map to ldrt/strt.
There is already the long displacement version for positive
offsets, and when using a (shorter) negative offset it does
not map to ldrt/strt. At least on qemu strt may cause
reproducible, but unexpected SIGILL.
* lib/jit_arm-vfp.c: Correct wrong load/store offset
calculation when the displacement is constant but too
large to use an instruction with an immediate offset.
2013-10-07 Paulo Andrade <pcpa@gnu.org>
* check/self.c: Extend tests to validate jit_callee_save_p
does not cause an assertion on valid arguments, and test
extra registers defined on some backends.
* configure.ac: Do not ignore environment CFLAGS when
checking if need to test runtime configurable options,
like use x87 when sse2 is available, arm instruction set
instead of thumb, etc.
* include/lightning/jit_arm.h: Correct wrong jit_f macro
definition.
* include/lightning/jit_ia64.h, include/lightning/jit_ppc.h:
Correct wrong jit_r macro definition.
* lib/jit_x86-x87.c, lib/jit_x86.c: Actually use the
reserved stack space for integer to/from float conversion.
The stack space was also changed to ensure it is 8 bytes
aligned. Also, for Solaris x86 in 32 bit mode, an alternate
truncr_d was implemented because for some reason it is
failing with SIGILL if using the "fisttpl" instructions,
that must be available on p6 or newer, but for the sake of
making all tests pass, implement a 486 or newer sequence
if "sun" is defined.
* include/lightning/jit_mips.h, lib/jit_mips-cpu.c,
lib/jit_mips-sz.c, lib/jit_mips.c, size: Build and
pass all test cases on Irix big endian mips using
the 64 bit abi.
* lib/jit_x86-cpu.c: Correct not properly tested case of using
%r12 as index register, what was causing an invalid assertion.
%r12 is mapped to the "extra" JIT_R3 register, and test cases
only test "standard" lightning registers.
* lib/jit_ia64-cpu.c, lib/jit_ia64-fpu.c: Correct some
off by one range checks (that were only accepting values
one less than the maximum allowed) and an invalid test
condition check that was forcing it to always use
indirect jumps even when reachable with an immediate
displacement.
* lib/jit_aarch64-sz.c, lib/jit_arm-sz.c, lib/jit_hppa-sz.c,
lib/jit_ia64-sz.c, lib/jit_mips-sz.c, lib/jit_ppc-sz.c,
lib/jit_s390x-sz.c, lib/jit_size.c, lib/jit_sparc-sz.c,
lib/jit_x86-sz.c: New files implementing static tables
with longest known instructions length generated to match
a lightning instruction. These tables should make it easier
to make it very unlikely to ever miscalculate, or by too
much, the size of a code buffer.
* lib/jit_size.c: New file that aids to either collect
jit code size information, or use the information depending
on build options.
* size.c: New helper file that parses input for, and create
an initial jit_$arch-sz.c file, that needs some minor edit
for arches with multiple configurations.
* configure.ac, Makefile.am: Add the new, devel mode only
--enable-devel-get-jit-size configure option, that sets
compile time flags to collect jit code size information,
that will be used as input for the "noinst size program".
* lib/jit_aarch64.c, lib/jit_arm.c, lib/jit_disasm.c,
lib/jit_hppa.c, lib/jit_ia64.c, lib/jit_memory.c,
lib/jit_mips.c, lib/jit_ppc.c, lib/jit_s390x.c,
lib/jit_sparc.c, lib/jit_x86.c, lib/lightning.c: Minor
changes for the --enable-devel-get-jit-size build mode,
as well as the "production build mode" with jit code
size information.
* include/lightning.h, lib/lightning.c: Add the new
jit_pointer_p interface, that returns a boolean value
telling if the pointer argument is inside the jit
code buffer. This is useful to avoid the need to add
extra labels and calls to jit_address to figure bounds
of code buffer, and still keep internal data private.