From 3c975a330715db418e474d40f3acaa5658e4bb44 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 28 May 2014 22:31:43 -0700 Subject: [PATCH] Port the GDB-visible symbols to AIX. Without them, GDB doesn't work to debug Emacs, since the AIX linker optimizes away the relevant external symbols. Use enums instead; this suffices for the AIX port, which is 32-bit-only anyway. * lisp.h (ENUMABLE, DEFINE_GDB_SYMBOL_ENUM): New macros. (ARRAY_MARK_FLAG, PSEUDOVECTOR_FLAG, VALMASK): Use them. (ARRAY_MARK_FLAG_val, PSEUDOVECTOR_FLAG_val, VALMASK_val): New macros. --- src/ChangeLog | 11 +++++++++++ src/lisp.h | 31 +++++++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 4e68b1b8452..2a3625b95da 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2014-05-29 Paul Eggert + + Port the GDB-visible symbols to AIX. + Without them, GDB doesn't work to debug Emacs, since the AIX linker + optimizes away the relevant external symbols. Use enums instead; + this suffices for the AIX port, which is 32-bit-only anyway. + * lisp.h (ENUMABLE, DEFINE_GDB_SYMBOL_ENUM): New macros. + (ARRAY_MARK_FLAG, PSEUDOVECTOR_FLAG, VALMASK): Use them. + (ARRAY_MARK_FLAG_val, PSEUDOVECTOR_FLAG_val, VALMASK_val): + New macros. + 2014-05-26 Paul Eggert Include sources used to create macuvs.h. diff --git a/src/lisp.h b/src/lisp.h index c7fc5962349..af54887a51a 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -36,14 +36,21 @@ INLINE_HEADER_BEGIN /* Define a TYPE constant ID as an externally visible name. Use like this: + #define ID_val (some integer preprocessor expression) + #if ENUMABLE (ID_val) + DEFINE_GDB_SYMBOL_ENUM (ID) + #else DEFINE_GDB_SYMBOL_BEGIN (TYPE, ID) - #define ID something + # define ID ID_val DEFINE_GDB_SYMBOL_END (ID) + #endif This hack is for the benefit of compilers that do not make macro definitions visible to the debugger. It's used for symbols that .gdbinit needs, symbols whose values may not fit in 'int' (where an enum would suffice). */ +#define ENUMABLE(val) (INT_MIN <= (val) && (val) <= INT_MAX) +#define DEFINE_GDB_SYMBOL_ENUM(id) enum { id = id##_val }; #if defined MAIN_PROGRAM # define DEFINE_GDB_SYMBOL_BEGIN(type, id) type const id EXTERNALLY_VISIBLE # define DEFINE_GDB_SYMBOL_END(id) = id; @@ -571,15 +578,25 @@ LISP_MACRO_DEFUN (XIL, Lisp_Object, (EMACS_INT i), (i)) /* In the size word of a vector, this bit means the vector has been marked. */ +#define ARRAY_MARK_FLAG_val PTRDIFF_MIN +#if ENUMABLE (ARRAY_MARK_FLAG_val) +DEFINE_GDB_SYMBOL_ENUM (ARRAY_MARK_FLAG) +#else DEFINE_GDB_SYMBOL_BEGIN (ptrdiff_t, ARRAY_MARK_FLAG) -#define ARRAY_MARK_FLAG PTRDIFF_MIN +# define ARRAY_MARK_FLAG ARRAY_MARK_FLAG_val DEFINE_GDB_SYMBOL_END (ARRAY_MARK_FLAG) +#endif /* In the size word of a struct Lisp_Vector, this bit means it's really some other vector-like object. */ +#define PSEUDOVECTOR_FLAG_val (PTRDIFF_MAX - PTRDIFF_MAX / 2) +#if ENUMABLE (PSEUDOVECTOR_FLAG_val) +DEFINE_GDB_SYMBOL_ENUM (PSEUDOVECTOR_FLAG) +#else DEFINE_GDB_SYMBOL_BEGIN (ptrdiff_t, PSEUDOVECTOR_FLAG) -#define PSEUDOVECTOR_FLAG (PTRDIFF_MAX - PTRDIFF_MAX / 2) +# define PSEUDOVECTOR_FLAG PSEUDOVECTOR_FLAG_val DEFINE_GDB_SYMBOL_END (PSEUDOVECTOR_FLAG) +#endif /* In a pseudovector, the size field actually contains a word with one PSEUDOVECTOR_FLAG bit set, and one of the following values extracted @@ -641,9 +658,15 @@ enum More_Lisp_Bits XCONS (tem) is the struct Lisp_Cons * pointing to the memory for that cons. */ +/* Mask for the value (as opposed to the type bits) of a Lisp object. */ +#define VALMASK_val (USE_LSB_TAG ? - (1 << GCTYPEBITS) : VAL_MAX) +#if ENUMABLE (VALMASK_val) +DEFINE_GDB_SYMBOL_ENUM (VALMASK) +#else DEFINE_GDB_SYMBOL_BEGIN (EMACS_INT, VALMASK) -#define VALMASK (USE_LSB_TAG ? - (1 << GCTYPEBITS) : VAL_MAX) +# define VALMASK VALMASK_val DEFINE_GDB_SYMBOL_END (VALMASK) +#endif /* Largest and smallest representable fixnum values. These are the C values. They are macros for use in static initializers. */ -- 2.11.4.GIT