diff --git a/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h b/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h --- a/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h +++ b/llvm/include/llvm/CodeGen/LinkAllCodegenComponents.h @@ -14,7 +14,6 @@ #ifndef LLVM_CODEGEN_LINKALLCODEGENCOMPONENTS_H #define LLVM_CODEGEN_LINKALLCODEGENCOMPONENTS_H -#include "llvm/IR/BuiltinGCs.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/SchedulerRegistry.h" #include "llvm/Target/TargetMachine.h" @@ -38,8 +37,6 @@ (void) llvm::createGreedyRegisterAllocator(); (void) llvm::createDefaultPBQPRegisterAllocator(); - llvm::linkAllBuiltinGCs(); - (void) llvm::createBURRListDAGScheduler(nullptr, llvm::CodeGenOpt::Default); (void) llvm::createSourceListDAGScheduler(nullptr, diff --git a/llvm/lib/IR/GCStrategy.cpp b/llvm/lib/IR/GCStrategy.cpp --- a/llvm/lib/IR/GCStrategy.cpp +++ b/llvm/lib/IR/GCStrategy.cpp @@ -13,6 +13,7 @@ #include "llvm/IR/GCStrategy.h" #include "llvm/ADT/Twine.h" +#include "llvm/IR/BuiltinGCs.h" using namespace llvm; @@ -25,6 +26,16 @@ if (S.getName() == Name) return S.instantiate(); + // We need to link all the builtin GCs when LLVM is used as a static library. + // The linker will quite happily remove the static constructors that register + // the builtin GCs if we don't use a function from that object. This function + // does nothing but we need to make sure it is (or at least could be, even + // with all optimisations enabled) called *somewhere*, and this is a good + // place to do that: if the GC strategies are being used then this function + // obviously can't be removed by the linker, and here it won't affect + // performance, since there's about to be a fatal error anyway. + llvm::linkAllBuiltinGCs(); + if (GCRegistry::begin() == GCRegistry::end()) { // In normal operation, the registry should not be empty. There should // be the builtin GCs if nothing else. The most likely scenario here is