diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/IR/GCStrategy.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/IR/GCStrategy.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/IR/GCStrategy.cpp b/contrib/llvm-project/llvm/lib/IR/GCStrategy.cpp new file mode 100644 index 000000000000..f3bc5b74f8fd --- /dev/null +++ b/contrib/llvm-project/llvm/lib/IR/GCStrategy.cpp @@ -0,0 +1,38 @@ +//===- GCStrategy.cpp - Garbage Collector Description ---------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements the policy object GCStrategy which describes the +// behavior of a given garbage collector. +// +//===----------------------------------------------------------------------===// + +#include "llvm/IR/GCStrategy.h" + +using namespace llvm; + +LLVM_INSTANTIATE_REGISTRY(GCRegistry) + +GCStrategy::GCStrategy() = default; + +std::unique_ptr<GCStrategy> llvm::getGCStrategy(const StringRef Name) { + for (auto &S : GCRegistry::entries()) + if (S.getName() == Name) + return S.instantiate(); + + 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 + // that we got here without running the initializers used by the Registry + // itself and it's registration mechanism. + const std::string error = + std::string("unsupported GC: ") + Name.str() + + " (did you remember to link and initialize the library?)"; + report_fatal_error(error); + } else + report_fatal_error(std::string("unsupported GC: ") + Name.str()); +} |