#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"
(void) llvm::createGreedyRegisterAllocator();
(void) llvm::createDefaultPBQPRegisterAllocator();
- llvm::linkAllBuiltinGCs();
-
(void) llvm::createBURRListDAGScheduler(nullptr,
llvm::CodeGenOpt::Default);
(void) llvm::createSourceListDAGScheduler(nullptr,
#include "llvm/IR/GCStrategy.h"
#include "llvm/ADT/Twine.h"
+#include "llvm/IR/BuiltinGCs.h"
using namespace llvm;
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