From bb9937df2db9129cdc248532a93f406221a2f65c Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 16 Oct 2013 20:08:59 -0700 Subject: [PATCH] Make VALMASK visible to GDB even if clang is used. * emacs.c (MAIN_PROGRAM): New macro. * lisp.h (DEFINE_GDB_SYMBOL_BEGIN, DEFINE_GDB_SYMBOL_END): New macros. (ARRAY_MARK_FLAG, PSEUDOVECTOR_FLAG, VALMASK): Use them. Fixes: debbugs:15574 --- src/ChangeLog | 5 +++++ src/emacs.c | 1 + src/lisp.h | 35 +++++++++++++++++++++++++++-------- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 2e175a723dc..f95ee3384bf 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,10 @@ 2013-10-17 Paul Eggert + Make VALMASK visible to GDB even if clang is used (Bug#15574). + * emacs.c (MAIN_PROGRAM): New macro. + * lisp.h (DEFINE_GDB_SYMBOL_BEGIN, DEFINE_GDB_SYMBOL_END): New macros. + (ARRAY_MARK_FLAG, PSEUDOVECTOR_FLAG, VALMASK): Use them. + bool vector int width fixes * data.c (bool_vector_spare_mask, Fbool_vector_count_matches) (Fbool_vector_count_matches_at): diff --git a/src/emacs.c b/src/emacs.c index 79f759cd5b5..06b8d290cae 100644 --- a/src/emacs.c +++ b/src/emacs.c @@ -30,6 +30,7 @@ along with GNU Emacs. If not, see . */ #include +#define MAIN_PROGRAM #include "lisp.h" #ifdef WINDOWSNT diff --git a/src/lisp.h b/src/lisp.h index d25904be379..4e141c71319 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -35,6 +35,24 @@ along with GNU Emacs. If not, see . */ INLINE_HEADER_BEGIN +/* Define a TYPE constant ID as an externally visible name. Use like this: + + DEFINE_GDB_SYMBOL_BEGIN (TYPE, ID) + #define ID something + DEFINE_GDB_SYMBOL_END (ID) + + 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). */ +#ifdef MAIN_PROGRAM +# define DEFINE_GDB_SYMBOL_BEGIN(type, id) type const id EXTERNALLY_VISIBLE +# define DEFINE_GDB_SYMBOL_END(id) = id; +#else +# define DEFINE_GDB_SYMBOL_BEGIN(type, id) +# define DEFINE_GDB_SYMBOL_END(val) +#endif + /* The ubiquitous max and min macros. */ #undef min #undef max @@ -533,15 +551,15 @@ 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. */ -static ptrdiff_t const ARRAY_MARK_FLAG +DEFINE_GDB_SYMBOL_BEGIN (ptrdiff_t, ARRAY_MARK_FLAG) #define ARRAY_MARK_FLAG PTRDIFF_MIN - = ARRAY_MARK_FLAG; +DEFINE_GDB_SYMBOL_END (ARRAY_MARK_FLAG) /* In the size word of a struct Lisp_Vector, this bit means it's really some other vector-like object. */ -static ptrdiff_t const PSEUDOVECTOR_FLAG +DEFINE_GDB_SYMBOL_BEGIN (ptrdiff_t, PSEUDOVECTOR_FLAG) #define PSEUDOVECTOR_FLAG (PTRDIFF_MAX - PTRDIFF_MAX / 2) - = PSEUDOVECTOR_FLAG; +DEFINE_GDB_SYMBOL_END (PSEUDOVECTOR_FLAG) /* In a pseudovector, the size field actually contains a word with one PSEUDOVECTOR_FLAG bit set, and one of the following values extracted @@ -603,12 +621,13 @@ enum More_Lisp_Bits }; /* These functions extract various sorts of values from a Lisp_Object. - For example, if tem is a Lisp_Object whose type is Lisp_Cons, - XCONS (tem) is the struct Lisp_Cons * pointing to the memory for that cons. */ + For example, if tem is a Lisp_Object whose type is Lisp_Cons, + XCONS (tem) is the struct Lisp_Cons * pointing to the memory for + that cons. */ -static EMACS_INT const VALMASK +DEFINE_GDB_SYMBOL_BEGIN (EMACS_INT, VALMASK) #define VALMASK (USE_LSB_TAG ? - (1 << GCTYPEBITS) : VAL_MAX) - = VALMASK; +DEFINE_GDB_SYMBOL_END (VALMASK) /* Largest and smallest representable fixnum values. These are the C values. They are macros for use in static initializers. */ -- 2.39.2