summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2013-10-16 20:08:59 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2013-10-16 20:08:59 -0700
commitbb9937df2db9129cdc248532a93f406221a2f65c (patch)
tree2f667dad6e953d2d5f49c5ed886c61b8ac2d7a30
parentf2752e013d24133b645d60b226579f8ae9f1587d (diff)
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
-rw-r--r--src/ChangeLog5
-rw-r--r--src/emacs.c1
-rw-r--r--src/lisp.h35
3 files changed, 33 insertions, 8 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 2e175a723d..f95ee3384b 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,5 +1,10 @@
2013-10-17 Paul Eggert <eggert@cs.ucla.edu>
+ 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 79f759cd5b..06b8d290ca 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -30,6 +30,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include <close-stream.h>
+#define MAIN_PROGRAM
#include "lisp.h"
#ifdef WINDOWSNT
diff --git a/src/lisp.h b/src/lisp.h
index d25904be37..4e141c7131 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -35,6 +35,24 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
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. */