1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-11 22:31:12 +02:00

Add support for static allocation of cells, strings and stringbufs.

* libguile/__scm.h (SCM_ALIGNED): New macro.

* libguile/_scm.h: Include "libguile/strings.h", to make the
  string/stringbuf-related constants visible to snarffed code.

* libguile/snarf.h (SCM_SUPPORT_STATIC_ALLOCATION): New macro.
  (SCM_SYMBOL, SCM_GLOBAL_SYMBOL)[SCM_SUPPORT_STATIC_ALLOCATION]: New
  alternative versions of these macros with support for (almost) static
  allocation via the use of `string->symbol'.
  (SCM_IMMUTABLE_DOUBLE_CELL, SCM_IMMUTABLE_STRINGBUF,
  SCM_IMMUTABLE_STRING): New macros.

* libguile/tags.h (SCM)[SCM_DEBUG_TYPING_STRICTNESS==1]: Use a pointer
  type that is compatible with other pointer types, to avoid potential
  violation of strict aliasing rules.
This commit is contained in:
Ludovic Courtès 2009-01-14 00:05:23 +01:00
parent 35920c00a8
commit c6054feaf0
4 changed files with 78 additions and 9 deletions

View file

@ -3,7 +3,7 @@
#ifndef SCM___SCM_H #ifndef SCM___SCM_H
#define SCM___SCM_H #define SCM___SCM_H
/* Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2003, 2006, 2007, 2008 Free Software Foundation, Inc. /* Copyright (C) 1995,1996,1998,1999,2000,2001,2002,2003, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -106,6 +106,16 @@
# define SCM_INTERNAL extern # define SCM_INTERNAL extern
#endif #endif
/* The SCM_ALIGNED macro, when defined, can be used to instruct the compiler
* to honor the given alignment constraint. */
#if (defined __GNUC__)
# define SCM_ALIGNED(x) __attribute__ ((aligned (x)))
#elif (defined __INTEL_COMPILER)
# define SCM_ALIGNED(x) __declspec (align (x))
#else
/* Don't know how to align things. */
# undef SCM_ALIGNED
#endif
/* {Supported Options} /* {Supported Options}

View file

@ -3,7 +3,7 @@
#ifndef SCM__SCM_H #ifndef SCM__SCM_H
#define SCM__SCM_H #define SCM__SCM_H
/* Copyright (C) 1995,1996,2000,2001, 2002, 2006, 2008 Free Software Foundation, Inc. /* Copyright (C) 1995,1996,2000,2001, 2002, 2006, 2008, 2009 Free Software Foundation, Inc.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -58,6 +58,7 @@
#include "libguile/variable.h" #include "libguile/variable.h"
#include "libguile/modules.h" #include "libguile/modules.h"
#include "libguile/inline.h" #include "libguile/inline.h"
#include "libguile/strings.h"
/* SCM_SYSCALL retries system calls that have been interrupted (EINTR). /* SCM_SYSCALL retries system calls that have been interrupted (EINTR).
However this can be avoided if the operating system can restart However this can be avoided if the operating system can restart

View file

@ -3,7 +3,7 @@
#ifndef SCM_SNARF_H #ifndef SCM_SNARF_H
#define SCM_SNARF_H #define SCM_SNARF_H
/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2002, 2003, 2004, 2006 Free Software Foundation, Inc. /* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2002, 2003, 2004, 2006, 2009 Free Software Foundation, Inc.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -35,6 +35,13 @@
#define SCM_FUNC_CAST_ARBITRARY_ARGS SCM (*)() #define SCM_FUNC_CAST_ARBITRARY_ARGS SCM (*)()
#endif #endif
#if (defined SCM_ALIGNED) && (SCM_DEBUG_TYPING_STRICTNESS <= 1)
/* We support static allocation of some `SCM' objects. */
# define SCM_SUPPORT_STATIC_ALLOCATION
#endif
/* Generic macros to be used in user macro definitions. /* Generic macros to be used in user macro definitions.
* *
* For example, in order to define a macro which creates ints and * For example, in order to define a macro which creates ints and
@ -173,14 +180,32 @@ scm_c_define_subr_with_generic (RANAME, TYPE, \
SCM_SNARF_HERE(static const char RANAME[]=STR)\ SCM_SNARF_HERE(static const char RANAME[]=STR)\
SCM_SNARF_INIT(scm_make_synt (RANAME, TYPE, CFN)) SCM_SNARF_INIT(scm_make_synt (RANAME, TYPE, CFN))
#define SCM_SYMBOL(c_name, scheme_name) \ #ifdef SCM_SUPPORT_STATIC_ALLOCATION
SCM_SNARF_HERE(static SCM c_name) \
# define SCM_SYMBOL(c_name, scheme_name) \
SCM_SNARF_HERE( \
SCM_IMMUTABLE_STRING (c_name ## _string, scheme_name); \
static SCM c_name) \
SCM_SNARF_INIT(c_name = scm_string_to_symbol (c_name ## _string))
# define SCM_GLOBAL_SYMBOL(c_name, scheme_name) \
SCM_SNARF_HERE( \
SCM_IMMUTABLE_STRING (c_name ## _string, scheme_name); \
SCM c_name) \
SCM_SNARF_INIT(c_name = scm_string_to_symbol (c_name ## _string))
#else /* !SCM_SUPPORT_STATIC_ALLOCATION */
# define SCM_SYMBOL(c_name, scheme_name) \
SCM_SNARF_HERE(static SCM c_name) \
SCM_SNARF_INIT(c_name = scm_permanent_object (scm_from_locale_symbol (scheme_name))) SCM_SNARF_INIT(c_name = scm_permanent_object (scm_from_locale_symbol (scheme_name)))
#define SCM_GLOBAL_SYMBOL(c_name, scheme_name) \ # define SCM_GLOBAL_SYMBOL(c_name, scheme_name) \
SCM_SNARF_HERE(SCM c_name) \ SCM_SNARF_HERE(SCM c_name) \
SCM_SNARF_INIT(c_name = scm_permanent_object (scm_from_locale_symbol (scheme_name))) SCM_SNARF_INIT(c_name = scm_permanent_object (scm_from_locale_symbol (scheme_name)))
#endif /* !SCM_SUPPORT_STATIC_ALLOCATION */
#define SCM_KEYWORD(c_name, scheme_name) \ #define SCM_KEYWORD(c_name, scheme_name) \
SCM_SNARF_HERE(static SCM c_name) \ SCM_SNARF_HERE(static SCM c_name) \
SCM_SNARF_INIT(c_name = scm_permanent_object (scm_from_locale_keyword (scheme_name))) SCM_SNARF_INIT(c_name = scm_permanent_object (scm_from_locale_keyword (scheme_name)))
@ -269,6 +294,39 @@ SCM_SNARF_INIT(scm_set_smob_apply((tag), (c_name), (req), (opt), (rest));)
SCM_SNARF_HERE(SCM c_name arglist) \ SCM_SNARF_HERE(SCM c_name arglist) \
SCM_SNARF_INIT(scm_set_smob_apply((tag), (c_name), (req), (opt), (rest));) SCM_SNARF_INIT(scm_set_smob_apply((tag), (c_name), (req), (opt), (rest));)
/* Low-level snarfing for static memory allocation. */
#ifdef SCM_SUPPORT_STATIC_ALLOCATION
#define SCM_IMMUTABLE_DOUBLE_CELL(c_name, car, cbr, ccr, cdr) \
static SCM_ALIGNED (8) SCM_UNUSED const scm_t_cell \
c_name ## _raw_cell [2] = \
{ \
{ SCM_PACK (car), SCM_PACK (cbr) }, \
{ SCM_PACK (ccr), SCM_PACK (cdr) } \
}; \
static SCM_UNUSED const SCM c_name = SCM_PACK (& c_name ## _raw_cell)
#define SCM_IMMUTABLE_STRINGBUF(c_name, contents) \
SCM_IMMUTABLE_DOUBLE_CELL (c_name, \
scm_tc7_stringbuf | SCM_I_STRINGBUF_F_SHARED, \
(scm_t_bits) (contents), \
(scm_t_bits) sizeof (contents) - 1, \
(scm_t_bits) 0)
#define SCM_IMMUTABLE_STRING(c_name, contents) \
SCM_IMMUTABLE_STRINGBUF (c_name ## _stringbuf, contents); \
SCM_IMMUTABLE_DOUBLE_CELL (c_name, \
scm_tc7_ro_string, \
(scm_t_bits) &c_name ## _stringbuf_raw_cell, \
(scm_t_bits) 0, \
(scm_t_bits) sizeof (contents) - 1)
#endif /* SCM_SUPPORT_STATIC_ALLOCATION */
/* Documentation. */
#ifdef SCM_MAGIC_SNARF_DOCS #ifdef SCM_MAGIC_SNARF_DOCS
#undef SCM_ASSERT #undef SCM_ASSERT

View file

@ -3,7 +3,7 @@
#ifndef SCM_TAGS_H #ifndef SCM_TAGS_H
#define SCM_TAGS_H #define SCM_TAGS_H
/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2008 /* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2008,2009
* Free Software Foundation, Inc. * Free Software Foundation, Inc.
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
@ -106,7 +106,7 @@ typedef unsigned long scm_t_bits;
/* This is the default, which provides an intermediate level of compile time /* This is the default, which provides an intermediate level of compile time
* type checking while still resulting in very efficient code. * type checking while still resulting in very efficient code.
*/ */
typedef struct scm_unused_struct * SCM; typedef struct { char scm_unused_field; } * SCM;
/* /*
The 0?: constructions makes sure that the code is never executed, The 0?: constructions makes sure that the code is never executed,