* [PATCH 0/4] Minor psymtab cleanups
@ 2020-10-17 22:50 Tom Tromey
2020-10-17 22:50 ` [PATCH 1/4] Remove init_psymbol_list Tom Tromey
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Tom Tromey @ 2020-10-17 22:50 UTC (permalink / raw)
To: gdb-patches
Here are a few minor psymtab cleanups that were discussed in the
earlier thread about changing psymtab storage.
Regression tested on x86-64 Fedora 28.
Tom
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/4] Remove init_psymbol_list
2020-10-17 22:50 [PATCH 0/4] Minor psymtab cleanups Tom Tromey
@ 2020-10-17 22:50 ` Tom Tromey
2020-10-17 22:50 ` [PATCH 2/4] Remove parameter from end_psymtab_common Tom Tromey
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2020-10-17 22:50 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey
init_psymbol_list is now empty, and so this removes it.
gdb/ChangeLog
2020-10-17 Tom Tromey <tom@tromey.com>
* dbxread.c (dbx_symfile_read): Update.
* dwarf2/read.c (dwarf2_build_psymtabs): Update.
* xcoffread.c (xcoff_initial_scan): Update.
* psympriv.h (init_psymbol_list): Don't declare.
* psymtab.c (init_psymbol_list): Remove.
---
gdb/ChangeLog | 8 ++++++++
gdb/dbxread.c | 3 ---
gdb/dwarf2/read.c | 2 --
gdb/psympriv.h | 6 ------
gdb/psymtab.c | 7 -------
gdb/xcoffread.c | 6 ------
6 files changed, 8 insertions(+), 24 deletions(-)
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 4665cddc5f1..4e189a7f127 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -535,9 +535,6 @@ dbx_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags)
if (val < 0)
perror_with_name (objfile_name (objfile));
- /* Size the symbol table. */
- init_psymbol_list (objfile, DBX_SYMCOUNT (objfile));
-
symbol_size = DBX_SYMBOL_SIZE (objfile);
symbol_table_offset = DBX_SYMTAB_OFFSET (objfile);
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 37409c5c3fc..c5bfab19059 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -6117,8 +6117,6 @@ dwarf2_build_psymtabs (struct objfile *objfile)
return;
}
- init_psymbol_list (objfile, 1024);
-
try
{
/* This isn't really ideal: all the data we allocate on the
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 97f9b3b596c..73077ebac7f 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -436,12 +436,6 @@ struct legacy_psymtab : public standard_psymtab
void *read_symtab_private = nullptr;
};
-/* Initialize storage for partial symbols. If partial symbol storage
- has already been initialized, this does nothing. TOTAL_SYMBOLS is
- an estimate of how many symbols there will be. */
-
-extern void init_psymbol_list (struct objfile *objfile, int total_symbols);
-
extern void end_psymtab_common (struct objfile *, struct partial_symtab *);
/* Used when recording partial symbol tables. On destruction,
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index acccfca9d91..349c68ed55e 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -1584,13 +1584,6 @@ partial_symtab::add_psymbol (gdb::string_view name, bool copy_name,
/* See psympriv.h. */
-void
-init_psymbol_list (struct objfile *objfile, int total_symbols)
-{
-}
-
-/* See psympriv.h. */
-
partial_symtab::partial_symtab (const char *filename_, struct objfile *objfile)
: searched_flag (PST_NOT_SEARCHED),
text_low_valid (0),
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 3588aaed016..075ebee7012 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2922,12 +2922,6 @@ xcoff_initial_scan (struct objfile *objfile, symfile_add_flags symfile_flags)
if (val != size)
perror_with_name (_("reading symbol table"));
- /* I'm not sure how how good num_symbols is; the rule of thumb in
- init_psymbol_list was developed for a.out. On the one hand,
- num_symbols includes auxents. On the other hand, it doesn't
- include N_SLINE. */
- init_psymbol_list (objfile, num_symbols);
-
scoped_free_pendings free_pending;
minimal_symbol_reader reader (objfile);
--
2.17.2
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 2/4] Remove parameter from end_psymtab_common
2020-10-17 22:50 [PATCH 0/4] Minor psymtab cleanups Tom Tromey
2020-10-17 22:50 ` [PATCH 1/4] Remove init_psymbol_list Tom Tromey
@ 2020-10-17 22:50 ` Tom Tromey
2020-10-17 22:50 ` [PATCH 3/4] Remove partial symbol statistics Tom Tromey
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2020-10-17 22:50 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey
The objfile parameter to end_psymtab_common is no longer needed, so
this removes it.
gdb/ChangeLog
2020-10-17 Tom Tromey <tom@tromey.com>
* dbxread.c (dbx_end_psymtab): Update.
* dwarf2/read.c (process_psymtab_comp_unit_reader): Update.
(build_type_psymtabs_reader): Update.
* xcoffread.c (xcoff_end_psymtab): Update.
* ctfread.c (scan_partial_symbols): Update.
* psympriv.h (end_psymtab_common): Update.
* psymtab.c (end_psymtab_common): Remove objfile parameter.
(sort_pst_symbols): Likewise.
---
gdb/ChangeLog | 11 +++++++++++
gdb/ctfread.c | 2 +-
gdb/dbxread.c | 2 +-
gdb/dwarf2/read.c | 5 ++---
gdb/psympriv.h | 2 +-
gdb/psymtab.c | 6 +++---
gdb/xcoffread.c | 2 +-
7 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/gdb/ctfread.c b/gdb/ctfread.c
index 3c506dd42f8..b8d8434f6ca 100644
--- a/gdb/ctfread.c
+++ b/gdb/ctfread.c
@@ -1464,7 +1464,7 @@ scan_partial_symbols (ctf_file_t *cfp, struct objfile *of)
0, language_c, of);
}
- end_psymtab_common (of, pst);
+ end_psymtab_common (pst);
}
/* Read CTF debugging information from a BFD section. This is
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index 4e189a7f127..f9ee00718db 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -2004,7 +2004,7 @@ dbx_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
/* End of kludge for patching Solaris textlow and texthigh. */
- end_psymtab_common (objfile, pst);
+ end_psymtab_common (pst);
pst->number_of_dependencies = number_dependencies;
if (number_dependencies)
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index c5bfab19059..37e51ea45c5 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -7632,7 +7632,7 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
best_highpc + baseaddr)
- baseaddr);
- end_psymtab_common (objfile, pst);
+ end_psymtab_common (pst);
if (!cu->per_cu->imported_symtabs_empty ())
{
@@ -7726,7 +7726,6 @@ build_type_psymtabs_reader (const struct die_reader_specs *reader,
struct die_info *type_unit_die)
{
dwarf2_per_objfile *per_objfile = reader->cu->per_objfile;
- struct objfile *objfile = per_objfile->objfile;
struct dwarf2_cu *cu = reader->cu;
struct dwarf2_per_cu_data *per_cu = cu->per_cu;
struct signatured_type *sig_type;
@@ -7759,7 +7758,7 @@ build_type_psymtabs_reader (const struct die_reader_specs *reader,
highpc = (CORE_ADDR) 0;
scan_partial_symbols (first_die, &lowpc, &highpc, 0, cu);
- end_psymtab_common (objfile, pst);
+ end_psymtab_common (pst);
}
/* Struct used to sort TUs by their abbreviation table offset. */
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 73077ebac7f..53dfb1b1cdf 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -436,7 +436,7 @@ struct legacy_psymtab : public standard_psymtab
void *read_symtab_private = nullptr;
};
-extern void end_psymtab_common (struct objfile *, struct partial_symtab *);
+extern void end_psymtab_common (struct partial_symtab *);
/* Used when recording partial symbol tables. On destruction,
discards any partial symbol tables that have been built. However,
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index 349c68ed55e..b3deef4107d 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -1431,7 +1431,7 @@ const struct quick_symbol_functions psym_functions =
\f
static void
-sort_pst_symbols (struct objfile *objfile, struct partial_symtab *pst)
+sort_pst_symbols (struct partial_symtab *pst)
{
/* Sort the global list; don't sort the static list. */
std::sort (pst->global_psymbols.begin (),
@@ -1458,12 +1458,12 @@ partial_symtab::partial_symtab (const char *filename,
/* Perform "finishing up" operations of a partial symtab. */
void
-end_psymtab_common (struct objfile *objfile, struct partial_symtab *pst)
+end_psymtab_common (struct partial_symtab *pst)
{
pst->global_psymbols.shrink_to_fit ();
pst->static_psymbols.shrink_to_fit ();
- sort_pst_symbols (objfile, pst);
+ sort_pst_symbols (pst);
}
/* See psymtab.h. */
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 075ebee7012..3383032d1f3 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2000,7 +2000,7 @@ xcoff_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
first_fun_line_offset;
first_fun_line_offset = 0;
- end_psymtab_common (objfile, pst);
+ end_psymtab_common (pst);
pst->number_of_dependencies = number_dependencies;
if (number_dependencies)
--
2.17.2
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 3/4] Remove partial symbol statistics
2020-10-17 22:50 [PATCH 0/4] Minor psymtab cleanups Tom Tromey
2020-10-17 22:50 ` [PATCH 1/4] Remove init_psymbol_list Tom Tromey
2020-10-17 22:50 ` [PATCH 2/4] Remove parameter from end_psymtab_common Tom Tromey
@ 2020-10-17 22:50 ` Tom Tromey
2020-10-17 22:50 ` [PATCH 4/4] Change end_psymtab_common to a method Tom Tromey
2020-11-01 16:50 ` [PATCH 0/4] Minor psymtab cleanups Tom Tromey
4 siblings, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2020-10-17 22:50 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey
The "n_psyms" statistic in the per-objfile stats is not really needed,
but its use requires passing the objfile to add_psymbol. This patch
removes the field in favor of counting the psyms when needed.
Note that this is not exactly equivalent -- in the old approach, a
psymbol can in theory be created and then the psymtab discarded, which
would increment the counter. This does not seem very important to me.
I rewrote the code to count partial symbols; though TBH I think that
this information is not really very useful.
gdb/ChangeLog
2020-10-17 Tom Tromey <tom@tromey.com>
* symmisc.c (count_psyms): New function.
(print_objfile_statistics): Use it.
* psymtab.c (append_psymbol_to_list): Remove.
(partial_symtab::add_psymbol): Inline append_psymbol_to_list.
* objfiles.h (struct objstats) <n_psyms>: Remove.
---
gdb/ChangeLog | 8 ++++++++
gdb/objfiles.h | 3 ---
gdb/psymtab.c | 13 +------------
gdb/symmisc.c | 21 +++++++++++++++++++--
4 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/gdb/objfiles.h b/gdb/objfiles.h
index 549977ad257..bf3d7fcf253 100644
--- a/gdb/objfiles.h
+++ b/gdb/objfiles.h
@@ -194,9 +194,6 @@ struct obj_section
struct objstats
{
- /* Number of partial symbols read. */
- int n_psyms = 0;
-
/* Number of full symbols read. */
int n_syms = 0;
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index b3deef4107d..dc802a60f3c 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -1523,17 +1523,6 @@ add_psymbol_to_bcache (const partial_symbol &psymbol, struct objfile *objfile,
(&psymbol, sizeof (struct partial_symbol), added));
}
-/* Helper function, adds partial symbol to the given partial symbol list. */
-
-static void
-append_psymbol_to_list (std::vector<partial_symbol *> &list,
- struct partial_symbol *psym,
- struct objfile *objfile)
-{
- list.push_back (psym);
- OBJSTAT (objfile, n_psyms++);
-}
-
/* See psympriv.h. */
void
@@ -1555,7 +1544,7 @@ partial_symtab::add_psymbol (const partial_symbol &psymbol,
= (where == psymbol_placement::STATIC
? static_psymbols
: global_psymbols);
- append_psymbol_to_list (list, psym, objfile);
+ list.push_back (psym);
}
/* See psympriv.h. */
diff --git a/gdb/symmisc.c b/gdb/symmisc.c
index fc56cfa9381..8d748b9ebf7 100644
--- a/gdb/symmisc.c
+++ b/gdb/symmisc.c
@@ -39,6 +39,7 @@
#include "readline/tilde.h"
#include "psymtab.h"
+#include "psympriv.h"
/* Unfortunately for debugging, stderr is usually a macro. This is painful
when calling functions that take FILE *'s from the debugger.
@@ -73,6 +74,20 @@ print_symbol_bcache_statistics (void)
}
}
+/* Count the number of partial symbols in OBJFILE. */
+
+static int
+count_psyms (struct objfile *objfile)
+{
+ int count = 0;
+ for (partial_symtab *pst : objfile->psymtabs ())
+ {
+ count += pst->global_psymbols.size ();
+ count += pst->static_psymbols.size ();
+ }
+ return count;
+}
+
void
print_objfile_statistics (void)
{
@@ -89,9 +104,11 @@ print_objfile_statistics (void)
if (objfile->per_bfd->n_minsyms > 0)
printf_filtered (_(" Number of \"minimal\" symbols read: %d\n"),
objfile->per_bfd->n_minsyms);
- if (OBJSTAT (objfile, n_psyms) > 0)
+
+ int n_psyms = count_psyms (objfile);
+ if (n_psyms > 0)
printf_filtered (_(" Number of \"partial\" symbols read: %d\n"),
- OBJSTAT (objfile, n_psyms));
+ n_psyms);
if (OBJSTAT (objfile, n_syms) > 0)
printf_filtered (_(" Number of \"full\" symbols read: %d\n"),
OBJSTAT (objfile, n_syms));
--
2.17.2
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 4/4] Change end_psymtab_common to a method
2020-10-17 22:50 [PATCH 0/4] Minor psymtab cleanups Tom Tromey
` (2 preceding siblings ...)
2020-10-17 22:50 ` [PATCH 3/4] Remove partial symbol statistics Tom Tromey
@ 2020-10-17 22:50 ` Tom Tromey
2020-11-01 16:50 ` [PATCH 0/4] Minor psymtab cleanups Tom Tromey
4 siblings, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2020-10-17 22:50 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey
This changes end_psymtab_common to be a method on partial_symtab.
This seems a little cleaner to me.
gdb/ChangeLog
2020-10-17 Tom Tromey <tom@tromey.com>
* dbxread.c (dbx_end_psymtab): Update.
* dwarf2/read.c (process_psymtab_comp_unit_reader)
(build_type_psymtabs_reader): Update.
* xcoffread.c (xcoff_end_psymtab): Update.
* ctfread.c (scan_partial_symbols): Update.
* psymtab.c (sort_pst_symbols): Remove.
(partial_symtab::end): Rename from end_psymtab_common. Inline
sort_pst_symbols.
* psympriv.h (struct partial_symtab) <end>: New method.
(end_psymtab_common): Don't declare.
---
gdb/ChangeLog | 13 +++++++++++++
gdb/ctfread.c | 2 +-
gdb/dbxread.c | 2 +-
gdb/dwarf2/read.c | 4 ++--
gdb/psympriv.h | 6 ++++--
gdb/psymtab.c | 28 +++++++++++-----------------
gdb/xcoffread.c | 2 +-
7 files changed, 33 insertions(+), 24 deletions(-)
diff --git a/gdb/ctfread.c b/gdb/ctfread.c
index b8d8434f6ca..52eef801300 100644
--- a/gdb/ctfread.c
+++ b/gdb/ctfread.c
@@ -1464,7 +1464,7 @@ scan_partial_symbols (ctf_file_t *cfp, struct objfile *of)
0, language_c, of);
}
- end_psymtab_common (pst);
+ pst->end ();
}
/* Read CTF debugging information from a BFD section. This is
diff --git a/gdb/dbxread.c b/gdb/dbxread.c
index f9ee00718db..0d8c59e397e 100644
--- a/gdb/dbxread.c
+++ b/gdb/dbxread.c
@@ -2004,7 +2004,7 @@ dbx_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
/* End of kludge for patching Solaris textlow and texthigh. */
- end_psymtab_common (pst);
+ pst->end ();
pst->number_of_dependencies = number_dependencies;
if (number_dependencies)
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 37e51ea45c5..33d84fe0d42 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -7632,7 +7632,7 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
best_highpc + baseaddr)
- baseaddr);
- end_psymtab_common (pst);
+ pst->end ();
if (!cu->per_cu->imported_symtabs_empty ())
{
@@ -7758,7 +7758,7 @@ build_type_psymtabs_reader (const struct die_reader_specs *reader,
highpc = (CORE_ADDR) 0;
scan_partial_symbols (first_die, &lowpc, &highpc, 0, cu);
- end_psymtab_common (pst);
+ pst->end ();
}
/* Struct used to sort TUs by their abbreviation table offset. */
diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 53dfb1b1cdf..ac2c6117851 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -248,6 +248,10 @@ struct partial_symtab
struct objfile *objfile);
+ /* Indicate that this partial symtab is complete. */
+
+ void end ();
+
/* Chain of all existing partial symtabs. */
struct partial_symtab *next = nullptr;
@@ -436,8 +440,6 @@ struct legacy_psymtab : public standard_psymtab
void *read_symtab_private = nullptr;
};
-extern void end_psymtab_common (struct partial_symtab *);
-
/* Used when recording partial symbol tables. On destruction,
discards any partial symbol tables that have been built. However,
the tables can be kept by calling the "keep" method. */
diff --git a/gdb/psymtab.c b/gdb/psymtab.c
index dc802a60f3c..ef190d51146 100644
--- a/gdb/psymtab.c
+++ b/gdb/psymtab.c
@@ -1430,19 +1430,6 @@ const struct quick_symbol_functions psym_functions =
\f
-static void
-sort_pst_symbols (struct partial_symtab *pst)
-{
- /* Sort the global list; don't sort the static list. */
- std::sort (pst->global_psymbols.begin (),
- pst->global_psymbols.end (),
- [] (partial_symbol *s1, partial_symbol *s2)
- {
- return strcmp_iw_ordered (s1->ginfo.search_name (),
- s2->ginfo.search_name ()) < 0;
- });
-}
-
/* Partially fill a partial symtab. It will be completely filled at
the end of the symbol list. */
@@ -1458,12 +1445,19 @@ partial_symtab::partial_symtab (const char *filename,
/* Perform "finishing up" operations of a partial symtab. */
void
-end_psymtab_common (struct partial_symtab *pst)
+partial_symtab::end ()
{
- pst->global_psymbols.shrink_to_fit ();
- pst->static_psymbols.shrink_to_fit ();
+ global_psymbols.shrink_to_fit ();
+ static_psymbols.shrink_to_fit ();
- sort_pst_symbols (pst);
+ /* Sort the global list; don't sort the static list. */
+ std::sort (global_psymbols.begin (),
+ global_psymbols.end (),
+ [] (partial_symbol *s1, partial_symbol *s2)
+ {
+ return strcmp_iw_ordered (s1->ginfo.search_name (),
+ s2->ginfo.search_name ()) < 0;
+ });
}
/* See psymtab.h. */
diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c
index 3383032d1f3..2c837cfbfa6 100644
--- a/gdb/xcoffread.c
+++ b/gdb/xcoffread.c
@@ -2000,7 +2000,7 @@ xcoff_end_psymtab (struct objfile *objfile, legacy_psymtab *pst,
first_fun_line_offset;
first_fun_line_offset = 0;
- end_psymtab_common (pst);
+ pst->end ();
pst->number_of_dependencies = number_dependencies;
if (number_dependencies)
--
2.17.2
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 0/4] Minor psymtab cleanups
2020-10-17 22:50 [PATCH 0/4] Minor psymtab cleanups Tom Tromey
` (3 preceding siblings ...)
2020-10-17 22:50 ` [PATCH 4/4] Change end_psymtab_common to a method Tom Tromey
@ 2020-11-01 16:50 ` Tom Tromey
4 siblings, 0 replies; 6+ messages in thread
From: Tom Tromey @ 2020-11-01 16:50 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
>>>>> "Tom" == Tom Tromey <tom@tromey.com> writes:
Tom> Here are a few minor psymtab cleanups that were discussed in the
Tom> earlier thread about changing psymtab storage.
Tom> Regression tested on x86-64 Fedora 28.
I've rebased & re-regression tested this, and now I'm checking it in.
Tom
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-11-01 16:50 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-17 22:50 [PATCH 0/4] Minor psymtab cleanups Tom Tromey
2020-10-17 22:50 ` [PATCH 1/4] Remove init_psymbol_list Tom Tromey
2020-10-17 22:50 ` [PATCH 2/4] Remove parameter from end_psymtab_common Tom Tromey
2020-10-17 22:50 ` [PATCH 3/4] Remove partial symbol statistics Tom Tromey
2020-10-17 22:50 ` [PATCH 4/4] Change end_psymtab_common to a method Tom Tromey
2020-11-01 16:50 ` [PATCH 0/4] Minor psymtab cleanups Tom Tromey
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).