LLVM: lib/CGData/StableFunctionMapRecord.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
18
19#define DEBUG_TYPE "stable-function-map-record"
20
21using namespace llvm;
23
26
27namespace llvm {
28namespace yaml {
29
37
47
48}
49}
50
51
56 for (auto &Func : P.second.Entries)
58
60 FuncEntries, [&](auto &A, auto &B) {
61 return std::tuple(A->Hash, SFM.getNameForId(A->ModuleNameId),
63 std::tuple(B->Hash, SFM.getNameForId(B->ModuleNameId),
65 });
66 return FuncEntries;
67}
68
69
74 IndexOperandHashes.emplace_back(Indices, OpndHash);
75
77 return IndexOperandHashes;
78}
79
81 raw_ostream &OS, std::vector &PatchItems) const {
83}
84
87 std::vector &PatchItems) {
89
90
93
94
95 const uint64_t NamesByteSizeOffset = Writer.OS.tell();
97 for (auto &Name : Names)
98 Writer.OS << Name << '\0';
99
102 Writer.OS << '\0';
103 const auto NamesByteSize =
104 Writer.OS.tell() - NamesByteSizeOffset - sizeof(NamesByteSizeOffset);
105 PatchItems.emplace_back(NamesByteSizeOffset, &NamesByteSize, 1);
106
107
110 for (const auto *FuncRef : FuncEntries)
112 std::vector<uint64_t> IndexOperandHashesOffsets;
113 IndexOperandHashesOffsets.reserve(FuncEntries.size());
114 for (const auto *FuncRef : FuncEntries) {
119 IndexOperandHashesOffsets.push_back(Offset);
121 }
122 const uint64_t IndexOperandHashesByteSizeOffset = Writer.OS.tell();
124 for (size_t I = 0; I < FuncEntries.size(); ++I) {
126 PatchItems.emplace_back(IndexOperandHashesOffsets[I], &Offset, 1);
127
128 const auto *FuncRef = FuncEntries[I];
132 for (auto &IndexOperandHash : IndexOperandHashes) {
133 Writer.write<uint32_t>(IndexOperandHash.first.first);
134 Writer.write<uint32_t>(IndexOperandHash.first.second);
136 }
137 }
138
139 const uint64_t IndexOperandHashesByteSize =
140 Writer.OS.tell() - IndexOperandHashesByteSizeOffset - sizeof(uint64_t);
141 PatchItems.emplace_back(IndexOperandHashesByteSizeOffset,
142 &IndexOperandHashesByteSize, 1);
143}
144
148 auto FunctionNameId =
150 if (FunctionMap->ReadStableFunctionMapNames)
152 "FunctionNameId out of range");
153 auto ModuleNameId =
155 if (FunctionMap->ReadStableFunctionMapNames)
157 "ModuleNameId out of range");
158 auto InstCount =
160
161
162 auto CurrentPosition = reinterpret_cast<uintptr_t>(Ptr);
163 auto IndexOperandHashesOffset =
165 auto *IndexOperandHashesPtr = reinterpret_cast<const unsigned char *>(
166 CurrentPosition + IndexOperandHashesOffset);
167 auto NumIndexOperandHashes =
169 IndexOperandHashesPtr);
170 auto IndexOperandHashMap = std::make_unique();
171 for (unsigned J = 0; J < NumIndexOperandHashes; ++J) {
173 IndexOperandHashesPtr);
175 IndexOperandHashesPtr);
176 auto OpndHash =
178 IndexOperandHashesPtr);
179 assert(InstIndex < InstCount && "InstIndex out of range");
180
181 IndexOperandHashMap->try_emplace({InstIndex, OpndIndex}, OpndHash);
182 }
183
184
185 auto FuncEntry = std::make_uniqueStableFunctionMap::StableFunctionEntry(
186 Hash, FunctionNameId, ModuleNameId, InstCount,
187 std::move(IndexOperandHashMap));
188
189 FunctionMap->insert(std::move(FuncEntry));
190}
191
193 bool Lazy) {
194
195 assert(((uintptr_t)Ptr % 4) == 0);
196
197 auto NumNames =
199
200 if (NumNames == 0)
201 return;
202 const auto NamesByteSize =
204 const auto NamesOffset = reinterpret_cast<uintptr_t>(Ptr);
205 if (FunctionMap->ReadStableFunctionMapNames) {
206 for (unsigned I = 0; I < NumNames; ++I) {
207 StringRef Name(reinterpret_cast<const char *>(Ptr));
208 Ptr += Name.size() + 1;
210 }
211
213 assert(reinterpret_cast<uintptr_t>(Ptr) - NamesOffset == NamesByteSize &&
214 "NamesByteSize does not match the actual size of names");
215 } else {
216
217 Ptr = reinterpret_cast<const uint8_t *>(NamesOffset + NamesByteSize);
218 }
219
220
221 auto NumFuncs =
223 auto FixedSizeFieldsOffset =
224 reinterpret_cast<uintptr_t>(Ptr) + NumFuncs * sizeof(stable_hash);
225 constexpr uint32_t FixedSizeFieldsSizePerEntry =
226
227 sizeof(uint32_t) +
228
229 sizeof(uint32_t) +
230
231 sizeof(uint32_t) +
232
233 sizeof(uint64_t);
234 for (unsigned I = 0; I < NumFuncs; ++I) {
235 auto Hash =
237 if (Lazy) {
238 auto It = FunctionMap->HashToFuncs.try_emplace(Hash).first;
239 StableFunctionMap::EntryStorage &Storage = It->second;
240 Storage.Offsets.push_back(FixedSizeFieldsOffset);
241 } else {
243 reinterpret_cast<const unsigned char *>(FixedSizeFieldsOffset), Hash,
245 }
246 FixedSizeFieldsOffset += FixedSizeFieldsSizePerEntry;
247 }
248
249
250
251 Ptr = reinterpret_cast<const unsigned char *>(FixedSizeFieldsOffset);
252 auto IndexOperandHashesByteSize =
254 Ptr = reinterpret_cast<const unsigned char *>(
255 reinterpret_cast<uintptr_t>(Ptr) + IndexOperandHashesByteSize);
256}
257
261
263 std::shared_ptr Buffer, uint64_t Offset) {
264 const auto *Ptr = reinterpret_cast<const unsigned char *>(
265 reinterpret_cast<uintptr_t>(Buffer->getBufferStart()) + Offset);
268}
269
273 for (const auto *FuncEntry : FuncEntries) {
275 Functions.emplace_back(
276 FuncEntry->Hash, *FunctionMap->getNameForId(FuncEntry->FunctionNameId),
277 *FunctionMap->getNameForId(FuncEntry->ModuleNameId),
278 FuncEntry->InstCount, std::move(IndexOperandHashes));
279 }
280
281 YOS << Functions;
282}
283
285 std::vector Funcs;
286 YIS >> Funcs;
287 for (auto &Func : Funcs)
290}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static IndexOperandHashVecType getStableIndexOperandHashes(const StableFunctionMap::StableFunctionEntry *FuncEntry)
Definition StableFunctionMapRecord.cpp:70
static SmallVector< const StableFunctionMap::StableFunctionEntry * > getStableFunctionEntries(const StableFunctionMap &SFM)
Definition StableFunctionMapRecord.cpp:53
#define LLVM_YAML_IS_SEQUENCE_VECTOR(type)
Utility for declaring that a std::vector of a particular type should be considered a YAML sequence.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
This class implements an extremely fast bulk output stream that can only output to a stream.
uint64_t tell() const
tell - Return the current offset with the file.
void mapRequired(StringRef Key, T &Val)
The Input class is used to parse a yaml document into in-memory structs and vectors.
The Output class is used to generate a yaml document from in-memory structs and vectors.
value_type readNext(const CharT *&memory, endianness endian)
Read a value of a particular endianness from a buffer, and increment the buffer past that value.
This is an optimization pass for GlobalISel generic memory operations.
void stable_sort(R &&Range)
uint64_t stable_hash
An opaque object representing a stable hash code.
SmallVector< IndexPairHash > IndexOperandHashVecType
void sort(IteratorTy Start, IteratorTy End)
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
uint64_t offsetToAlignment(uint64_t Value, Align Alignment)
Returns the offset to the next integer (mod 2**64) that is greater than or equal to Value and is a mu...
std::pair< IndexPair, stable_hash > IndexPairHash
uintptr_t alignAddr(const void *Addr, Align Alignment)
Aligns Addr to Alignment bytes, rounding up.
This struct is a compact representation of a valid (non-zero power of two) alignment.
static LLVM_ABI void deserializeEntry(const unsigned char *Ptr, stable_hash Hash, StableFunctionMap *FunctionMap)
A static helper function to deserialize the stable function map entry.
Definition StableFunctionMapRecord.cpp:145
LLVM_ABI void deserialize(const unsigned char *&Ptr)
Deserialize the stable function map from a raw_ostream.
Definition StableFunctionMapRecord.cpp:258
std::unique_ptr< StableFunctionMap > FunctionMap
static LLVM_ABI void serialize(raw_ostream &OS, const StableFunctionMap *FunctionMap, std::vector< CGDataPatchItem > &PatchItems)
A static helper function to serialize the stable function map without owning the stable function map.
Definition StableFunctionMapRecord.cpp:85
LLVM_ABI void deserializeYAML(yaml::Input &YIS)
Deserialize the stable function map from a YAML stream.
Definition StableFunctionMapRecord.cpp:284
LLVM_ABI void lazyDeserialize(std::shared_ptr< MemoryBuffer > Buffer, uint64_t Offset)
Lazily deserialize the stable function map from Buffer starting at Offset.
Definition StableFunctionMapRecord.cpp:262
LLVM_ABI void serializeYAML(yaml::Output &YOS) const
Serialize the stable function map to a YAML stream.
Definition StableFunctionMapRecord.cpp:270
An efficient form of StableFunction for fast look-up.
std::unique_ptr< IndexOperandHashMapType > IndexOperandHashMap
A map from an IndexPair to a stable_hash which was skipped.
LLVM_ABI std::optional< std::string > getNameForId(unsigned Id) const
Get the name associated with a given ID.
LLVM_ABI_FOR_TEST const HashFuncsMapType & getFunctionMap() const
Get the HashToFuncs map for serialization.
A stable function is a function with a stable hash while tracking the locations of ignored operands a...
Adapter to write values to a stream in a particular byte order.
void write(ArrayRef< value_type > Val)
static void mapping(IO &IO, IndexPairHash &Key)
Definition StableFunctionMapRecord.cpp:31
static void mapping(IO &IO, StableFunction &Func)
Definition StableFunctionMapRecord.cpp:39
This class should be specialized by any type that needs to be converted to/from a YAML mapping.