Viewing file: ConstantInitFuture.h (3.3 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
//===- ConstantInitFuture.h - "Future" constant initializers ----*- 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 class defines the ConstantInitFuture class. This is split out // from ConstantInitBuilder.h in order to allow APIs to work with it // without having to include that entire header. This is particularly // important because it is often useful to be able to default-construct // a future in, say, a default argument. // //===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_CODEGEN_CONSTANTINITFUTURE_H #define LLVM_CLANG_CODEGEN_CONSTANTINITFUTURE_H
#include "llvm/ADT/PointerUnion.h" #include "llvm/IR/Constant.h"
// Forward-declare ConstantInitBuilderBase and give it a // PointerLikeTypeTraits specialization so that we can safely use it // in a PointerUnion below. namespace clang { namespace CodeGen { class ConstantInitBuilderBase; } } namespace llvm { template <> struct PointerLikeTypeTraits< ::clang::CodeGen::ConstantInitBuilderBase*> { using T = ::clang::CodeGen::ConstantInitBuilderBase*;
static inline void *getAsVoidPointer(T p) { return p; } static inline T getFromVoidPointer(void *p) {return static_cast<T>(p);} static constexpr int NumLowBitsAvailable = 2; }; }
namespace clang { namespace CodeGen {
/// A "future" for a completed constant initializer, which can be passed /// around independently of any sub-builders (but not the original parent). class ConstantInitFuture { using PairTy = llvm::PointerUnion<ConstantInitBuilderBase*, llvm::Constant*>;
PairTy Data;
friend class ConstantInitBuilderBase; explicit ConstantInitFuture(ConstantInitBuilderBase *builder);
public: ConstantInitFuture() {}
/// A future can be explicitly created from a fixed initializer. explicit ConstantInitFuture(llvm::Constant *initializer) : Data(initializer) { assert(initializer && "creating null future"); }
/// Is this future non-null? explicit operator bool() const { return bool(Data); }
/// Return the type of the initializer. llvm::Type *getType() const;
/// Abandon this initializer. void abandon();
/// Install the initializer into a global variable. This cannot /// be called multiple times. void installInGlobal(llvm::GlobalVariable *global);
void *getOpaqueValue() const { return Data.getOpaqueValue(); } static ConstantInitFuture getFromOpaqueValue(void *value) { ConstantInitFuture result; result.Data = PairTy::getFromOpaqueValue(value); return result; } static constexpr int NumLowBitsAvailable = llvm::PointerLikeTypeTraits<PairTy>::NumLowBitsAvailable; };
} // end namespace CodeGen } // end namespace clang
namespace llvm {
template <> struct PointerLikeTypeTraits< ::clang::CodeGen::ConstantInitFuture> { using T = ::clang::CodeGen::ConstantInitFuture;
static inline void *getAsVoidPointer(T future) { return future.getOpaqueValue(); } static inline T getFromVoidPointer(void *p) { return T::getFromOpaqueValue(p); } static constexpr int NumLowBitsAvailable = T::NumLowBitsAvailable; };
} // end namespace llvm
#endif
|