aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2025-03-29 14:45:38 +0800
committerPo Lu2025-03-29 14:45:38 +0800
commit2b7a72b1177a057813f40aacc24fd0cd71f5903a (patch)
treef97e349b290a1c718560228a92a0a2f1d9e8bcf3 /src
parent8a986e7075dc83c0b87f0928ba767215c3c6a377 (diff)
downloademacs-2b7a72b1177a057813f40aacc24fd0cd71f5903a.tar.gz
emacs-2b7a72b1177a057813f40aacc24fd0cd71f5903a.zip
Do not redundantly dump constant forwarding objects
* src/pdumper.c (dump_fwd_int, dump_fwd_bool, dump_fwd_obj): Do not redundantly dump constant forwarding descriptors; restrict to dumping the objects being forwarded to. (dump_fwd_buffer_obj): Copy from the dump file into bss rather than load buffer forwarding descriptors from the dump file itself. (dump_fwd_kboard_obj): Delete function. (dump_fwd): Don't return offset of dumped objects. (dump_blv): Adjust correspondingly. (dump_pre_dump_symbol): Improve documentation. Record offset of forwarding objects in relation to `emacs_basis' rather than the dump file. (dump_symbol): Restore forwarding descriptors to their original values as static variables in Emacs. This reduces the size of dump files by an insignificant 2kb but facilitates certain kinds of watchpoints on platforms where ASLR cannot be disabled, e.g., Android.
Diffstat (limited to 'src')
-rw-r--r--src/pdumper.c118
1 files changed, 52 insertions, 66 deletions
diff --git a/src/pdumper.c b/src/pdumper.c
index de213130756..1deb8473956 100644
--- a/src/pdumper.c
+++ b/src/pdumper.c
@@ -2293,35 +2293,25 @@ dump_float (struct dump_context *ctx, const struct Lisp_Float *lfloat)
2293 return dump_object_finish (ctx, &out, sizeof (out)); 2293 return dump_object_finish (ctx, &out, sizeof (out));
2294} 2294}
2295 2295
2296static dump_off 2296static void
2297dump_fwd_int (struct dump_context *ctx, const struct Lisp_Intfwd *intfwd) 2297dump_fwd_int (struct dump_context *ctx, const struct Lisp_Intfwd *intfwd)
2298{ 2298{
2299#if CHECK_STRUCTS && !defined HASH_Lisp_Intfwd_4D887A7387 2299#if CHECK_STRUCTS && !defined HASH_Lisp_Intfwd_4D887A7387
2300# error "Lisp_Intfwd changed. See CHECK_STRUCTS comment in config.h." 2300# error "Lisp_Intfwd changed. See CHECK_STRUCTS comment in config.h."
2301#endif 2301#endif
2302 dump_emacs_reloc_immediate_intmax_t (ctx, intfwd->intvar, *intfwd->intvar); 2302 dump_emacs_reloc_immediate_intmax_t (ctx, intfwd->intvar, *intfwd->intvar);
2303 struct Lisp_Intfwd out;
2304 dump_object_start (ctx, &out, sizeof (out));
2305 DUMP_FIELD_COPY (&out, intfwd, type);
2306 dump_field_emacs_ptr (ctx, &out, intfwd, &intfwd->intvar);
2307 return dump_object_finish (ctx, &out, sizeof (out));
2308} 2303}
2309 2304
2310static dump_off 2305static void
2311dump_fwd_bool (struct dump_context *ctx, const struct Lisp_Boolfwd *boolfwd) 2306dump_fwd_bool (struct dump_context *ctx, const struct Lisp_Boolfwd *boolfwd)
2312{ 2307{
2313#if CHECK_STRUCTS && !defined (HASH_Lisp_Boolfwd_0EA1C7ADCC) 2308#if CHECK_STRUCTS && !defined (HASH_Lisp_Boolfwd_0EA1C7ADCC)
2314# error "Lisp_Boolfwd changed. See CHECK_STRUCTS comment in config.h." 2309# error "Lisp_Boolfwd changed. See CHECK_STRUCTS comment in config.h."
2315#endif 2310#endif
2316 dump_emacs_reloc_immediate_bool (ctx, boolfwd->boolvar, *boolfwd->boolvar); 2311 dump_emacs_reloc_immediate_bool (ctx, boolfwd->boolvar, *boolfwd->boolvar);
2317 struct Lisp_Boolfwd out;
2318 dump_object_start (ctx, &out, sizeof (out));
2319 DUMP_FIELD_COPY (&out, boolfwd, type);
2320 dump_field_emacs_ptr (ctx, &out, boolfwd, &boolfwd->boolvar);
2321 return dump_object_finish (ctx, &out, sizeof (out));
2322} 2312}
2323 2313
2324static dump_off 2314static void
2325dump_fwd_obj (struct dump_context *ctx, const struct Lisp_Objfwd *objfwd) 2315dump_fwd_obj (struct dump_context *ctx, const struct Lisp_Objfwd *objfwd)
2326{ 2316{
2327#if CHECK_STRUCTS && !defined (HASH_Lisp_Objfwd_45D3E513DC) 2317#if CHECK_STRUCTS && !defined (HASH_Lisp_Objfwd_45D3E513DC)
@@ -2331,14 +2321,9 @@ dump_fwd_obj (struct dump_context *ctx, const struct Lisp_Objfwd *objfwd)
2331 ctx->staticpro_table, 2321 ctx->staticpro_table,
2332 Qnil))) 2322 Qnil)))
2333 dump_emacs_reloc_to_lv (ctx, objfwd->objvar, *objfwd->objvar); 2323 dump_emacs_reloc_to_lv (ctx, objfwd->objvar, *objfwd->objvar);
2334 struct Lisp_Objfwd out;
2335 dump_object_start (ctx, &out, sizeof (out));
2336 DUMP_FIELD_COPY (&out, objfwd, type);
2337 dump_field_emacs_ptr (ctx, &out, objfwd, &objfwd->objvar);
2338 return dump_object_finish (ctx, &out, sizeof (out));
2339} 2324}
2340 2325
2341static dump_off 2326static void
2342dump_fwd_buffer_obj (struct dump_context *ctx, 2327dump_fwd_buffer_obj (struct dump_context *ctx,
2343 const struct Lisp_Buffer_Objfwd *buffer_objfwd) 2328 const struct Lisp_Buffer_Objfwd *buffer_objfwd)
2344{ 2329{
@@ -2346,59 +2331,49 @@ dump_fwd_buffer_obj (struct dump_context *ctx,
2346# error "Lisp_Buffer_Objfwd changed. See CHECK_STRUCTS comment in config.h." 2331# error "Lisp_Buffer_Objfwd changed. See CHECK_STRUCTS comment in config.h."
2347#endif 2332#endif
2348 struct Lisp_Buffer_Objfwd out; 2333 struct Lisp_Buffer_Objfwd out;
2334 dump_off off;
2335
2349 dump_object_start (ctx, &out, sizeof (out)); 2336 dump_object_start (ctx, &out, sizeof (out));
2350 DUMP_FIELD_COPY (&out, buffer_objfwd, type); 2337 DUMP_FIELD_COPY (&out, buffer_objfwd, type);
2351 DUMP_FIELD_COPY (&out, buffer_objfwd, offset); 2338 DUMP_FIELD_COPY (&out, buffer_objfwd, offset);
2352 dump_field_lv (ctx, &out, buffer_objfwd, &buffer_objfwd->predicate, 2339 dump_field_lv (ctx, &out, buffer_objfwd, &buffer_objfwd->predicate,
2353 WEIGHT_NORMAL); 2340 WEIGHT_NORMAL);
2354 return dump_object_finish (ctx, &out, sizeof (out)); 2341 off = dump_object_finish (ctx, &out, sizeof out);
2355}
2356 2342
2357static dump_off 2343 /* Copy this fwd from the dump to the buffer fwd in Emacs. */
2358dump_fwd_kboard_obj (struct dump_context *ctx, 2344 dump_emacs_reloc_copy_from_dump (ctx, off, (void *) buffer_objfwd,
2359 const struct Lisp_Kboard_Objfwd *kboard_objfwd) 2345 sizeof out);
2360{
2361#if CHECK_STRUCTS && !defined (HASH_Lisp_Kboard_Objfwd_CAA7E71069)
2362# error "Lisp_Intfwd changed. See CHECK_STRUCTS comment in config.h."
2363#endif
2364 struct Lisp_Kboard_Objfwd out;
2365 dump_object_start (ctx, &out, sizeof (out));
2366 DUMP_FIELD_COPY (&out, kboard_objfwd, type);
2367 DUMP_FIELD_COPY (&out, kboard_objfwd, offset);
2368 return dump_object_finish (ctx, &out, sizeof (out));
2369} 2346}
2370 2347
2371static dump_off 2348static void
2372dump_fwd (struct dump_context *ctx, lispfwd fwd) 2349dump_fwd (struct dump_context *ctx, lispfwd fwd)
2373{ 2350{
2374#if CHECK_STRUCTS && !defined (HASH_Lisp_Fwd_Type_9CBA6EE55E) 2351#if CHECK_STRUCTS && !defined (HASH_Lisp_Fwd_Type_9CBA6EE55E)
2375# error "Lisp_Fwd_Type changed. See CHECK_STRUCTS comment in config.h." 2352# error "Lisp_Fwd_Type changed. See CHECK_STRUCTS comment in config.h."
2376#endif 2353#endif
2377 void const *p = fwd.fwdptr; 2354 void const *p = fwd.fwdptr;
2378 dump_off offset;
2379 2355
2380 switch (XFWDTYPE (fwd)) 2356 switch (XFWDTYPE (fwd))
2381 { 2357 {
2382 case Lisp_Fwd_Int: 2358 case Lisp_Fwd_Int:
2383 offset = dump_fwd_int (ctx, p); 2359 dump_fwd_int (ctx, p);
2384 break; 2360 break;
2385 case Lisp_Fwd_Bool: 2361 case Lisp_Fwd_Bool:
2386 offset = dump_fwd_bool (ctx, p); 2362 dump_fwd_bool (ctx, p);
2387 break; 2363 break;
2388 case Lisp_Fwd_Obj: 2364 case Lisp_Fwd_Obj:
2389 offset = dump_fwd_obj (ctx, p); 2365 dump_fwd_obj (ctx, p);
2390 break; 2366 break;
2391 case Lisp_Fwd_Buffer_Obj: 2367 case Lisp_Fwd_Buffer_Obj:
2392 offset = dump_fwd_buffer_obj (ctx, p); 2368 dump_fwd_buffer_obj (ctx, p);
2393 break; 2369 break;
2370 /* The default kboard's contents are not meant to appear in the
2371 dump file. */
2394 case Lisp_Fwd_Kboard_Obj: 2372 case Lisp_Fwd_Kboard_Obj:
2395 offset = dump_fwd_kboard_obj (ctx, p);
2396 break; 2373 break;
2397 default: 2374 default:
2398 emacs_abort (); 2375 emacs_abort ();
2399 } 2376 }
2400
2401 return offset;
2402} 2377}
2403 2378
2404static dump_off 2379static dump_off
@@ -2413,16 +2388,16 @@ dump_blv (struct dump_context *ctx,
2413 DUMP_FIELD_COPY (&out, blv, local_if_set); 2388 DUMP_FIELD_COPY (&out, blv, local_if_set);
2414 DUMP_FIELD_COPY (&out, blv, found); 2389 DUMP_FIELD_COPY (&out, blv, found);
2415 if (blv->fwd.fwdptr) 2390 if (blv->fwd.fwdptr)
2416 dump_field_fixup_later (ctx, &out, blv, &blv->fwd.fwdptr); 2391 {
2392 eassert (XFWDTYPE (blv->fwd) != Lisp_Fwd_Buffer_Obj);
2393 dump_field_emacs_ptr (ctx, &out, blv, &blv->fwd.fwdptr);
2394 }
2417 dump_field_lv (ctx, &out, blv, &blv->where, WEIGHT_NORMAL); 2395 dump_field_lv (ctx, &out, blv, &blv->where, WEIGHT_NORMAL);
2418 dump_field_lv (ctx, &out, blv, &blv->defcell, WEIGHT_STRONG); 2396 dump_field_lv (ctx, &out, blv, &blv->defcell, WEIGHT_STRONG);
2419 dump_field_lv (ctx, &out, blv, &blv->valcell, WEIGHT_STRONG); 2397 dump_field_lv (ctx, &out, blv, &blv->valcell, WEIGHT_STRONG);
2420 dump_off offset = dump_object_finish (ctx, &out, sizeof (out)); 2398 dump_off offset = dump_object_finish (ctx, &out, sizeof (out));
2421 if (blv->fwd.fwdptr) 2399 if (blv->fwd.fwdptr)
2422 dump_remember_fixup_ptr_raw 2400 dump_fwd (ctx, blv->fwd);
2423 (ctx,
2424 offset + dump_offsetof (struct Lisp_Buffer_Local_Value, fwd),
2425 dump_fwd (ctx, blv->fwd));
2426 return offset; 2401 return offset;
2427} 2402}
2428 2403
@@ -2443,6 +2418,14 @@ dump_remember_symbol_aux (struct dump_context *ctx,
2443 Fputhash (symbol, dump_off_to_lisp (offset), ctx->symbol_aux); 2418 Fputhash (symbol, dump_off_to_lisp (offset), ctx->symbol_aux);
2444} 2419}
2445 2420
2421/* Dump auxiliary information attached to SYMBOL, a symbol that will be
2422 copied into Emacs's core from the dump file. If SYMBOL is localized,
2423 generate a copy of its buffer local storage and arrange that the
2424 symbol redirect to the same. Otherwise, if SYMBOL is forwarded,
2425 arrange to restore the contents of the forwarding structure and/or
2426 dump its references as the case may be; the former is only necessary
2427 in the case of buffer objfwds, which are initialized at runtime. */
2428
2446static void 2429static void
2447dump_pre_dump_symbol (struct dump_context *ctx, struct Lisp_Symbol *symbol) 2430dump_pre_dump_symbol (struct dump_context *ctx, struct Lisp_Symbol *symbol)
2448{ 2431{
@@ -2457,8 +2440,9 @@ dump_pre_dump_symbol (struct dump_context *ctx, struct Lisp_Symbol *symbol)
2457 dump_blv (ctx, symbol->u.s.val.blv)); 2440 dump_blv (ctx, symbol->u.s.val.blv));
2458 break; 2441 break;
2459 case SYMBOL_FORWARDED: 2442 case SYMBOL_FORWARDED:
2443 dump_fwd (ctx, symbol->u.s.val.fwd);
2460 dump_remember_symbol_aux (ctx, symbol_lv, 2444 dump_remember_symbol_aux (ctx, symbol_lv,
2461 dump_fwd (ctx, symbol->u.s.val.fwd)); 2445 emacs_offset (symbol->u.s.val.fwd.fwdptr));
2462 break; 2446 break;
2463 default: 2447 default:
2464 break; 2448 break;
@@ -2467,9 +2451,8 @@ dump_pre_dump_symbol (struct dump_context *ctx, struct Lisp_Symbol *symbol)
2467} 2451}
2468 2452
2469static dump_off 2453static dump_off
2470dump_symbol (struct dump_context *ctx, 2454dump_symbol (struct dump_context *ctx, Lisp_Object object,
2471 Lisp_Object object, 2455 dump_off offset)
2472 dump_off offset)
2473{ 2456{
2474#if CHECK_STRUCTS && !defined HASH_Lisp_Symbol_E0ADAF2F24 2457#if CHECK_STRUCTS && !defined HASH_Lisp_Symbol_E0ADAF2F24
2475# error "Lisp_Symbol changed. See CHECK_STRUCTS comment in config.h." 2458# error "Lisp_Symbol changed. See CHECK_STRUCTS comment in config.h."
@@ -2477,6 +2460,7 @@ dump_symbol (struct dump_context *ctx,
2477#if CHECK_STRUCTS && !defined (HASH_symbol_redirect_EA72E4BFF5) 2460#if CHECK_STRUCTS && !defined (HASH_symbol_redirect_EA72E4BFF5)
2478# error "symbol_redirect changed. See CHECK_STRUCTS comment in config.h." 2461# error "symbol_redirect changed. See CHECK_STRUCTS comment in config.h."
2479#endif 2462#endif
2463 dump_off aux_offset;
2480 2464
2481 if (ctx->flags.defer_symbols) 2465 if (ctx->flags.defer_symbols)
2482 { 2466 {
@@ -2524,8 +2508,13 @@ dump_symbol (struct dump_context *ctx,
2524 dump_field_fixup_later (ctx, &out, symbol, &symbol->u.s.val.blv); 2508 dump_field_fixup_later (ctx, &out, symbol, &symbol->u.s.val.blv);
2525 break; 2509 break;
2526 case SYMBOL_FORWARDED: 2510 case SYMBOL_FORWARDED:
2527 dump_field_fixup_later (ctx, &out, symbol, &symbol->u.s.val.fwd); 2511 /* This forwarding descriptor is in Emacs's core, but the symbol
2512 is initialized at runtime. The next switch statement might
2513 dump this value if it hasn't already been dumped by
2514 dump_pre_dump_symbol. */
2515 dump_field_emacs_ptr (ctx, &out, symbol, &symbol->u.s.val.fwd.fwdptr);
2528 break; 2516 break;
2517
2529 default: 2518 default:
2530 emacs_abort (); 2519 emacs_abort ();
2531 } 2520 }
@@ -2535,27 +2524,24 @@ dump_symbol (struct dump_context *ctx,
2535 WEIGHT_STRONG); 2524 WEIGHT_STRONG);
2536 2525
2537 offset = dump_object_finish (ctx, &out, sizeof (out)); 2526 offset = dump_object_finish (ctx, &out, sizeof (out));
2538 dump_off aux_offset;
2539
2540 switch (symbol->u.s.redirect) 2527 switch (symbol->u.s.redirect)
2541 { 2528 {
2542 case SYMBOL_LOCALIZED: 2529 case SYMBOL_LOCALIZED:
2543 aux_offset = dump_recall_symbol_aux (ctx, make_lisp_symbol (symbol)); 2530 aux_offset = dump_recall_symbol_aux (ctx, make_lisp_symbol (symbol));
2544 dump_remember_fixup_ptr_raw 2531 dump_remember_fixup_ptr_raw (ctx, offset + dump_offsetof (struct Lisp_Symbol,
2545 (ctx, 2532 u.s.val.blv),
2546 offset + dump_offsetof (struct Lisp_Symbol, u.s.val.blv), 2533 (aux_offset
2547 (aux_offset 2534 ? aux_offset
2548 ? aux_offset 2535 : dump_blv (ctx, symbol->u.s.val.blv)));
2549 : dump_blv (ctx, symbol->u.s.val.blv)));
2550 break; 2536 break;
2551 case SYMBOL_FORWARDED: 2537 case SYMBOL_FORWARDED:
2552 aux_offset = dump_recall_symbol_aux (ctx, make_lisp_symbol (symbol)); 2538 aux_offset = dump_recall_symbol_aux (ctx, make_lisp_symbol (symbol));
2553 dump_remember_fixup_ptr_raw 2539 /* Symbols interned by a defvar are not copied objects. */
2554 (ctx, 2540 if (!aux_offset)
2555 offset + dump_offsetof (struct Lisp_Symbol, u.s.val.fwd), 2541 dump_fwd (ctx, symbol->u.s.val.fwd);
2556 (aux_offset 2542 if (aux_offset && (aux_offset
2557 ? aux_offset 2543 != emacs_offset (symbol->u.s.val.fwd.fwdptr)))
2558 : dump_fwd (ctx, symbol->u.s.val.fwd))); 2544 emacs_abort ();
2559 break; 2545 break;
2560 default: 2546 default:
2561 break; 2547 break;