Link the default GC strategies everywhere getGCStrategy is used.
authorCampbell Suter <znix@znix.xyz>
Thu, 22 Dec 2022 14:29:58 +0000 (21:29 +0700)
committerDenis Antrushin <dantrushin@gmail.com>
Tue, 3 Jan 2023 08:07:03 +0000 (15:07 +0700)
commitc40697a1b76d9eed978900db759a66d97fbde70b
tree6bf276369c747e20e1544d98525913b2abf28257
parent998a3a38948c9d220ddc759b8a6eee987e3ad320
Link the default GC strategies everywhere getGCStrategy is used.

GC strategies are registered using a system of global constructors: any
object can include a GCRegistry::Add stataic variable to register a
strategy, and that will generate a static constructor which registers
this strategy into a global list.

This allows shared libraries to easily register their own strategies,
but poses a problem related to linking: the default GC strategies
(defined and registered in their own file) must obviously be included in
LLVM binaries.

The previous solution was to define an empty functon in BuiltinGCs.cpp,
and call it from LinkAllCodegenComponents.h - this is the solution used
for many other codegen components. This header is then included into the
llc and lli main source files, ensuring everything gets linked into
those binaries.

This isn't great for GCStrategy, which we'd like [1] to use in other
binaries, notably opt for the RS4GC [2] pass. Instead of doing something
specific to opt (for example, adding a call in LinkAllIR), this patch
links to the registry function from getGCStrategy, in the assumption
that anything that might look up a GC strategy probably also expects
the default strategies to exist.

[1] https://reviews.llvm.org/D140458
[2] RewriteStatepointsForGC

Differential Revision: https://reviews.llvm.org/D140504
llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h
llvm/lib/IR/GCStrategy.cpp