1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-05-05 06:50:21 +02:00
guile/size.c
pcpa b768fab8b1 Add code to calculate code buffer size based on devel time information.
* 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.
2013-09-24 03:31:54 -03:00

84 lines
2.3 KiB
C

/*
* Copyright (C) 2013 Free Software Foundation, Inc.
*
* This file is part of GNU lightning.
*
* GNU lightning is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published
* by the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* GNU lightning is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* Authors:
* Paulo Cesar Pereira de Andrade
*/
#include <lightning.h>
#include <lightning/jit_private.h>
#include <stdio.h>
jit_int16_t _szs[jit_code_x86_retval_d + 1];
int
main(int argc, char *argv[])
{
FILE *fp;
jit_word_t offset;
int code, size, max;
if ((fp = fopen(JIT_SIZE_PATH, "r")) == NULL)
exit(-1);
while (fscanf(fp, "%d %d\n", &code, &size) == 2) {
if (_szs[code] < size)
_szs[code] = size;
}
fclose(fp);
max = 0;
for (offset = 0; offset <= jit_code_x86_retval_d; offset++)
if (max < _szs[offset])
max = _szs[offset];
if ((fp = fopen(JIT_SIZE_PATH, "w")) == NULL)
exit(-1);
fprintf(fp, "#if __WORDSIZE == %d\n", __WORDSIZE);
#if defined(__arm__)
# if defined(__ARM_PCS_VFP)
fprintf(fp, "#if defined(__ARM_PCS_VFP)\n");
# else
fprintf(fp, "#if !defined(__ARM_PCS_VFP)\n");
# endif
#elif defined(__mips__)
# if defined(_ABIN32)
fprintf(fp, "#if defined(_ABIN32)\n");
# else
fprintf(fp, "#if !defined(_ABIN32)\n");
# endif
#elif defined(__ppc__)
fprintf(fp, "#if defined(__ppc__)\n");
#elif defined(__powerpc__)
fprintf(fp, "#if defined(__powerpc__)\n");
#endif
fprintf(fp, "#define JIT_INSTR_MAX %d\n", max);
for (offset = 0; offset <= jit_code_x86_retval_d; offset++)
fprintf(fp, " %d,\n", _szs[offset]);
#if defined(__arm__)
fprintf(fp, "#undef /* __ARM_PCS_VFP */\n");
#elif defined(__mips__)
fprintf(fp, "#endif /* _ABIN32 */\n");
#elif defined(__ppc__)
fprintf(fp, "#endif /* __ppc__ */\n");
#elif defined(__powerpc__)
fprintf(fp, "#endif /* __powerpc__ */\n");
#endif
fprintf(fp, "#endif /* __WORDSIZE */\n");
fclose(fp);
return (0);
}