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