//===- llvm/IR/Statepoint.h - gc.statepoint utilities -----------*- C++ -*-===// // // 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 contains utility functions and a wrapper class analogous to // CallBase for accessing the fields of gc.statepoint, gc.relocate, // gc.result intrinsics; and some general utilities helpful when dealing with // gc.statepoint. // //===----------------------------------------------------------------------===// #ifndef LLVM_IR_STATEPOINT_H #define LLVM_IR_STATEPOINT_H #include "llvm/ADT/iterator_range.h" #include "llvm/IR/Attributes.h" #include "llvm/IR/Constants.h" #include "llvm/IR/Function.h" #include "llvm/IR/InstrTypes.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Intrinsics.h" #include "llvm/Support/Casting.h" #include "llvm/Support/MathExtras.h" #include <cassert> #include <cstddef> #include <cstdint> #include <optional> #include <vector> namespace llvm { /// The statepoint intrinsic accepts a set of flags as its third argument. /// Valid values come out of this set. enum class StatepointFlags { … }; // These two are defined in IntrinsicInst since they're part of the // IntrinsicInst class hierarchy. class GCRelocateInst; /// Represents a gc.statepoint intrinsic call. This extends directly from /// CallBase as the IntrinsicInst only supports calls and gc.statepoint is /// invokable. class GCStatepointInst : public CallBase { … }; std::vector<const GCRelocateInst *> GCStatepointInst::getGCRelocates() const { … } /// Call sites that get wrapped by a gc.statepoint (currently only in /// RewriteStatepointsForGC and potentially in other passes in the future) can /// have attributes that describe properties of gc.statepoint call they will be /// eventually be wrapped in. This struct is used represent such directives. struct StatepointDirectives { … }; /// Parse out statepoint directives from the function attributes present in \p /// AS. StatepointDirectives parseStatepointDirectivesFromAttrs(AttributeList AS); /// Return \c true if the \p Attr is an attribute that is a statepoint /// directive. bool isStatepointDirectiveAttr(Attribute Attr); } // end namespace llvm #endif // LLVM_IR_STATEPOINT_H