impart_mark_stickiness skipped pointers into gen 0, which is fine if
both the value and the object are allocated before the card mark is
stored. Eliminating a barrier may insert an allocation sequence
between two stores, which may cause the value and the object to have
different generations.
The extra cost of looking at more card marks should not be significant
and reducing code size and performance of consequent stores is
valuable.
The C runtime will soon need to support the new mark-region collector which
is generational in nature with the identical heap structure as gencgc.
For clarity's sake, :GENCGC will refer to the specific implementation
contained in the file gencgc.c, whereas :GENERATIONAL shall imply either
gencgc or :MARK-REGION-GC without having to spell the (OR ...) everywhere.
The new feature name is not perfect- there could exist an incompatible
generational GC. Deal with that later, if ever.
That said, a few techniques were used in changing featureization:
- If it was code we would like to work on any GC, then delete the conditional.
Later, conditional code could be re-added if something can't be made to work
for whatever different GC is implemented.
- If it was something such as GENERATION-OF we'd like to remember not to allow
to be called with a non-generational collector, add #+generational.
- If something was #-gencgc but meant "#+cheneygc" then either change to that
or delete the code. Retained dead code is a hint to where subsequent changes
might be required if not obvious, for example the compiler's decision about
L-T-V and value-cells. Absence of a feature marker could leave you wondering.
- No machine-dependent files were touched, as the mark-region collector
will support only x86-64 at present.
(I don't always write long commit messages, but when I do, they concern
multiple work-in-progress GC implementations.)
This partially reverts 369a4c8cf3. It is
actually possible to do what :IGNORE-IT used to do in totally plain
and conforming Lisp code, by having a null load form. Thus we bring
back :IGNORE-IT but only as a convenient macro shortcut, not as the
magic non-conformant hack it used to be. A null load form would not
have actually worked in the past, because of the ancient (going as far
back as the introduction of make-load-form support in CMU CL) bug
fixed in 71e0191458. What OPAQUE-BOX
really accomplished was just preventing the literal processing code to
recurse through the substructure, but we never should have done that
in the first place outside of the MAKE-LOAD-FORM-SAVING-SLOTS =>
DUMP-STRUCTURE case. (Or when the creation and init forms actually
have subpart references.)
Advantages of the "new" scheme include:
* Localizing the structures that shouldn't be dumped to the make load
form method, which makes sense.
* Decreased maintenance burden from having to figure out how to thread
OPAQUE-BOX and OPAQUELY-QUOTE, when it is much easier to just declare
that a structure doesn't need to be grovelled or dumped.
* Possible extension to structures which are not as amenable to opaque
quoting, thereby allowing potentially more DEF!STRUCTs to get removed.
I'm unsure if was actually testing anything any more.
The new test directly asserts what it needs, which is that cleaning
a card sees the high half of an instance (or funinstance) header word.