50 lines · cpp
1//===- GCStrategy.cpp - Garbage Collector Description ---------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the policy object GCStrategy which describes the10// behavior of a given garbage collector.11//12//===----------------------------------------------------------------------===//13 14#include "llvm/IR/GCStrategy.h"15#include "llvm/ADT/Twine.h"16#include "llvm/IR/BuiltinGCs.h"17 18using namespace llvm;19 20LLVM_INSTANTIATE_REGISTRY(GCRegistry)21 22GCStrategy::GCStrategy() = default;23 24std::unique_ptr<GCStrategy> llvm::getGCStrategy(const StringRef Name) {25 for (auto &S : GCRegistry::entries())26 if (S.getName() == Name)27 return S.instantiate();28 29 // We need to link all the builtin GCs when LLVM is used as a static library.30 // The linker will quite happily remove the static constructors that register31 // the builtin GCs if we don't use a function from that object. This function32 // does nothing but we need to make sure it is (or at least could be, even33 // with all optimisations enabled) called *somewhere*, and this is a good34 // place to do that: if the GC strategies are being used then this function35 // obviously can't be removed by the linker, and here it won't affect36 // performance, since there's about to be a fatal error anyway.37 llvm::linkAllBuiltinGCs();38 39 if (GCRegistry::begin() == GCRegistry::end()) {40 // In normal operation, the registry should not be empty. There should41 // be the builtin GCs if nothing else. The most likely scenario here is42 // that we got here without running the initializers used by the Registry43 // itself and it's registration mechanism.44 report_fatal_error(45 "unsupported GC: " + Name +46 " (did you remember to link and initialize the library?)");47 } else48 report_fatal_error(Twine("unsupported GC: ") + Name);49}50