xref: /llvm-project/llvm/lib/Bitcode/Reader/ValueList.h (revision 3112987d5c20ec6878420ca71773aa8c73cb49f2)
1975293f0SEugene Zelenko //===-- Bitcode/Reader/ValueList.h - Number values --------------*- C++ -*-===//
2ef27db87SMehdi Amini //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ef27db87SMehdi Amini //
7ef27db87SMehdi Amini //===----------------------------------------------------------------------===//
8ef27db87SMehdi Amini //
9ef27db87SMehdi Amini // This class gives values and types Unique ID's.
10ef27db87SMehdi Amini //
11ef27db87SMehdi Amini //===----------------------------------------------------------------------===//
12ef27db87SMehdi Amini 
13975293f0SEugene Zelenko #ifndef LLVM_LIB_BITCODE_READER_VALUELIST_H
14975293f0SEugene Zelenko #define LLVM_LIB_BITCODE_READER_VALUELIST_H
15ef27db87SMehdi Amini 
16975293f0SEugene Zelenko #include "llvm/IR/ValueHandle.h"
17*f5bab24aSNikita Popov #include "llvm/Support/Error.h"
18975293f0SEugene Zelenko #include <cassert>
19975293f0SEugene Zelenko #include <utility>
20ef27db87SMehdi Amini #include <vector>
21ef27db87SMehdi Amini 
22ef27db87SMehdi Amini namespace llvm {
23975293f0SEugene Zelenko 
24cda82d39SNikita Popov class Error;
25975293f0SEugene Zelenko class Type;
26975293f0SEugene Zelenko class Value;
27ef27db87SMehdi Amini 
28ef27db87SMehdi Amini class BitcodeReaderValueList {
29b6eafba2SNikita Popov   /// Maps Value ID to pair of Value* and Type ID.
30b6eafba2SNikita Popov   std::vector<std::pair<WeakTrackingVH, unsigned>> ValuePtrs;
31ef27db87SMehdi Amini 
32864474c9SFlorian Hahn   /// Maximum number of valid references. Forward references exceeding the
33864474c9SFlorian Hahn   /// maximum must be invalid.
34864474c9SFlorian Hahn   unsigned RefsUpperBound;
35864474c9SFlorian Hahn 
36941c8e0eSNikita Popov   using MaterializeValueFnTy =
37941c8e0eSNikita Popov       std::function<Expected<Value *>(unsigned, BasicBlock *)>;
38941c8e0eSNikita Popov   MaterializeValueFnTy MaterializeValueFn;
39975293f0SEugene Zelenko 
40941c8e0eSNikita Popov public:
BitcodeReaderValueList(size_t RefsUpperBound,MaterializeValueFnTy MaterializeValueFn)41941c8e0eSNikita Popov   BitcodeReaderValueList(size_t RefsUpperBound,
42941c8e0eSNikita Popov                          MaterializeValueFnTy MaterializeValueFn)
43941c8e0eSNikita Popov       : RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(),
44941c8e0eSNikita Popov                                 RefsUpperBound)),
45941c8e0eSNikita Popov         MaterializeValueFn(MaterializeValueFn) {}
46ef27db87SMehdi Amini 
47ef27db87SMehdi Amini   // vector compatibility methods
size()48ef27db87SMehdi Amini   unsigned size() const { return ValuePtrs.size(); }
resize(unsigned N)49a4771e9dSTim Northover   void resize(unsigned N) {
50a4771e9dSTim Northover     ValuePtrs.resize(N);
51a4771e9dSTim Northover   }
push_back(Value * V,unsigned TypeID)52b6eafba2SNikita Popov   void push_back(Value *V, unsigned TypeID) {
53b6eafba2SNikita Popov     ValuePtrs.emplace_back(V, TypeID);
54b6eafba2SNikita Popov   }
55ef27db87SMehdi Amini 
clear()56ef27db87SMehdi Amini   void clear() {
57ef27db87SMehdi Amini     ValuePtrs.clear();
58ef27db87SMehdi Amini   }
59ef27db87SMehdi Amini 
60ef27db87SMehdi Amini   Value *operator[](unsigned i) const {
61ef27db87SMehdi Amini     assert(i < ValuePtrs.size());
62b6eafba2SNikita Popov     return ValuePtrs[i].first;
63ef27db87SMehdi Amini   }
64ef27db87SMehdi Amini 
getTypeID(unsigned ValNo)65b6eafba2SNikita Popov   unsigned getTypeID(unsigned ValNo) const {
66b6eafba2SNikita Popov     assert(ValNo < ValuePtrs.size());
67b6eafba2SNikita Popov     return ValuePtrs[ValNo].second;
68b6eafba2SNikita Popov   }
69b6eafba2SNikita Popov 
back()70b6eafba2SNikita Popov   Value *back() const { return ValuePtrs.back().first; }
pop_back()71a4771e9dSTim Northover   void pop_back() {
72a4771e9dSTim Northover     ValuePtrs.pop_back();
73a4771e9dSTim Northover   }
empty()74ef27db87SMehdi Amini   bool empty() const { return ValuePtrs.empty(); }
75ef27db87SMehdi Amini 
shrinkTo(unsigned N)76ef27db87SMehdi Amini   void shrinkTo(unsigned N) {
77ef27db87SMehdi Amini     assert(N <= size() && "Invalid shrinkTo request!");
78ef27db87SMehdi Amini     ValuePtrs.resize(N);
79ef27db87SMehdi Amini   }
80ef27db87SMehdi Amini 
replaceValueWithoutRAUW(unsigned ValNo,Value * NewV)81941c8e0eSNikita Popov   void replaceValueWithoutRAUW(unsigned ValNo, Value *NewV) {
82941c8e0eSNikita Popov     assert(ValNo < ValuePtrs.size());
83941c8e0eSNikita Popov     ValuePtrs[ValNo].first = NewV;
84941c8e0eSNikita Popov   }
85941c8e0eSNikita Popov 
86941c8e0eSNikita Popov   Value *getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID,
87941c8e0eSNikita Popov                         BasicBlock *ConstExprInsertBB);
88ef27db87SMehdi Amini 
89cda82d39SNikita Popov   Error assignValue(unsigned Idx, Value *V, unsigned TypeID);
90ef27db87SMehdi Amini };
91ef27db87SMehdi Amini 
92975293f0SEugene Zelenko } // end namespace llvm
93975293f0SEugene Zelenko 
94975293f0SEugene Zelenko #endif // LLVM_LIB_BITCODE_READER_VALUELIST_H
95