xref: /freebsd-src/contrib/llvm-project/llvm/lib/Bitcode/Reader/ValueList.h (revision fcaf7f8644a9988098ac6be2165bce3ea4786e91)
10b57cec5SDimitry Andric //===-- Bitcode/Reader/ValueList.h - Number values --------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This class gives values and types Unique ID's.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #ifndef LLVM_LIB_BITCODE_READER_VALUELIST_H
140b57cec5SDimitry Andric #define LLVM_LIB_BITCODE_READER_VALUELIST_H
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric #include "llvm/IR/ValueHandle.h"
17*81ad6265SDimitry Andric #include "llvm/Support/Error.h"
180b57cec5SDimitry Andric #include <cassert>
190b57cec5SDimitry Andric #include <utility>
200b57cec5SDimitry Andric #include <vector>
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric namespace llvm {
230b57cec5SDimitry Andric 
24*81ad6265SDimitry Andric class Error;
250b57cec5SDimitry Andric class Type;
260b57cec5SDimitry Andric class Value;
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric class BitcodeReaderValueList {
29*81ad6265SDimitry Andric   /// Maps Value ID to pair of Value* and Type ID.
30*81ad6265SDimitry Andric   std::vector<std::pair<WeakTrackingVH, unsigned>> ValuePtrs;
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric   /// Maximum number of valid references. Forward references exceeding the
330b57cec5SDimitry Andric   /// maximum must be invalid.
340b57cec5SDimitry Andric   unsigned RefsUpperBound;
350b57cec5SDimitry Andric 
36*81ad6265SDimitry Andric   using MaterializeValueFnTy =
37*81ad6265SDimitry Andric       std::function<Expected<Value *>(unsigned, BasicBlock *)>;
38*81ad6265SDimitry Andric   MaterializeValueFnTy MaterializeValueFn;
390b57cec5SDimitry Andric 
40*81ad6265SDimitry Andric public:
BitcodeReaderValueList(size_t RefsUpperBound,MaterializeValueFnTy MaterializeValueFn)41*81ad6265SDimitry Andric   BitcodeReaderValueList(size_t RefsUpperBound,
42*81ad6265SDimitry Andric                          MaterializeValueFnTy MaterializeValueFn)
43*81ad6265SDimitry Andric       : RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(),
44*81ad6265SDimitry Andric                                 RefsUpperBound)),
45*81ad6265SDimitry Andric         MaterializeValueFn(MaterializeValueFn) {}
460b57cec5SDimitry Andric 
470b57cec5SDimitry Andric   // vector compatibility methods
size()480b57cec5SDimitry Andric   unsigned size() const { return ValuePtrs.size(); }
resize(unsigned N)490b57cec5SDimitry Andric   void resize(unsigned N) {
500b57cec5SDimitry Andric     ValuePtrs.resize(N);
510b57cec5SDimitry Andric   }
push_back(Value * V,unsigned TypeID)52*81ad6265SDimitry Andric   void push_back(Value *V, unsigned TypeID) {
53*81ad6265SDimitry Andric     ValuePtrs.emplace_back(V, TypeID);
54*81ad6265SDimitry Andric   }
550b57cec5SDimitry Andric 
clear()560b57cec5SDimitry Andric   void clear() {
570b57cec5SDimitry Andric     ValuePtrs.clear();
580b57cec5SDimitry Andric   }
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric   Value *operator[](unsigned i) const {
610b57cec5SDimitry Andric     assert(i < ValuePtrs.size());
62*81ad6265SDimitry Andric     return ValuePtrs[i].first;
630b57cec5SDimitry Andric   }
640b57cec5SDimitry Andric 
getTypeID(unsigned ValNo)65*81ad6265SDimitry Andric   unsigned getTypeID(unsigned ValNo) const {
66*81ad6265SDimitry Andric     assert(ValNo < ValuePtrs.size());
67*81ad6265SDimitry Andric     return ValuePtrs[ValNo].second;
68*81ad6265SDimitry Andric   }
69*81ad6265SDimitry Andric 
back()70*81ad6265SDimitry Andric   Value *back() const { return ValuePtrs.back().first; }
pop_back()710b57cec5SDimitry Andric   void pop_back() {
720b57cec5SDimitry Andric     ValuePtrs.pop_back();
730b57cec5SDimitry Andric   }
empty()740b57cec5SDimitry Andric   bool empty() const { return ValuePtrs.empty(); }
750b57cec5SDimitry Andric 
shrinkTo(unsigned N)760b57cec5SDimitry Andric   void shrinkTo(unsigned N) {
770b57cec5SDimitry Andric     assert(N <= size() && "Invalid shrinkTo request!");
780b57cec5SDimitry Andric     ValuePtrs.resize(N);
790b57cec5SDimitry Andric   }
800b57cec5SDimitry Andric 
replaceValueWithoutRAUW(unsigned ValNo,Value * NewV)81*81ad6265SDimitry Andric   void replaceValueWithoutRAUW(unsigned ValNo, Value *NewV) {
82*81ad6265SDimitry Andric     assert(ValNo < ValuePtrs.size());
83*81ad6265SDimitry Andric     ValuePtrs[ValNo].first = NewV;
84*81ad6265SDimitry Andric   }
850b57cec5SDimitry Andric 
86*81ad6265SDimitry Andric   Value *getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID,
87*81ad6265SDimitry Andric                         BasicBlock *ConstExprInsertBB);
880b57cec5SDimitry Andric 
89*81ad6265SDimitry Andric   Error assignValue(unsigned Idx, Value *V, unsigned TypeID);
900b57cec5SDimitry Andric };
910b57cec5SDimitry Andric 
920b57cec5SDimitry Andric } // end namespace llvm
930b57cec5SDimitry Andric 
940b57cec5SDimitry Andric #endif // LLVM_LIB_BITCODE_READER_VALUELIST_H
95