xo-gc stack: + gc-location-of() primitive

This commit is contained in:
Roland Conybeare 2026-03-29 19:47:15 -04:00
commit 909c1e485a
5 changed files with 28 additions and 1 deletions

View file

@ -65,6 +65,10 @@ public:
virtual size_type committed(Copaque data, Generation g, role r) const noexcept = 0;
/** address space reserved for this collector **/
virtual size_type reserved(Copaque data, Generation g, role r) const noexcept = 0;
/** Location of object in collector. -1 if not in collector memory.
Other negative values represent collector error states (good luck!).
Exact meaning of non-negative values up to collector implementation **/
virtual std::int32_t locate_address(Copaque data, const void * addr) const noexcept = 0;
/** true if gc responsible for data at @p addr, and data belongs to role @p r **/
virtual bool contains(Copaque data, role r, const void * addr) const noexcept = 0;
/** true iff gc-aware object of type @p tseq is installed in this collector **/

View file

@ -62,6 +62,7 @@ namespace mm {
[[noreturn]] size_type allocated(Copaque, Generation, role) const noexcept override { _fatal(); }
[[noreturn]] size_type committed(Copaque, Generation, role) const noexcept override { _fatal(); }
[[noreturn]] size_type reserved(Copaque, Generation, role) const noexcept override { _fatal(); }
[[noreturn]] std::int32_t locate_address(Copaque, const void *) const noexcept override { _fatal(); }
[[noreturn]] bool contains(Copaque, role, const void *) const noexcept override { _fatal(); }
[[noreturn]] bool is_type_installed(Copaque, typeseq) const noexcept override { _fatal(); }
[[noreturn]] bool report_statistics(Copaque, obj<AAllocator>, obj<AAllocator>, obj<AGCObject> *) const noexcept override { _fatal(); }

View file

@ -55,6 +55,9 @@ namespace mm {
size_type reserved(Copaque data, Generation g, role r) const noexcept override {
return I::reserved(_dcast(data), g, r);
}
std::int32_t locate_address(Copaque data, const void * addr) const noexcept override {
return I::locate_address(_dcast(data), addr);
}
bool contains(Copaque data, role r, const void * addr) const noexcept override {
return I::contains(_dcast(data), r, addr);
}

View file

@ -88,6 +88,9 @@ public:
size_type reserved(Generation g, role r) const noexcept {
return O::iface()->reserved(O::data(), g, r);
}
std::int32_t locate_address(const void * addr) const noexcept {
return O::iface()->locate_address(O::data(), addr);
}
bool contains(role r, const void * addr) const noexcept {
return O::iface()->contains(O::data(), r, addr);
}