brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.1 KiB · 67f363d Raw
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