1c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//===- ConstantInitFuture.h - "Future" constant initializers ----*- C++ -*-===// 2c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// 3c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// The LLVM Compiler Infrastructure 4c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// 5c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// This file is distributed under the University of Illinois Open Source 6c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// License. See LICENSE.TXT for details. 7c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// 8c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//===----------------------------------------------------------------------===// 9c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// 10c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// This class defines the ConstantInitFuture class. This is split out 11c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// from ConstantInitBuilder.h in order to allow APIs to work with it 12c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// without having to include that entire header. This is particularly 13c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// important because it is often useful to be able to default-construct 14c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// a future in, say, a default argument. 15c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// 16c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot//===----------------------------------------------------------------------===// 17c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 18c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#ifndef LLVM_CLANG_CODEGEN_CONSTANTINITFUTURE_H 19c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#define LLVM_CLANG_CODEGEN_CONSTANTINITFUTURE_H 20c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 21c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/ADT/PointerUnion.h" 22c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#include "llvm/IR/Constant.h" 23c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 24c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// Forward-declare ConstantInitBuilderBase and give it a 25c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// PointerLikeTypeTraits specialization so that we can safely use it 26c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot// in a PointerUnion below. 27c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotnamespace clang { 28c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotnamespace CodeGen { 29c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotclass ConstantInitBuilderBase; 30c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot} 31c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot} 32c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotnamespace llvm { 33c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robottemplate <> 34c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotstruct PointerLikeTypeTraits< ::clang::CodeGen::ConstantInitBuilderBase*> { 35c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot using T = ::clang::CodeGen::ConstantInitBuilderBase*; 36c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 37c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot static inline void *getAsVoidPointer(T p) { return p; } 38c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot static inline T getFromVoidPointer(void *p) {return static_cast<T>(p);} 39c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot enum { NumLowBitsAvailable = 2 }; 40c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}; 41c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot} 42c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 43c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotnamespace clang { 44c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotnamespace CodeGen { 45c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 46c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// A "future" for a completed constant initializer, which can be passed 47c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot/// around independently of any sub-builders (but not the original parent). 48c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotclass ConstantInitFuture { 49c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot using PairTy = llvm::PointerUnion<ConstantInitBuilderBase*, llvm::Constant*>; 50c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 51c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot PairTy Data; 52c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 53c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot friend class ConstantInitBuilderBase; 54c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot explicit ConstantInitFuture(ConstantInitBuilderBase *builder); 55c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 56c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotpublic: 57c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot ConstantInitFuture() {} 58c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 59c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot /// A future can be explicitly created from a fixed initializer. 60c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot explicit ConstantInitFuture(llvm::Constant *initializer) : Data(initializer) { 61c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot assert(initializer && "creating null future"); 62c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot } 63c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 64c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot /// Is this future non-null? 65c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot explicit operator bool() const { return bool(Data); } 66c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 67c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot /// Return the type of the initializer. 68c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot llvm::Type *getType() const; 69c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 70c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot /// Abandon this initializer. 71c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot void abandon(); 72c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 73c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot /// Install the initializer into a global variable. This cannot 74c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot /// be called multiple times. 75c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot void installInGlobal(llvm::GlobalVariable *global); 76c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 77c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot void *getOpaqueValue() const { return Data.getOpaqueValue(); } 78c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot static ConstantInitFuture getFromOpaqueValue(void *value) { 79c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot ConstantInitFuture result; 80c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot result.Data = PairTy::getFromOpaqueValue(value); 81c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot return result; 82c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot } 83c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot enum { 84c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot NumLowBitsAvailable = 85c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot llvm::PointerLikeTypeTraits<PairTy>::NumLowBitsAvailable 86c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot }; 87c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}; 88c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 89c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot} // end namespace CodeGen 90c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot} // end namespace clang 91c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 92c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotnamespace llvm { 93c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 94c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robottemplate <> 95c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robotstruct PointerLikeTypeTraits< ::clang::CodeGen::ConstantInitFuture> { 96c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot using T = ::clang::CodeGen::ConstantInitFuture; 97c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 98c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot static inline void *getAsVoidPointer(T future) { 99c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot return future.getOpaqueValue(); 100c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot } 101c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot static inline T getFromVoidPointer(void *p) { 102c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot return T::getFromOpaqueValue(p); 103c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot } 104c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot enum { NumLowBitsAvailable = T::NumLowBitsAvailable }; 105c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot}; 106c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 107c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot} // end namespace llvm 108c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot 109c9cc9e7d29b8970d8ddb734c88fb62d01e0b727android-build-team Robot#endif 110