[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
scratch/igc 29bc3ac7551 3/3: WIP, pure space
From: |
Gerd Moellmann |
Subject: |
scratch/igc 29bc3ac7551 3/3: WIP, pure space |
Date: |
Thu, 18 Apr 2024 10:33:11 -0400 (EDT) |
branch: scratch/igc
commit 29bc3ac7551c60af62a68f937ac041d93efa6cb0
Author: Gerd Möllmann <gerd@gnu.org>
Commit: Gerd Möllmann <gerd@gnu.org>
WIP, pure space
---
src/.lldbinit | 11 +++--------
src/alloc.c | 2 +-
src/igc.c | 32 +++++++++++++++++++++++++++++++-
src/lisp.h | 1 +
src/pdumper.c | 2 ++
5 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/src/.lldbinit b/src/.lldbinit
index dd46b63a0cf..3f4f59be531 100644
--- a/src/.lldbinit
+++ b/src/.lldbinit
@@ -65,14 +65,9 @@ b die
#process handle -p true -s false SIGSEGV
#process handle -p true -s false SIGBUS
-#target create emacs
-#settings set -- target.run-args -batch --no-site-file --no-site-lisp --eval
'(setq load-prefer-newer t)' -l ox-texinfo --eval '(setq gc-cons-threshold
50000000)' -f org-texinfo-export-to-texinfo-batch modus-themes.org
modus-themes.texi
-#command alias go process launch --working-dir ../doc/misc
+target create temacs
+settings set -- target.run-args --batch -l loadup --temacs=pbootstrap
--bin-dest --eln-dest
+command alias go process launch --working-dir .
-#target create temacs
-#settings set -- target.run-args --batch -l loadup --temacs=pbootstrap
--bin-dest /Users/gerd/emacs/github/igc/nextstep/Emacs.app/Contents/MacOS/
--eln-dest /Users/gerd/emacs/github/igc/nextstep/Emacs.app/Contents/Frameworks/
-#command alias go process launch --working-dir .
-
-target create emacs
# end.
diff --git a/src/alloc.c b/src/alloc.c
index 11058ca5b65..6d794d2b5d6 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -405,7 +405,7 @@ static ptrdiff_t pure_bytes_used_before_overflow;
/* Index in pure at which next pure Lisp object will be allocated.. */
-static ptrdiff_t pure_bytes_used_lisp;
+ptrdiff_t pure_bytes_used_lisp;
/* Number of bytes allocated for non-Lisp objects in pure storage. */
diff --git a/src/igc.c b/src/igc.c
index a844326fd56..0026fa31cb3 100644
--- a/src/igc.c
+++ b/src/igc.c
@@ -43,6 +43,7 @@ along with GNU Emacs. If not, see
<https://www.gnu.org/licenses/>. */
#include "termhooks.h"
#include "thread.h"
#include "treesit.h"
+#include "puresize.h"
#ifndef USE_LSB_TAG
# error "USE_LSB_TAG required"
@@ -93,11 +94,17 @@ igc_assert_fail (const char *file, unsigned line, const
char *msg)
static mps_addr_t min_addr, max_addr;
+static bool
+is_pure (const mps_addr_t addr)
+{
+ return PURE_P (addr);
+}
+
static bool
is_mps (const mps_addr_t addr)
{
return addr >= min_addr && addr < max_addr && !pdumper_object_p (addr)
- && !c_symbol_p (addr);
+ && !c_symbol_p (addr) && !is_pure (addr);
}
enum
@@ -788,6 +795,20 @@ scan_ambig (mps_ss_t ss, void *start, void *end, void
*closure)
return MPS_RES_OK;
}
+static mps_res_t
+scan_pure (mps_ss_t ss, void *start, void *end, void *closure)
+{
+ MPS_SCAN_BEGIN (ss)
+ {
+ igc_assert (start == (void *) pure);
+ end = (char *) pure + pure_bytes_used_lisp;
+ if (end > start)
+ IGC_FIX_CALL (ss, scan_ambig (ss, start, end, NULL));
+ }
+ MPS_SCAN_END (ss);
+ return MPS_RES_OK;
+}
+
static mps_res_t
scan_bc (mps_ss_t ss, void *start, void *end, void *closure)
{
@@ -1652,6 +1673,14 @@ root_create_igc (struct igc *gc)
root_create (gc, gc, gc + 1, mps_rank_exact (), scan_igc, false);
}
+static void
+root_create_pure (struct igc *gc)
+{
+ void *start = &pure[0];
+ void *end = &pure[PURESIZE];
+ root_create (gc, start, end, mps_rank_ambig (), scan_pure, true);
+}
+
static void
root_create_thread (struct igc_thread_list *t)
{
@@ -2657,6 +2686,7 @@ make_igc (void)
gc->weak_pool = make_pool_awl (gc, gc->weak_fmt);
root_create_igc (gc);
+ root_create_pure (gc);
root_create_buffer (gc, &buffer_defaults);
root_create_buffer (gc, &buffer_local_symbols);
root_create_staticvec (gc);
diff --git a/src/lisp.h b/src/lisp.h
index c725b89070e..dd558badb4d 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4976,6 +4976,7 @@ XMODULE_FUNCTION (Lisp_Object o)
typedef void (*module_funcptr) (void);
/* Defined in alloc.c. */
+extern ptrdiff_t pure_bytes_used_lisp;
void set_string_marked (struct Lisp_String *s);
void mark_interval_tree (INTERVAL i);
diff --git a/src/pdumper.c b/src/pdumper.c
index a916d326a43..8b179247db0 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -2493,7 +2493,9 @@ dump_symbol (struct dump_context *ctx,
struct Lisp_Symbol *symbol = XSYMBOL (object);
struct Lisp_Symbol out;
dump_object_start (ctx, &out, sizeof (out));
+#ifndef HAVE_MPS
eassert (symbol->u.s.gcmarkbit == 0);
+#endif
DUMP_FIELD_COPY (&out, symbol, u.s.redirect);
DUMP_FIELD_COPY (&out, symbol, u.s.trapped_write);
DUMP_FIELD_COPY (&out, symbol, u.s.interned);