LLVM 22.0.0git
BitcodeWriter.cpp
Go to the documentation of this file.
1//===- Bitcode/Writer/BitcodeWriter.cpp - Bitcode Writer ------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Bitcode writer implementation.
10//
11//===----------------------------------------------------------------------===//
12
14#include "ValueEnumerator.h"
15#include "llvm/ADT/APFloat.h"
16#include "llvm/ADT/APInt.h"
17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/SetVector.h"
24#include "llvm/ADT/StringMap.h"
25#include "llvm/ADT/StringRef.h"
33#include "llvm/Config/llvm-config.h"
34#include "llvm/IR/Attributes.h"
35#include "llvm/IR/BasicBlock.h"
36#include "llvm/IR/Comdat.h"
37#include "llvm/IR/Constant.h"
39#include "llvm/IR/Constants.h"
41#include "llvm/IR/DebugLoc.h"
43#include "llvm/IR/Function.h"
44#include "llvm/IR/GlobalAlias.h"
45#include "llvm/IR/GlobalIFunc.h"
47#include "llvm/IR/GlobalValue.h"
49#include "llvm/IR/InlineAsm.h"
50#include "llvm/IR/InstrTypes.h"
51#include "llvm/IR/Instruction.h"
53#include "llvm/IR/LLVMContext.h"
54#include "llvm/IR/Metadata.h"
55#include "llvm/IR/Module.h"
57#include "llvm/IR/Operator.h"
58#include "llvm/IR/Type.h"
60#include "llvm/IR/Value.h"
71#include "llvm/Support/Endian.h"
72#include "llvm/Support/Error.h"
75#include "llvm/Support/SHA1.h"
78#include <algorithm>
79#include <cassert>
80#include <cstddef>
81#include <cstdint>
82#include <iterator>
83#include <map>
84#include <memory>
85#include <optional>
86#include <string>
87#include <utility>
88#include <vector>
89
90using namespace llvm;
91using namespace llvm::memprof;
92
94 IndexThreshold("bitcode-mdindex-threshold", cl::Hidden, cl::init(25),
95 cl::desc("Number of metadatas above which we emit an index "
96 "to enable lazy-loading"));
98 "bitcode-flush-threshold", cl::Hidden, cl::init(512),
99 cl::desc("The threshold (unit M) for flushing LLVM bitcode."));
100
102 "write-relbf-to-summary", cl::Hidden, cl::init(false),
103 cl::desc("Write relative block frequency to function summary "));
104
105// Since we only use the context information in the memprof summary records in
106// the LTO backends to do assertion checking, save time and space by only
107// serializing the context for non-NDEBUG builds.
108// TODO: Currently this controls writing context of the allocation info records,
109// which are larger and more expensive, but we should do this for the callsite
110// records as well.
111// FIXME: Convert to a const once this has undergone more sigificant testing.
112static cl::opt<bool>
113 CombinedIndexMemProfContext("combined-index-memprof-context", cl::Hidden,
114#ifdef NDEBUG
115 cl::init(false),
116#else
117 cl::init(true),
118#endif
119 cl::desc(""));
120
122 "preserve-bc-uselistorder", cl::Hidden, cl::init(true),
123 cl::desc("Preserve use-list order when writing LLVM bitcode."));
124
125namespace llvm {
127}
128
129namespace {
130
131/// These are manifest constants used by the bitcode writer. They do not need to
132/// be kept in sync with the reader, but need to be consistent within this file.
133enum {
134 // VALUE_SYMTAB_BLOCK abbrev id's.
135 VST_ENTRY_8_ABBREV = bitc::FIRST_APPLICATION_ABBREV,
136 VST_ENTRY_7_ABBREV,
137 VST_ENTRY_6_ABBREV,
138 VST_BBENTRY_6_ABBREV,
139
140 // CONSTANTS_BLOCK abbrev id's.
141 CONSTANTS_SETTYPE_ABBREV = bitc::FIRST_APPLICATION_ABBREV,
142 CONSTANTS_INTEGER_ABBREV,
143 CONSTANTS_CE_CAST_Abbrev,
144 CONSTANTS_NULL_Abbrev,
145
146 // FUNCTION_BLOCK abbrev id's.
147 FUNCTION_INST_LOAD_ABBREV = bitc::FIRST_APPLICATION_ABBREV,
148 FUNCTION_INST_STORE_ABBREV,
149 FUNCTION_INST_UNOP_ABBREV,
150 FUNCTION_INST_UNOP_FLAGS_ABBREV,
151 FUNCTION_INST_BINOP_ABBREV,
152 FUNCTION_INST_BINOP_FLAGS_ABBREV,
153 FUNCTION_INST_CAST_ABBREV,
154 FUNCTION_INST_CAST_FLAGS_ABBREV,
155 FUNCTION_INST_RET_VOID_ABBREV,
156 FUNCTION_INST_RET_VAL_ABBREV,
157 FUNCTION_INST_BR_UNCOND_ABBREV,
158 FUNCTION_INST_BR_COND_ABBREV,
159 FUNCTION_INST_UNREACHABLE_ABBREV,
160 FUNCTION_INST_GEP_ABBREV,
161 FUNCTION_INST_CMP_ABBREV,
162 FUNCTION_INST_CMP_FLAGS_ABBREV,
163 FUNCTION_DEBUG_RECORD_VALUE_ABBREV,
164 FUNCTION_DEBUG_LOC_ABBREV,
165};
166
167/// Abstract class to manage the bitcode writing, subclassed for each bitcode
168/// file type.
169class BitcodeWriterBase {
170protected:
171 /// The stream created and owned by the client.
172 BitstreamWriter &Stream;
173
174 StringTableBuilder &StrtabBuilder;
175
176public:
177 /// Constructs a BitcodeWriterBase object that writes to the provided
178 /// \p Stream.
179 BitcodeWriterBase(BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder)
180 : Stream(Stream), StrtabBuilder(StrtabBuilder) {}
181
182protected:
183 void writeModuleVersion();
184};
185
186void BitcodeWriterBase::writeModuleVersion() {
187 // VERSION: [version#]
188 Stream.EmitRecord(bitc::MODULE_CODE_VERSION, ArrayRef<uint64_t>{2});
189}
190
191/// Base class to manage the module bitcode writing, currently subclassed for
192/// ModuleBitcodeWriter and ThinLinkBitcodeWriter.
193class ModuleBitcodeWriterBase : public BitcodeWriterBase {
194protected:
195 /// The Module to write to bitcode.
196 const Module &M;
197
198 /// Enumerates ids for all values in the module.
199 ValueEnumerator VE;
200
201 /// Optional per-module index to write for ThinLTO.
202 const ModuleSummaryIndex *Index;
203
204 /// Map that holds the correspondence between GUIDs in the summary index,
205 /// that came from indirect call profiles, and a value id generated by this
206 /// class to use in the VST and summary block records.
207 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
208
209 /// Tracks the last value id recorded in the GUIDToValueMap.
210 unsigned GlobalValueId;
211
212 /// Saves the offset of the VSTOffset record that must eventually be
213 /// backpatched with the offset of the actual VST.
214 uint64_t VSTOffsetPlaceholder = 0;
215
216public:
217 /// Constructs a ModuleBitcodeWriterBase object for the given Module,
218 /// writing to the provided \p Buffer.
219 ModuleBitcodeWriterBase(const Module &M, StringTableBuilder &StrtabBuilder,
220 BitstreamWriter &Stream,
221 bool ShouldPreserveUseListOrder,
222 const ModuleSummaryIndex *Index)
223 : BitcodeWriterBase(Stream, StrtabBuilder), M(M),
224 VE(M, PreserveBitcodeUseListOrder.getNumOccurrences()
226 : ShouldPreserveUseListOrder),
227 Index(Index) {
228 // Assign ValueIds to any callee values in the index that came from
229 // indirect call profiles and were recorded as a GUID not a Value*
230 // (which would have been assigned an ID by the ValueEnumerator).
231 // The starting ValueId is just after the number of values in the
232 // ValueEnumerator, so that they can be emitted in the VST.
233 GlobalValueId = VE.getValues().size();
234 if (!Index)
235 return;
236 for (const auto &GUIDSummaryLists : *Index)
237 // Examine all summaries for this GUID.
238 for (auto &Summary : GUIDSummaryLists.second.getSummaryList())
239 if (auto FS = dyn_cast<FunctionSummary>(Summary.get())) {
240 // For each call in the function summary, see if the call
241 // is to a GUID (which means it is for an indirect call,
242 // otherwise we would have a Value for it). If so, synthesize
243 // a value id.
244 for (auto &CallEdge : FS->calls())
245 if (!CallEdge.first.haveGVs() || !CallEdge.first.getValue())
246 assignValueId(CallEdge.first.getGUID());
247
248 // For each referenced variables in the function summary, see if the
249 // variable is represented by a GUID (as opposed to a symbol to
250 // declarations or definitions in the module). If so, synthesize a
251 // value id.
252 for (auto &RefEdge : FS->refs())
253 if (!RefEdge.haveGVs() || !RefEdge.getValue())
254 assignValueId(RefEdge.getGUID());
255 }
256 }
257
258protected:
259 void writePerModuleGlobalValueSummary();
260
261private:
262 void writePerModuleFunctionSummaryRecord(
263 SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
264 unsigned ValueID, unsigned FSCallsAbbrev, unsigned FSCallsProfileAbbrev,
265 unsigned CallsiteAbbrev, unsigned AllocAbbrev, unsigned ContextIdAbbvId,
266 const Function &F, DenseMap<CallStackId, LinearCallStackId> &CallStackPos,
267 CallStackId &CallStackCount);
268 void writeModuleLevelReferences(const GlobalVariable &V,
269 SmallVector<uint64_t, 64> &NameVals,
270 unsigned FSModRefsAbbrev,
271 unsigned FSModVTableRefsAbbrev);
272
273 void assignValueId(GlobalValue::GUID ValGUID) {
274 GUIDToValueIdMap[ValGUID] = ++GlobalValueId;
275 }
276
277 unsigned getValueId(GlobalValue::GUID ValGUID) {
278 const auto &VMI = GUIDToValueIdMap.find(ValGUID);
279 // Expect that any GUID value had a value Id assigned by an
280 // earlier call to assignValueId.
281 assert(VMI != GUIDToValueIdMap.end() &&
282 "GUID does not have assigned value Id");
283 return VMI->second;
284 }
285
286 // Helper to get the valueId for the type of value recorded in VI.
287 unsigned getValueId(ValueInfo VI) {
288 if (!VI.haveGVs() || !VI.getValue())
289 return getValueId(VI.getGUID());
290 return VE.getValueID(VI.getValue());
291 }
292
293 std::map<GlobalValue::GUID, unsigned> &valueIds() { return GUIDToValueIdMap; }
294};
295
296/// Class to manage the bitcode writing for a module.
297class ModuleBitcodeWriter : public ModuleBitcodeWriterBase {
298 /// True if a module hash record should be written.
299 bool GenerateHash;
300
301 /// If non-null, when GenerateHash is true, the resulting hash is written
302 /// into ModHash.
303 ModuleHash *ModHash;
304
305 SHA1 Hasher;
306
307 /// The start bit of the identification block.
308 uint64_t BitcodeStartBit;
309
310public:
311 /// Constructs a ModuleBitcodeWriter object for the given Module,
312 /// writing to the provided \p Buffer.
313 ModuleBitcodeWriter(const Module &M, StringTableBuilder &StrtabBuilder,
314 BitstreamWriter &Stream, bool ShouldPreserveUseListOrder,
315 const ModuleSummaryIndex *Index, bool GenerateHash,
316 ModuleHash *ModHash = nullptr)
317 : ModuleBitcodeWriterBase(M, StrtabBuilder, Stream,
318 ShouldPreserveUseListOrder, Index),
319 GenerateHash(GenerateHash), ModHash(ModHash),
320 BitcodeStartBit(Stream.GetCurrentBitNo()) {}
321
322 /// Emit the current module to the bitstream.
323 void write();
324
325private:
326 uint64_t bitcodeStartBit() { return BitcodeStartBit; }
327
328 size_t addToStrtab(StringRef Str);
329
330 void writeAttributeGroupTable();
331 void writeAttributeTable();
332 void writeTypeTable();
333 void writeComdats();
334 void writeValueSymbolTableForwardDecl();
335 void writeModuleInfo();
336 void writeValueAsMetadata(const ValueAsMetadata *MD,
337 SmallVectorImpl<uint64_t> &Record);
338 void writeMDTuple(const MDTuple *N, SmallVectorImpl<uint64_t> &Record,
339 unsigned Abbrev);
340 unsigned createDILocationAbbrev();
341 void writeDILocation(const DILocation *N, SmallVectorImpl<uint64_t> &Record,
342 unsigned &Abbrev);
343 unsigned createGenericDINodeAbbrev();
344 void writeGenericDINode(const GenericDINode *N,
345 SmallVectorImpl<uint64_t> &Record, unsigned &Abbrev);
346 void writeDISubrange(const DISubrange *N, SmallVectorImpl<uint64_t> &Record,
347 unsigned Abbrev);
348 void writeDIGenericSubrange(const DIGenericSubrange *N,
349 SmallVectorImpl<uint64_t> &Record,
350 unsigned Abbrev);
351 void writeDIEnumerator(const DIEnumerator *N,
352 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
353 void writeDIBasicType(const DIBasicType *N, SmallVectorImpl<uint64_t> &Record,
354 unsigned Abbrev);
355 void writeDIFixedPointType(const DIFixedPointType *N,
356 SmallVectorImpl<uint64_t> &Record,
357 unsigned Abbrev);
358 void writeDIStringType(const DIStringType *N,
359 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
360 void writeDIDerivedType(const DIDerivedType *N,
361 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
362 void writeDISubrangeType(const DISubrangeType *N,
363 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
364 void writeDICompositeType(const DICompositeType *N,
365 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
366 void writeDISubroutineType(const DISubroutineType *N,
367 SmallVectorImpl<uint64_t> &Record,
368 unsigned Abbrev);
369 void writeDIFile(const DIFile *N, SmallVectorImpl<uint64_t> &Record,
370 unsigned Abbrev);
371 void writeDICompileUnit(const DICompileUnit *N,
372 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
373 void writeDISubprogram(const DISubprogram *N,
374 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
375 void writeDILexicalBlock(const DILexicalBlock *N,
376 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
377 void writeDILexicalBlockFile(const DILexicalBlockFile *N,
378 SmallVectorImpl<uint64_t> &Record,
379 unsigned Abbrev);
380 void writeDICommonBlock(const DICommonBlock *N,
381 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
382 void writeDINamespace(const DINamespace *N, SmallVectorImpl<uint64_t> &Record,
383 unsigned Abbrev);
384 void writeDIMacro(const DIMacro *N, SmallVectorImpl<uint64_t> &Record,
385 unsigned Abbrev);
386 void writeDIMacroFile(const DIMacroFile *N, SmallVectorImpl<uint64_t> &Record,
387 unsigned Abbrev);
388 void writeDIArgList(const DIArgList *N, SmallVectorImpl<uint64_t> &Record);
389 void writeDIModule(const DIModule *N, SmallVectorImpl<uint64_t> &Record,
390 unsigned Abbrev);
391 void writeDIAssignID(const DIAssignID *N, SmallVectorImpl<uint64_t> &Record,
392 unsigned Abbrev);
393 void writeDITemplateTypeParameter(const DITemplateTypeParameter *N,
394 SmallVectorImpl<uint64_t> &Record,
395 unsigned Abbrev);
396 void writeDITemplateValueParameter(const DITemplateValueParameter *N,
397 SmallVectorImpl<uint64_t> &Record,
398 unsigned Abbrev);
399 void writeDIGlobalVariable(const DIGlobalVariable *N,
400 SmallVectorImpl<uint64_t> &Record,
401 unsigned Abbrev);
402 void writeDILocalVariable(const DILocalVariable *N,
403 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
404 void writeDILabel(const DILabel *N,
405 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
406 void writeDIExpression(const DIExpression *N,
407 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
408 void writeDIGlobalVariableExpression(const DIGlobalVariableExpression *N,
409 SmallVectorImpl<uint64_t> &Record,
410 unsigned Abbrev);
411 void writeDIObjCProperty(const DIObjCProperty *N,
412 SmallVectorImpl<uint64_t> &Record, unsigned Abbrev);
413 void writeDIImportedEntity(const DIImportedEntity *N,
414 SmallVectorImpl<uint64_t> &Record,
415 unsigned Abbrev);
416 unsigned createNamedMetadataAbbrev();
417 void writeNamedMetadata(SmallVectorImpl<uint64_t> &Record);
418 unsigned createMetadataStringsAbbrev();
419 void writeMetadataStrings(ArrayRef<const Metadata *> Strings,
420 SmallVectorImpl<uint64_t> &Record);
421 void writeMetadataRecords(ArrayRef<const Metadata *> MDs,
422 SmallVectorImpl<uint64_t> &Record,
423 std::vector<unsigned> *MDAbbrevs = nullptr,
424 std::vector<uint64_t> *IndexPos = nullptr);
425 void writeModuleMetadata();
426 void writeFunctionMetadata(const Function &F);
427 void writeFunctionMetadataAttachment(const Function &F);
428 void pushGlobalMetadataAttachment(SmallVectorImpl<uint64_t> &Record,
429 const GlobalObject &GO);
430 void writeModuleMetadataKinds();
431 void writeOperandBundleTags();
432 void writeSyncScopeNames();
433 void writeConstants(unsigned FirstVal, unsigned LastVal, bool isGlobal);
434 void writeModuleConstants();
435 bool pushValueAndType(const Value *V, unsigned InstID,
436 SmallVectorImpl<unsigned> &Vals);
437 bool pushValueOrMetadata(const Value *V, unsigned InstID,
438 SmallVectorImpl<unsigned> &Vals);
439 void writeOperandBundles(const CallBase &CB, unsigned InstID);
440 void pushValue(const Value *V, unsigned InstID,
441 SmallVectorImpl<unsigned> &Vals);
442 void pushValueSigned(const Value *V, unsigned InstID,
443 SmallVectorImpl<uint64_t> &Vals);
444 void writeInstruction(const Instruction &I, unsigned InstID,
445 SmallVectorImpl<unsigned> &Vals);
446 void writeFunctionLevelValueSymbolTable(const ValueSymbolTable &VST);
447 void writeGlobalValueSymbolTable(
448 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
449 void writeUseList(UseListOrder &&Order);
450 void writeUseListBlock(const Function *F);
451 void
452 writeFunction(const Function &F,
453 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex);
454 void writeBlockInfo();
455 void writeModuleHash(StringRef View);
456
457 unsigned getEncodedSyncScopeID(SyncScope::ID SSID) {
458 return unsigned(SSID);
459 }
460
461 unsigned getEncodedAlign(MaybeAlign Alignment) { return encode(Alignment); }
462};
463
464/// Class to manage the bitcode writing for a combined index.
465class IndexBitcodeWriter : public BitcodeWriterBase {
466 /// The combined index to write to bitcode.
467 const ModuleSummaryIndex &Index;
468
469 /// When writing combined summaries, provides the set of global value
470 /// summaries for which the value (function, function alias, etc) should be
471 /// imported as a declaration.
472 const GVSummaryPtrSet *DecSummaries = nullptr;
473
474 /// When writing a subset of the index for distributed backends, client
475 /// provides a map of modules to the corresponding GUIDs/summaries to write.
476 const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex;
477
478 /// Map that holds the correspondence between the GUID used in the combined
479 /// index and a value id generated by this class to use in references.
480 std::map<GlobalValue::GUID, unsigned> GUIDToValueIdMap;
481
482 // The stack ids used by this index, which will be a subset of those in
483 // the full index in the case of distributed indexes.
484 std::vector<uint64_t> StackIds;
485
486 // Keep a map of the stack id indices used by records being written for this
487 // index to the index of the corresponding stack id in the above StackIds
488 // vector. Ensures we write each referenced stack id once.
489 DenseMap<unsigned, unsigned> StackIdIndicesToIndex;
490
491 /// Tracks the last value id recorded in the GUIDToValueMap.
492 unsigned GlobalValueId = 0;
493
494 /// Tracks the assignment of module paths in the module path string table to
495 /// an id assigned for use in summary references to the module path.
496 DenseMap<StringRef, uint64_t> ModuleIdMap;
497
498public:
499 /// Constructs a IndexBitcodeWriter object for the given combined index,
500 /// writing to the provided \p Buffer. When writing a subset of the index
501 /// for a distributed backend, provide a \p ModuleToSummariesForIndex map.
502 /// If provided, \p DecSummaries specifies the set of summaries for which
503 /// the corresponding functions or aliased functions should be imported as a
504 /// declaration (but not definition) for each module.
505 IndexBitcodeWriter(
506 BitstreamWriter &Stream, StringTableBuilder &StrtabBuilder,
507 const ModuleSummaryIndex &Index,
508 const GVSummaryPtrSet *DecSummaries = nullptr,
509 const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex = nullptr)
510 : BitcodeWriterBase(Stream, StrtabBuilder), Index(Index),
511 DecSummaries(DecSummaries),
512 ModuleToSummariesForIndex(ModuleToSummariesForIndex) {
513
514 // See if the StackIdIndex was already added to the StackId map and
515 // vector. If not, record it.
516 auto RecordStackIdReference = [&](unsigned StackIdIndex) {
517 // If the StackIdIndex is not yet in the map, the below insert ensures
518 // that it will point to the new StackIds vector entry we push to just
519 // below.
520 auto Inserted =
521 StackIdIndicesToIndex.insert({StackIdIndex, StackIds.size()});
522 if (Inserted.second)
523 StackIds.push_back(Index.getStackIdAtIndex(StackIdIndex));
524 };
525
526 // Assign unique value ids to all summaries to be written, for use
527 // in writing out the call graph edges. Save the mapping from GUID
528 // to the new global value id to use when writing those edges, which
529 // are currently saved in the index in terms of GUID.
530 forEachSummary([&](GVInfo I, bool IsAliasee) {
531 GUIDToValueIdMap[I.first] = ++GlobalValueId;
532 // If this is invoked for an aliasee, we want to record the above mapping,
533 // but not the information needed for its summary entry (if the aliasee is
534 // to be imported, we will invoke this separately with IsAliasee=false).
535 if (IsAliasee)
536 return;
537 auto *FS = dyn_cast<FunctionSummary>(I.second);
538 if (!FS)
539 return;
540 // Record all stack id indices actually used in the summary entries being
541 // written, so that we can compact them in the case of distributed ThinLTO
542 // indexes.
543 for (auto &CI : FS->callsites()) {
544 // If the stack id list is empty, this callsite info was synthesized for
545 // a missing tail call frame. Ensure that the callee's GUID gets a value
546 // id. Normally we only generate these for defined summaries, which in
547 // the case of distributed ThinLTO is only the functions already defined
548 // in the module or that we want to import. We don't bother to include
549 // all the callee symbols as they aren't normally needed in the backend.
550 // However, for the synthesized callsite infos we do need the callee
551 // GUID in the backend so that we can correlate the identified callee
552 // with this callsite info (which for non-tail calls is done by the
553 // ordering of the callsite infos and verified via stack ids).
554 if (CI.StackIdIndices.empty()) {
555 GUIDToValueIdMap[CI.Callee.getGUID()] = ++GlobalValueId;
556 continue;
557 }
558 for (auto Idx : CI.StackIdIndices)
559 RecordStackIdReference(Idx);
560 }
562 for (auto &AI : FS->allocs())
563 for (auto &MIB : AI.MIBs)
564 for (auto Idx : MIB.StackIdIndices)
565 RecordStackIdReference(Idx);
566 }
567 });
568 }
569
570 /// The below iterator returns the GUID and associated summary.
571 using GVInfo = std::pair<GlobalValue::GUID, GlobalValueSummary *>;
572
573 /// Calls the callback for each value GUID and summary to be written to
574 /// bitcode. This hides the details of whether they are being pulled from the
575 /// entire index or just those in a provided ModuleToSummariesForIndex map.
576 template<typename Functor>
577 void forEachSummary(Functor Callback) {
578 if (ModuleToSummariesForIndex) {
579 for (auto &M : *ModuleToSummariesForIndex)
580 for (auto &Summary : M.second) {
581 Callback(Summary, false);
582 // Ensure aliasee is handled, e.g. for assigning a valueId,
583 // even if we are not importing the aliasee directly (the
584 // imported alias will contain a copy of aliasee).
585 if (auto *AS = dyn_cast<AliasSummary>(Summary.getSecond()))
586 Callback({AS->getAliaseeGUID(), &AS->getAliasee()}, true);
587 }
588 } else {
589 for (auto &Summaries : Index)
590 for (auto &Summary : Summaries.second.getSummaryList())
591 Callback({Summaries.first, Summary.get()}, false);
592 }
593 }
594
595 /// Calls the callback for each entry in the modulePaths StringMap that
596 /// should be written to the module path string table. This hides the details
597 /// of whether they are being pulled from the entire index or just those in a
598 /// provided ModuleToSummariesForIndex map.
599 template <typename Functor> void forEachModule(Functor Callback) {
600 if (ModuleToSummariesForIndex) {
601 for (const auto &M : *ModuleToSummariesForIndex) {
602 const auto &MPI = Index.modulePaths().find(M.first);
603 if (MPI == Index.modulePaths().end()) {
604 // This should only happen if the bitcode file was empty, in which
605 // case we shouldn't be importing (the ModuleToSummariesForIndex
606 // would only include the module we are writing and index for).
607 assert(ModuleToSummariesForIndex->size() == 1);
608 continue;
609 }
610 Callback(*MPI);
611 }
612 } else {
613 // Since StringMap iteration order isn't guaranteed, order by path string
614 // first.
615 // FIXME: Make this a vector of StringMapEntry instead to avoid the later
616 // map lookup.
617 std::vector<StringRef> ModulePaths;
618 for (auto &[ModPath, _] : Index.modulePaths())
619 ModulePaths.push_back(ModPath);
620 llvm::sort(ModulePaths);
621 for (auto &ModPath : ModulePaths)
622 Callback(*Index.modulePaths().find(ModPath));
623 }
624 }
625
626 /// Main entry point for writing a combined index to bitcode.
627 void write();
628
629private:
630 void writeModStrings();
631 void writeCombinedGlobalValueSummary();
632
633 std::optional<unsigned> getValueId(GlobalValue::GUID ValGUID) {
634 auto VMI = GUIDToValueIdMap.find(ValGUID);
635 if (VMI == GUIDToValueIdMap.end())
636 return std::nullopt;
637 return VMI->second;
638 }
639
640 std::map<GlobalValue::GUID, unsigned> &valueIds() { return GUIDToValueIdMap; }
641};
642
643} // end anonymous namespace
644
645static unsigned getEncodedCastOpcode(unsigned Opcode) {
646 switch (Opcode) {
647 default: llvm_unreachable("Unknown cast instruction!");
648 case Instruction::Trunc : return bitc::CAST_TRUNC;
649 case Instruction::ZExt : return bitc::CAST_ZEXT;
650 case Instruction::SExt : return bitc::CAST_SEXT;
651 case Instruction::FPToUI : return bitc::CAST_FPTOUI;
652 case Instruction::FPToSI : return bitc::CAST_FPTOSI;
653 case Instruction::UIToFP : return bitc::CAST_UITOFP;
654 case Instruction::SIToFP : return bitc::CAST_SITOFP;
655 case Instruction::FPTrunc : return bitc::CAST_FPTRUNC;
656 case Instruction::FPExt : return bitc::CAST_FPEXT;
657 case Instruction::PtrToAddr: return bitc::CAST_PTRTOADDR;
658 case Instruction::PtrToInt: return bitc::CAST_PTRTOINT;
659 case Instruction::IntToPtr: return bitc::CAST_INTTOPTR;
660 case Instruction::BitCast : return bitc::CAST_BITCAST;
661 case Instruction::AddrSpaceCast: return bitc::CAST_ADDRSPACECAST;
662 }
663}
664
665static unsigned getEncodedUnaryOpcode(unsigned Opcode) {
666 switch (Opcode) {
667 default: llvm_unreachable("Unknown binary instruction!");
668 case Instruction::FNeg: return bitc::UNOP_FNEG;
669 }
670}
671
672static unsigned getEncodedBinaryOpcode(unsigned Opcode) {
673 switch (Opcode) {
674 default: llvm_unreachable("Unknown binary instruction!");
675 case Instruction::Add:
676 case Instruction::FAdd: return bitc::BINOP_ADD;
677 case Instruction::Sub:
678 case Instruction::FSub: return bitc::BINOP_SUB;
679 case Instruction::Mul:
680 case Instruction::FMul: return bitc::BINOP_MUL;
681 case Instruction::UDiv: return bitc::BINOP_UDIV;
682 case Instruction::FDiv:
683 case Instruction::SDiv: return bitc::BINOP_SDIV;
684 case Instruction::URem: return bitc::BINOP_UREM;
685 case Instruction::FRem:
686 case Instruction::SRem: return bitc::BINOP_SREM;
687 case Instruction::Shl: return bitc::BINOP_SHL;
688 case Instruction::LShr: return bitc::BINOP_LSHR;
689 case Instruction::AShr: return bitc::BINOP_ASHR;
690 case Instruction::And: return bitc::BINOP_AND;
691 case Instruction::Or: return bitc::BINOP_OR;
692 case Instruction::Xor: return bitc::BINOP_XOR;
693 }
694}
695
697 switch (Op) {
698 default: llvm_unreachable("Unknown RMW operation!");
704 case AtomicRMWInst::Or: return bitc::RMW_OR;
715 return bitc::RMW_FMAXIMUM;
717 return bitc::RMW_FMINIMUM;
719 return bitc::RMW_UINC_WRAP;
721 return bitc::RMW_UDEC_WRAP;
723 return bitc::RMW_USUB_COND;
725 return bitc::RMW_USUB_SAT;
726 }
727}
728
741
742static void writeStringRecord(BitstreamWriter &Stream, unsigned Code,
743 StringRef Str, unsigned AbbrevToUse) {
745
746 // Code: [strchar x N]
747 for (char C : Str) {
748 if (AbbrevToUse && !BitCodeAbbrevOp::isChar6(C))
749 AbbrevToUse = 0;
750 Vals.push_back(C);
751 }
752
753 // Emit the finished record.
754 Stream.EmitRecord(Code, Vals, AbbrevToUse);
755}
756
758 switch (Kind) {
759 case Attribute::Alignment:
761 case Attribute::AllocAlign:
763 case Attribute::AllocSize:
765 case Attribute::AlwaysInline:
767 case Attribute::Builtin:
769 case Attribute::ByVal:
771 case Attribute::Convergent:
773 case Attribute::InAlloca:
775 case Attribute::Cold:
777 case Attribute::DisableSanitizerInstrumentation:
779 case Attribute::FnRetThunkExtern:
781 case Attribute::Hot:
782 return bitc::ATTR_KIND_HOT;
783 case Attribute::ElementType:
785 case Attribute::HybridPatchable:
787 case Attribute::InlineHint:
789 case Attribute::InReg:
791 case Attribute::JumpTable:
793 case Attribute::MinSize:
795 case Attribute::AllocatedPointer:
797 case Attribute::AllocKind:
799 case Attribute::Memory:
801 case Attribute::NoFPClass:
803 case Attribute::Naked:
805 case Attribute::Nest:
807 case Attribute::NoAlias:
809 case Attribute::NoBuiltin:
811 case Attribute::NoCallback:
813 case Attribute::NoDivergenceSource:
815 case Attribute::NoDuplicate:
817 case Attribute::NoFree:
819 case Attribute::NoImplicitFloat:
821 case Attribute::NoInline:
823 case Attribute::NoRecurse:
825 case Attribute::NoMerge:
827 case Attribute::NonLazyBind:
829 case Attribute::NonNull:
831 case Attribute::Dereferenceable:
833 case Attribute::DereferenceableOrNull:
835 case Attribute::NoRedZone:
837 case Attribute::NoReturn:
839 case Attribute::NoSync:
841 case Attribute::NoCfCheck:
843 case Attribute::NoProfile:
845 case Attribute::SkipProfile:
847 case Attribute::NoUnwind:
849 case Attribute::NoSanitizeBounds:
851 case Attribute::NoSanitizeCoverage:
853 case Attribute::NullPointerIsValid:
855 case Attribute::OptimizeForDebugging:
857 case Attribute::OptForFuzzing:
859 case Attribute::OptimizeForSize:
861 case Attribute::OptimizeNone:
863 case Attribute::ReadNone:
865 case Attribute::ReadOnly:
867 case Attribute::Returned:
869 case Attribute::ReturnsTwice:
871 case Attribute::SExt:
873 case Attribute::Speculatable:
875 case Attribute::StackAlignment:
877 case Attribute::StackProtect:
879 case Attribute::StackProtectReq:
881 case Attribute::StackProtectStrong:
883 case Attribute::SafeStack:
885 case Attribute::ShadowCallStack:
887 case Attribute::StrictFP:
889 case Attribute::StructRet:
891 case Attribute::SanitizeAddress:
893 case Attribute::SanitizeAllocToken:
895 case Attribute::SanitizeHWAddress:
897 case Attribute::SanitizeThread:
899 case Attribute::SanitizeType:
901 case Attribute::SanitizeMemory:
903 case Attribute::SanitizeNumericalStability:
905 case Attribute::SanitizeRealtime:
907 case Attribute::SanitizeRealtimeBlocking:
909 case Attribute::SpeculativeLoadHardening:
911 case Attribute::SwiftError:
913 case Attribute::SwiftSelf:
915 case Attribute::SwiftAsync:
917 case Attribute::UWTable:
919 case Attribute::VScaleRange:
921 case Attribute::WillReturn:
923 case Attribute::WriteOnly:
925 case Attribute::ZExt:
927 case Attribute::ImmArg:
929 case Attribute::SanitizeMemTag:
931 case Attribute::Preallocated:
933 case Attribute::NoUndef:
935 case Attribute::ByRef:
937 case Attribute::MustProgress:
939 case Attribute::PresplitCoroutine:
941 case Attribute::Writable:
943 case Attribute::CoroDestroyOnlyWhenComplete:
945 case Attribute::CoroElideSafe:
947 case Attribute::DeadOnUnwind:
949 case Attribute::Range:
951 case Attribute::Initializes:
953 case Attribute::NoExt:
955 case Attribute::Captures:
957 case Attribute::DeadOnReturn:
959 case Attribute::NoCreateUndefOrPoison:
962 llvm_unreachable("Can not encode end-attribute kinds marker.");
963 case Attribute::None:
964 llvm_unreachable("Can not encode none-attribute.");
967 llvm_unreachable("Trying to encode EmptyKey/TombstoneKey");
968 }
969
970 llvm_unreachable("Trying to encode unknown attribute");
971}
972
974 if ((int64_t)V >= 0)
975 Vals.push_back(V << 1);
976 else
977 Vals.push_back((-V << 1) | 1);
978}
979
980static void emitWideAPInt(SmallVectorImpl<uint64_t> &Vals, const APInt &A) {
981 // We have an arbitrary precision integer value to write whose
982 // bit width is > 64. However, in canonical unsigned integer
983 // format it is likely that the high bits are going to be zero.
984 // So, we only write the number of active words.
985 unsigned NumWords = A.getActiveWords();
986 const uint64_t *RawData = A.getRawData();
987 for (unsigned i = 0; i < NumWords; i++)
988 emitSignedInt64(Vals, RawData[i]);
989}
990
992 const ConstantRange &CR, bool EmitBitWidth) {
993 unsigned BitWidth = CR.getBitWidth();
994 if (EmitBitWidth)
995 Record.push_back(BitWidth);
996 if (BitWidth > 64) {
997 Record.push_back(CR.getLower().getActiveWords() |
998 (uint64_t(CR.getUpper().getActiveWords()) << 32));
1001 } else {
1004 }
1005}
1006
1007void ModuleBitcodeWriter::writeAttributeGroupTable() {
1008 const std::vector<ValueEnumerator::IndexAndAttrSet> &AttrGrps =
1009 VE.getAttributeGroups();
1010 if (AttrGrps.empty()) return;
1011
1013
1014 SmallVector<uint64_t, 64> Record;
1015 for (ValueEnumerator::IndexAndAttrSet Pair : AttrGrps) {
1016 unsigned AttrListIndex = Pair.first;
1017 AttributeSet AS = Pair.second;
1018 Record.push_back(VE.getAttributeGroupID(Pair));
1019 Record.push_back(AttrListIndex);
1020
1021 for (Attribute Attr : AS) {
1022 if (Attr.isEnumAttribute()) {
1023 Record.push_back(0);
1024 Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum()));
1025 } else if (Attr.isIntAttribute()) {
1026 Record.push_back(1);
1027 Attribute::AttrKind Kind = Attr.getKindAsEnum();
1028 Record.push_back(getAttrKindEncoding(Kind));
1029 if (Kind == Attribute::Memory) {
1030 // Version field for upgrading old memory effects.
1031 const uint64_t Version = 1;
1032 Record.push_back((Version << 56) | Attr.getValueAsInt());
1033 } else {
1034 Record.push_back(Attr.getValueAsInt());
1035 }
1036 } else if (Attr.isStringAttribute()) {
1037 StringRef Kind = Attr.getKindAsString();
1038 StringRef Val = Attr.getValueAsString();
1039
1040 Record.push_back(Val.empty() ? 3 : 4);
1041 Record.append(Kind.begin(), Kind.end());
1042 Record.push_back(0);
1043 if (!Val.empty()) {
1044 Record.append(Val.begin(), Val.end());
1045 Record.push_back(0);
1046 }
1047 } else if (Attr.isTypeAttribute()) {
1048 Type *Ty = Attr.getValueAsType();
1049 Record.push_back(Ty ? 6 : 5);
1050 Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum()));
1051 if (Ty)
1052 Record.push_back(VE.getTypeID(Attr.getValueAsType()));
1053 } else if (Attr.isConstantRangeAttribute()) {
1054 Record.push_back(7);
1055 Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum()));
1056 emitConstantRange(Record, Attr.getValueAsConstantRange(),
1057 /*EmitBitWidth=*/true);
1058 } else {
1059 assert(Attr.isConstantRangeListAttribute());
1060 Record.push_back(8);
1061 Record.push_back(getAttrKindEncoding(Attr.getKindAsEnum()));
1062 ArrayRef<ConstantRange> Val = Attr.getValueAsConstantRangeList();
1063 Record.push_back(Val.size());
1064 Record.push_back(Val[0].getBitWidth());
1065 for (auto &CR : Val)
1066 emitConstantRange(Record, CR, /*EmitBitWidth=*/false);
1067 }
1068 }
1069
1071 Record.clear();
1072 }
1073
1074 Stream.ExitBlock();
1075}
1076
1077void ModuleBitcodeWriter::writeAttributeTable() {
1078 const std::vector<AttributeList> &Attrs = VE.getAttributeLists();
1079 if (Attrs.empty()) return;
1080
1082
1083 SmallVector<uint64_t, 64> Record;
1084 for (const AttributeList &AL : Attrs) {
1085 for (unsigned i : AL.indexes()) {
1086 AttributeSet AS = AL.getAttributes(i);
1087 if (AS.hasAttributes())
1088 Record.push_back(VE.getAttributeGroupID({i, AS}));
1089 }
1090
1091 Stream.EmitRecord(bitc::PARAMATTR_CODE_ENTRY, Record);
1092 Record.clear();
1093 }
1094
1095 Stream.ExitBlock();
1096}
1097
1098/// WriteTypeTable - Write out the type table for a module.
1099void ModuleBitcodeWriter::writeTypeTable() {
1100 const ValueEnumerator::TypeList &TypeList = VE.getTypes();
1101
1102 Stream.EnterSubblock(bitc::TYPE_BLOCK_ID_NEW, 4 /*count from # abbrevs */);
1103 SmallVector<uint64_t, 64> TypeVals;
1104
1105 uint64_t NumBits = VE.computeBitsRequiredForTypeIndices();
1106
1107 // Abbrev for TYPE_CODE_OPAQUE_POINTER.
1108 auto Abbv = std::make_shared<BitCodeAbbrev>();
1109 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_OPAQUE_POINTER));
1110 Abbv->Add(BitCodeAbbrevOp(0)); // Addrspace = 0
1111 unsigned OpaquePtrAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1112
1113 // Abbrev for TYPE_CODE_FUNCTION.
1114 Abbv = std::make_shared<BitCodeAbbrev>();
1115 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_FUNCTION));
1116 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isvararg
1117 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1118 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));
1119 unsigned FunctionAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1120
1121 // Abbrev for TYPE_CODE_STRUCT_ANON.
1122 Abbv = std::make_shared<BitCodeAbbrev>();
1123 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_ANON));
1124 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked
1125 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1126 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));
1127 unsigned StructAnonAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1128
1129 // Abbrev for TYPE_CODE_STRUCT_NAME.
1130 Abbv = std::make_shared<BitCodeAbbrev>();
1131 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAME));
1132 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1133 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));
1134 unsigned StructNameAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1135
1136 // Abbrev for TYPE_CODE_STRUCT_NAMED.
1137 Abbv = std::make_shared<BitCodeAbbrev>();
1138 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_STRUCT_NAMED));
1139 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // ispacked
1140 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1141 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));
1142 unsigned StructNamedAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1143
1144 // Abbrev for TYPE_CODE_ARRAY.
1145 Abbv = std::make_shared<BitCodeAbbrev>();
1146 Abbv->Add(BitCodeAbbrevOp(bitc::TYPE_CODE_ARRAY));
1147 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // size
1148 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, NumBits));
1149 unsigned ArrayAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1150
1151 // Emit an entry count so the reader can reserve space.
1152 TypeVals.push_back(TypeList.size());
1153 Stream.EmitRecord(bitc::TYPE_CODE_NUMENTRY, TypeVals);
1154 TypeVals.clear();
1155
1156 // Loop over all of the types, emitting each in turn.
1157 for (Type *T : TypeList) {
1158 int AbbrevToUse = 0;
1159 unsigned Code = 0;
1160
1161 switch (T->getTypeID()) {
1162 case Type::VoidTyID: Code = bitc::TYPE_CODE_VOID; break;
1163 case Type::HalfTyID: Code = bitc::TYPE_CODE_HALF; break;
1164 case Type::BFloatTyID: Code = bitc::TYPE_CODE_BFLOAT; break;
1165 case Type::FloatTyID: Code = bitc::TYPE_CODE_FLOAT; break;
1166 case Type::DoubleTyID: Code = bitc::TYPE_CODE_DOUBLE; break;
1167 case Type::X86_FP80TyID: Code = bitc::TYPE_CODE_X86_FP80; break;
1168 case Type::FP128TyID: Code = bitc::TYPE_CODE_FP128; break;
1169 case Type::PPC_FP128TyID: Code = bitc::TYPE_CODE_PPC_FP128; break;
1170 case Type::LabelTyID: Code = bitc::TYPE_CODE_LABEL; break;
1171 case Type::MetadataTyID:
1173 break;
1174 case Type::X86_AMXTyID: Code = bitc::TYPE_CODE_X86_AMX; break;
1175 case Type::TokenTyID: Code = bitc::TYPE_CODE_TOKEN; break;
1176 case Type::IntegerTyID:
1177 // INTEGER: [width]
1180 break;
1181 case Type::PointerTyID: {
1183 unsigned AddressSpace = PTy->getAddressSpace();
1184 // OPAQUE_POINTER: [address space]
1186 TypeVals.push_back(AddressSpace);
1187 if (AddressSpace == 0)
1188 AbbrevToUse = OpaquePtrAbbrev;
1189 break;
1190 }
1191 case Type::FunctionTyID: {
1192 FunctionType *FT = cast<FunctionType>(T);
1193 // FUNCTION: [isvararg, retty, paramty x N]
1195 TypeVals.push_back(FT->isVarArg());
1196 TypeVals.push_back(VE.getTypeID(FT->getReturnType()));
1197 for (unsigned i = 0, e = FT->getNumParams(); i != e; ++i)
1198 TypeVals.push_back(VE.getTypeID(FT->getParamType(i)));
1199 AbbrevToUse = FunctionAbbrev;
1200 break;
1201 }
1202 case Type::StructTyID: {
1203 StructType *ST = cast<StructType>(T);
1204 // STRUCT: [ispacked, eltty x N]
1205 TypeVals.push_back(ST->isPacked());
1206 // Output all of the element types.
1207 for (Type *ET : ST->elements())
1208 TypeVals.push_back(VE.getTypeID(ET));
1209
1210 if (ST->isLiteral()) {
1212 AbbrevToUse = StructAnonAbbrev;
1213 } else {
1214 if (ST->isOpaque()) {
1216 } else {
1218 AbbrevToUse = StructNamedAbbrev;
1219 }
1220
1221 // Emit the name if it is present.
1222 if (!ST->getName().empty())
1224 StructNameAbbrev);
1225 }
1226 break;
1227 }
1228 case Type::ArrayTyID: {
1230 // ARRAY: [numelts, eltty]
1232 TypeVals.push_back(AT->getNumElements());
1233 TypeVals.push_back(VE.getTypeID(AT->getElementType()));
1234 AbbrevToUse = ArrayAbbrev;
1235 break;
1236 }
1237 case Type::FixedVectorTyID:
1238 case Type::ScalableVectorTyID: {
1240 // VECTOR [numelts, eltty] or
1241 // [numelts, eltty, scalable]
1243 TypeVals.push_back(VT->getElementCount().getKnownMinValue());
1244 TypeVals.push_back(VE.getTypeID(VT->getElementType()));
1246 TypeVals.push_back(true);
1247 break;
1248 }
1249 case Type::TargetExtTyID: {
1250 TargetExtType *TET = cast<TargetExtType>(T);
1253 StructNameAbbrev);
1254 TypeVals.push_back(TET->getNumTypeParameters());
1255 for (Type *InnerTy : TET->type_params())
1256 TypeVals.push_back(VE.getTypeID(InnerTy));
1257 llvm::append_range(TypeVals, TET->int_params());
1258 break;
1259 }
1260 case Type::TypedPointerTyID:
1261 llvm_unreachable("Typed pointers cannot be added to IR modules");
1262 }
1263
1264 // Emit the finished record.
1265 Stream.EmitRecord(Code, TypeVals, AbbrevToUse);
1266 TypeVals.clear();
1267 }
1268
1269 Stream.ExitBlock();
1270}
1271
1273 switch (Linkage) {
1275 return 0;
1277 return 16;
1279 return 2;
1281 return 3;
1283 return 18;
1285 return 7;
1287 return 8;
1289 return 9;
1291 return 17;
1293 return 19;
1295 return 12;
1296 }
1297 llvm_unreachable("Invalid linkage");
1298}
1299
1300static unsigned getEncodedLinkage(const GlobalValue &GV) {
1301 return getEncodedLinkage(GV.getLinkage());
1302}
1303
1305 uint64_t RawFlags = 0;
1306 RawFlags |= Flags.ReadNone;
1307 RawFlags |= (Flags.ReadOnly << 1);
1308 RawFlags |= (Flags.NoRecurse << 2);
1309 RawFlags |= (Flags.ReturnDoesNotAlias << 3);
1310 RawFlags |= (Flags.NoInline << 4);
1311 RawFlags |= (Flags.AlwaysInline << 5);
1312 RawFlags |= (Flags.NoUnwind << 6);
1313 RawFlags |= (Flags.MayThrow << 7);
1314 RawFlags |= (Flags.HasUnknownCall << 8);
1315 RawFlags |= (Flags.MustBeUnreachable << 9);
1316 return RawFlags;
1317}
1318
1319// Decode the flags for GlobalValue in the summary. See getDecodedGVSummaryFlags
1320// in BitcodeReader.cpp.
1322 bool ImportAsDecl = false) {
1323 uint64_t RawFlags = 0;
1324
1325 RawFlags |= Flags.NotEligibleToImport; // bool
1326 RawFlags |= (Flags.Live << 1);
1327 RawFlags |= (Flags.DSOLocal << 2);
1328 RawFlags |= (Flags.CanAutoHide << 3);
1329
1330 // Linkage don't need to be remapped at that time for the summary. Any future
1331 // change to the getEncodedLinkage() function will need to be taken into
1332 // account here as well.
1333 RawFlags = (RawFlags << 4) | Flags.Linkage; // 4 bits
1334
1335 RawFlags |= (Flags.Visibility << 8); // 2 bits
1336
1337 unsigned ImportType = Flags.ImportType | ImportAsDecl;
1338 RawFlags |= (ImportType << 10); // 1 bit
1339
1340 return RawFlags;
1341}
1342
1344 uint64_t RawFlags = Flags.MaybeReadOnly | (Flags.MaybeWriteOnly << 1) |
1345 (Flags.Constant << 2) | Flags.VCallVisibility << 3;
1346 return RawFlags;
1347}
1348
1350 uint64_t RawFlags = 0;
1351
1352 RawFlags |= CI.Hotness; // 3 bits
1353 RawFlags |= (CI.HasTailCall << 3); // 1 bit
1354
1355 return RawFlags;
1356}
1357
1359 uint64_t RawFlags = 0;
1360
1361 RawFlags |= CI.RelBlockFreq; // CalleeInfo::RelBlockFreqBits bits
1362 RawFlags |= (CI.HasTailCall << CalleeInfo::RelBlockFreqBits); // 1 bit
1363
1364 return RawFlags;
1365}
1366
1367static unsigned getEncodedVisibility(const GlobalValue &GV) {
1368 switch (GV.getVisibility()) {
1369 case GlobalValue::DefaultVisibility: return 0;
1370 case GlobalValue::HiddenVisibility: return 1;
1371 case GlobalValue::ProtectedVisibility: return 2;
1372 }
1373 llvm_unreachable("Invalid visibility");
1374}
1375
1376static unsigned getEncodedDLLStorageClass(const GlobalValue &GV) {
1377 switch (GV.getDLLStorageClass()) {
1378 case GlobalValue::DefaultStorageClass: return 0;
1381 }
1382 llvm_unreachable("Invalid DLL storage class");
1383}
1384
1385static unsigned getEncodedThreadLocalMode(const GlobalValue &GV) {
1386 switch (GV.getThreadLocalMode()) {
1387 case GlobalVariable::NotThreadLocal: return 0;
1391 case GlobalVariable::LocalExecTLSModel: return 4;
1392 }
1393 llvm_unreachable("Invalid TLS model");
1394}
1395
1396static unsigned getEncodedComdatSelectionKind(const Comdat &C) {
1397 switch (C.getSelectionKind()) {
1398 case Comdat::Any:
1400 case Comdat::ExactMatch:
1402 case Comdat::Largest:
1406 case Comdat::SameSize:
1408 }
1409 llvm_unreachable("Invalid selection kind");
1410}
1411
1412static unsigned getEncodedUnnamedAddr(const GlobalValue &GV) {
1413 switch (GV.getUnnamedAddr()) {
1414 case GlobalValue::UnnamedAddr::None: return 0;
1415 case GlobalValue::UnnamedAddr::Local: return 2;
1416 case GlobalValue::UnnamedAddr::Global: return 1;
1417 }
1418 llvm_unreachable("Invalid unnamed_addr");
1419}
1420
1421size_t ModuleBitcodeWriter::addToStrtab(StringRef Str) {
1422 if (GenerateHash)
1423 Hasher.update(Str);
1424 return StrtabBuilder.add(Str);
1425}
1426
1427void ModuleBitcodeWriter::writeComdats() {
1429 for (const Comdat *C : VE.getComdats()) {
1430 // COMDAT: [strtab offset, strtab size, selection_kind]
1431 Vals.push_back(addToStrtab(C->getName()));
1432 Vals.push_back(C->getName().size());
1434 Stream.EmitRecord(bitc::MODULE_CODE_COMDAT, Vals, /*AbbrevToUse=*/0);
1435 Vals.clear();
1436 }
1437}
1438
1439/// Write a record that will eventually hold the word offset of the
1440/// module-level VST. For now the offset is 0, which will be backpatched
1441/// after the real VST is written. Saves the bit offset to backpatch.
1442void ModuleBitcodeWriter::writeValueSymbolTableForwardDecl() {
1443 // Write a placeholder value in for the offset of the real VST,
1444 // which is written after the function blocks so that it can include
1445 // the offset of each function. The placeholder offset will be
1446 // updated when the real VST is written.
1447 auto Abbv = std::make_shared<BitCodeAbbrev>();
1448 Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_VSTOFFSET));
1449 // Blocks are 32-bit aligned, so we can use a 32-bit word offset to
1450 // hold the real VST offset. Must use fixed instead of VBR as we don't
1451 // know how many VBR chunks to reserve ahead of time.
1452 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
1453 unsigned VSTOffsetAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1454
1455 // Emit the placeholder
1456 uint64_t Vals[] = {bitc::MODULE_CODE_VSTOFFSET, 0};
1457 Stream.EmitRecordWithAbbrev(VSTOffsetAbbrev, Vals);
1458
1459 // Compute and save the bit offset to the placeholder, which will be
1460 // patched when the real VST is written. We can simply subtract the 32-bit
1461 // fixed size from the current bit number to get the location to backpatch.
1462 VSTOffsetPlaceholder = Stream.GetCurrentBitNo() - 32;
1463}
1464
1466
1467/// Determine the encoding to use for the given string name and length.
1469 bool isChar6 = true;
1470 for (char C : Str) {
1471 if (isChar6)
1472 isChar6 = BitCodeAbbrevOp::isChar6(C);
1473 if ((unsigned char)C & 128)
1474 // don't bother scanning the rest.
1475 return SE_Fixed8;
1476 }
1477 if (isChar6)
1478 return SE_Char6;
1479 return SE_Fixed7;
1480}
1481
1482static_assert(sizeof(GlobalValue::SanitizerMetadata) <= sizeof(unsigned),
1483 "Sanitizer Metadata is too large for naive serialization.");
1484static unsigned
1486 return Meta.NoAddress | (Meta.NoHWAddress << 1) |
1487 (Meta.Memtag << 2) | (Meta.IsDynInit << 3);
1488}
1489
1490/// Emit top-level description of module, including target triple, inline asm,
1491/// descriptors for global variables, and function prototype info.
1492/// Returns the bit offset to backpatch with the location of the real VST.
1493void ModuleBitcodeWriter::writeModuleInfo() {
1494 // Emit various pieces of data attached to a module.
1495 if (!M.getTargetTriple().empty())
1497 M.getTargetTriple().str(), 0 /*TODO*/);
1498 const std::string &DL = M.getDataLayoutStr();
1499 if (!DL.empty())
1501 if (!M.getModuleInlineAsm().empty())
1502 writeStringRecord(Stream, bitc::MODULE_CODE_ASM, M.getModuleInlineAsm(),
1503 0 /*TODO*/);
1504
1505 // Emit information about sections and GC, computing how many there are. Also
1506 // compute the maximum alignment value.
1507 std::map<std::string, unsigned> SectionMap;
1508 std::map<std::string, unsigned> GCMap;
1509 MaybeAlign MaxGVarAlignment;
1510 unsigned MaxGlobalType = 0;
1511 for (const GlobalVariable &GV : M.globals()) {
1512 if (MaybeAlign A = GV.getAlign())
1513 MaxGVarAlignment = !MaxGVarAlignment ? *A : std::max(*MaxGVarAlignment, *A);
1514 MaxGlobalType = std::max(MaxGlobalType, VE.getTypeID(GV.getValueType()));
1515 if (GV.hasSection()) {
1516 // Give section names unique ID's.
1517 unsigned &Entry = SectionMap[std::string(GV.getSection())];
1518 if (!Entry) {
1519 writeStringRecord(Stream, bitc::MODULE_CODE_SECTIONNAME, GV.getSection(),
1520 0 /*TODO*/);
1521 Entry = SectionMap.size();
1522 }
1523 }
1524 }
1525 for (const Function &F : M) {
1526 if (F.hasSection()) {
1527 // Give section names unique ID's.
1528 unsigned &Entry = SectionMap[std::string(F.getSection())];
1529 if (!Entry) {
1531 0 /*TODO*/);
1532 Entry = SectionMap.size();
1533 }
1534 }
1535 if (F.hasGC()) {
1536 // Same for GC names.
1537 unsigned &Entry = GCMap[F.getGC()];
1538 if (!Entry) {
1540 0 /*TODO*/);
1541 Entry = GCMap.size();
1542 }
1543 }
1544 }
1545
1546 // Emit abbrev for globals, now that we know # sections and max alignment.
1547 unsigned SimpleGVarAbbrev = 0;
1548 if (!M.global_empty()) {
1549 // Add an abbrev for common globals with no visibility or thread localness.
1550 auto Abbv = std::make_shared<BitCodeAbbrev>();
1551 Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_GLOBALVAR));
1552 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
1553 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
1554 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
1555 Log2_32_Ceil(MaxGlobalType+1)));
1556 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // AddrSpace << 2
1557 //| explicitType << 1
1558 //| constant
1559 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Initializer.
1560 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); // Linkage.
1561 if (!MaxGVarAlignment) // Alignment.
1562 Abbv->Add(BitCodeAbbrevOp(0));
1563 else {
1564 unsigned MaxEncAlignment = getEncodedAlign(MaxGVarAlignment);
1565 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
1566 Log2_32_Ceil(MaxEncAlignment+1)));
1567 }
1568 if (SectionMap.empty()) // Section.
1569 Abbv->Add(BitCodeAbbrevOp(0));
1570 else
1571 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed,
1572 Log2_32_Ceil(SectionMap.size()+1)));
1573 // Don't bother emitting vis + thread local.
1574 SimpleGVarAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1575 }
1576
1578 // Emit the module's source file name.
1579 {
1580 StringEncoding Bits = getStringEncoding(M.getSourceFileName());
1581 BitCodeAbbrevOp AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8);
1582 if (Bits == SE_Char6)
1583 AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Char6);
1584 else if (Bits == SE_Fixed7)
1585 AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7);
1586
1587 // MODULE_CODE_SOURCE_FILENAME: [namechar x N]
1588 auto Abbv = std::make_shared<BitCodeAbbrev>();
1589 Abbv->Add(BitCodeAbbrevOp(bitc::MODULE_CODE_SOURCE_FILENAME));
1590 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1591 Abbv->Add(AbbrevOpToUse);
1592 unsigned FilenameAbbrev = Stream.EmitAbbrev(std::move(Abbv));
1593
1594 for (const auto P : M.getSourceFileName())
1595 Vals.push_back((unsigned char)P);
1596
1597 // Emit the finished record.
1598 Stream.EmitRecord(bitc::MODULE_CODE_SOURCE_FILENAME, Vals, FilenameAbbrev);
1599 Vals.clear();
1600 }
1601
1602 // Emit the global variable information.
1603 for (const GlobalVariable &GV : M.globals()) {
1604 unsigned AbbrevToUse = 0;
1605
1606 // GLOBALVAR: [strtab offset, strtab size, type, isconst, initid,
1607 // linkage, alignment, section, visibility, threadlocal,
1608 // unnamed_addr, externally_initialized, dllstorageclass,
1609 // comdat, attributes, DSO_Local, GlobalSanitizer, code_model]
1610 Vals.push_back(addToStrtab(GV.getName()));
1611 Vals.push_back(GV.getName().size());
1612 Vals.push_back(VE.getTypeID(GV.getValueType()));
1613 Vals.push_back(GV.getType()->getAddressSpace() << 2 | 2 | GV.isConstant());
1614 Vals.push_back(GV.isDeclaration() ? 0 :
1615 (VE.getValueID(GV.getInitializer()) + 1));
1616 Vals.push_back(getEncodedLinkage(GV));
1617 Vals.push_back(getEncodedAlign(GV.getAlign()));
1618 Vals.push_back(GV.hasSection() ? SectionMap[std::string(GV.getSection())]
1619 : 0);
1620 if (GV.isThreadLocal() ||
1621 GV.getVisibility() != GlobalValue::DefaultVisibility ||
1622 GV.getUnnamedAddr() != GlobalValue::UnnamedAddr::None ||
1623 GV.isExternallyInitialized() ||
1624 GV.getDLLStorageClass() != GlobalValue::DefaultStorageClass ||
1625 GV.hasComdat() || GV.hasAttributes() || GV.isDSOLocal() ||
1626 GV.hasPartition() || GV.hasSanitizerMetadata() || GV.getCodeModel()) {
1630 Vals.push_back(GV.isExternallyInitialized());
1632 Vals.push_back(GV.hasComdat() ? VE.getComdatID(GV.getComdat()) : 0);
1633
1634 auto AL = GV.getAttributesAsList(AttributeList::FunctionIndex);
1635 Vals.push_back(VE.getAttributeListID(AL));
1636
1637 Vals.push_back(GV.isDSOLocal());
1638 Vals.push_back(addToStrtab(GV.getPartition()));
1639 Vals.push_back(GV.getPartition().size());
1640
1641 Vals.push_back((GV.hasSanitizerMetadata() ? serializeSanitizerMetadata(
1642 GV.getSanitizerMetadata())
1643 : 0));
1644 Vals.push_back(GV.getCodeModelRaw());
1645 } else {
1646 AbbrevToUse = SimpleGVarAbbrev;
1647 }
1648
1649 Stream.EmitRecord(bitc::MODULE_CODE_GLOBALVAR, Vals, AbbrevToUse);
1650 Vals.clear();
1651 }
1652
1653 // Emit the function proto information.
1654 for (const Function &F : M) {
1655 // FUNCTION: [strtab offset, strtab size, type, callingconv, isproto,
1656 // linkage, paramattrs, alignment, section, visibility, gc,
1657 // unnamed_addr, prologuedata, dllstorageclass, comdat,
1658 // prefixdata, personalityfn, DSO_Local, addrspace]
1659 Vals.push_back(addToStrtab(F.getName()));
1660 Vals.push_back(F.getName().size());
1661 Vals.push_back(VE.getTypeID(F.getFunctionType()));
1662 Vals.push_back(F.getCallingConv());
1663 Vals.push_back(F.isDeclaration());
1665 Vals.push_back(VE.getAttributeListID(F.getAttributes()));
1666 Vals.push_back(getEncodedAlign(F.getAlign()));
1667 Vals.push_back(F.hasSection() ? SectionMap[std::string(F.getSection())]
1668 : 0);
1670 Vals.push_back(F.hasGC() ? GCMap[F.getGC()] : 0);
1672 Vals.push_back(F.hasPrologueData() ? (VE.getValueID(F.getPrologueData()) + 1)
1673 : 0);
1675 Vals.push_back(F.hasComdat() ? VE.getComdatID(F.getComdat()) : 0);
1676 Vals.push_back(F.hasPrefixData() ? (VE.getValueID(F.getPrefixData()) + 1)
1677 : 0);
1678 Vals.push_back(
1679 F.hasPersonalityFn() ? (VE.getValueID(F.getPersonalityFn()) + 1) : 0);
1680
1681 Vals.push_back(F.isDSOLocal());
1682 Vals.push_back(F.getAddressSpace());
1683 Vals.push_back(addToStrtab(F.getPartition()));
1684 Vals.push_back(F.getPartition().size());
1685
1686 unsigned AbbrevToUse = 0;
1687 Stream.EmitRecord(bitc::MODULE_CODE_FUNCTION, Vals, AbbrevToUse);
1688 Vals.clear();
1689 }
1690
1691 // Emit the alias information.
1692 for (const GlobalAlias &A : M.aliases()) {
1693 // ALIAS: [strtab offset, strtab size, alias type, aliasee val#, linkage,
1694 // visibility, dllstorageclass, threadlocal, unnamed_addr,
1695 // DSO_Local]
1696 Vals.push_back(addToStrtab(A.getName()));
1697 Vals.push_back(A.getName().size());
1698 Vals.push_back(VE.getTypeID(A.getValueType()));
1699 Vals.push_back(A.getType()->getAddressSpace());
1700 Vals.push_back(VE.getValueID(A.getAliasee()));
1706 Vals.push_back(A.isDSOLocal());
1707 Vals.push_back(addToStrtab(A.getPartition()));
1708 Vals.push_back(A.getPartition().size());
1709
1710 unsigned AbbrevToUse = 0;
1711 Stream.EmitRecord(bitc::MODULE_CODE_ALIAS, Vals, AbbrevToUse);
1712 Vals.clear();
1713 }
1714
1715 // Emit the ifunc information.
1716 for (const GlobalIFunc &I : M.ifuncs()) {
1717 // IFUNC: [strtab offset, strtab size, ifunc type, address space, resolver
1718 // val#, linkage, visibility, DSO_Local]
1719 Vals.push_back(addToStrtab(I.getName()));
1720 Vals.push_back(I.getName().size());
1721 Vals.push_back(VE.getTypeID(I.getValueType()));
1722 Vals.push_back(I.getType()->getAddressSpace());
1723 Vals.push_back(VE.getValueID(I.getResolver()));
1726 Vals.push_back(I.isDSOLocal());
1727 Vals.push_back(addToStrtab(I.getPartition()));
1728 Vals.push_back(I.getPartition().size());
1729 Stream.EmitRecord(bitc::MODULE_CODE_IFUNC, Vals);
1730 Vals.clear();
1731 }
1732
1733 writeValueSymbolTableForwardDecl();
1734}
1735
1737 uint64_t Flags = 0;
1738
1739 if (const auto *OBO = dyn_cast<OverflowingBinaryOperator>(V)) {
1740 if (OBO->hasNoSignedWrap())
1741 Flags |= 1 << bitc::OBO_NO_SIGNED_WRAP;
1742 if (OBO->hasNoUnsignedWrap())
1743 Flags |= 1 << bitc::OBO_NO_UNSIGNED_WRAP;
1744 } else if (const auto *PEO = dyn_cast<PossiblyExactOperator>(V)) {
1745 if (PEO->isExact())
1746 Flags |= 1 << bitc::PEO_EXACT;
1747 } else if (const auto *PDI = dyn_cast<PossiblyDisjointInst>(V)) {
1748 if (PDI->isDisjoint())
1749 Flags |= 1 << bitc::PDI_DISJOINT;
1750 } else if (const auto *FPMO = dyn_cast<FPMathOperator>(V)) {
1751 if (FPMO->hasAllowReassoc())
1752 Flags |= bitc::AllowReassoc;
1753 if (FPMO->hasNoNaNs())
1754 Flags |= bitc::NoNaNs;
1755 if (FPMO->hasNoInfs())
1756 Flags |= bitc::NoInfs;
1757 if (FPMO->hasNoSignedZeros())
1758 Flags |= bitc::NoSignedZeros;
1759 if (FPMO->hasAllowReciprocal())
1760 Flags |= bitc::AllowReciprocal;
1761 if (FPMO->hasAllowContract())
1762 Flags |= bitc::AllowContract;
1763 if (FPMO->hasApproxFunc())
1764 Flags |= bitc::ApproxFunc;
1765 } else if (const auto *NNI = dyn_cast<PossiblyNonNegInst>(V)) {
1766 if (NNI->hasNonNeg())
1767 Flags |= 1 << bitc::PNNI_NON_NEG;
1768 } else if (const auto *TI = dyn_cast<TruncInst>(V)) {
1769 if (TI->hasNoSignedWrap())
1770 Flags |= 1 << bitc::TIO_NO_SIGNED_WRAP;
1771 if (TI->hasNoUnsignedWrap())
1772 Flags |= 1 << bitc::TIO_NO_UNSIGNED_WRAP;
1773 } else if (const auto *GEP = dyn_cast<GEPOperator>(V)) {
1774 if (GEP->isInBounds())
1775 Flags |= 1 << bitc::GEP_INBOUNDS;
1776 if (GEP->hasNoUnsignedSignedWrap())
1777 Flags |= 1 << bitc::GEP_NUSW;
1778 if (GEP->hasNoUnsignedWrap())
1779 Flags |= 1 << bitc::GEP_NUW;
1780 } else if (const auto *ICmp = dyn_cast<ICmpInst>(V)) {
1781 if (ICmp->hasSameSign())
1782 Flags |= 1 << bitc::ICMP_SAME_SIGN;
1783 }
1784
1785 return Flags;
1786}
1787
1788void ModuleBitcodeWriter::writeValueAsMetadata(
1789 const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {
1790 // Mimic an MDNode with a value as one operand.
1791 Value *V = MD->getValue();
1792 Record.push_back(VE.getTypeID(V->getType()));
1793 Record.push_back(VE.getValueID(V));
1794 Stream.EmitRecord(bitc::METADATA_VALUE, Record, 0);
1795 Record.clear();
1796}
1797
1798void ModuleBitcodeWriter::writeMDTuple(const MDTuple *N,
1799 SmallVectorImpl<uint64_t> &Record,
1800 unsigned Abbrev) {
1801 for (const MDOperand &MDO : N->operands()) {
1802 Metadata *MD = MDO;
1803 assert(!(MD && isa<LocalAsMetadata>(MD)) &&
1804 "Unexpected function-local metadata");
1805 Record.push_back(VE.getMetadataOrNullID(MD));
1806 }
1807 Stream.EmitRecord(N->isDistinct() ? bitc::METADATA_DISTINCT_NODE
1809 Record, Abbrev);
1810 Record.clear();
1811}
1812
1813unsigned ModuleBitcodeWriter::createDILocationAbbrev() {
1814 // Assume the column is usually under 128, and always output the inlined-at
1815 // location (it's never more expensive than building an array size 1).
1816 auto Abbv = std::make_shared<BitCodeAbbrev>();
1817 Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_LOCATION));
1818 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isDistinct
1819 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // line
1820 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // column
1821 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // scope
1822 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // inlinedAt
1823 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // isImplicitCode
1824 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // atomGroup
1825 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // atomRank
1826 return Stream.EmitAbbrev(std::move(Abbv));
1827}
1828
1829void ModuleBitcodeWriter::writeDILocation(const DILocation *N,
1830 SmallVectorImpl<uint64_t> &Record,
1831 unsigned &Abbrev) {
1832 if (!Abbrev)
1833 Abbrev = createDILocationAbbrev();
1834
1835 Record.push_back(N->isDistinct());
1836 Record.push_back(N->getLine());
1837 Record.push_back(N->getColumn());
1838 Record.push_back(VE.getMetadataID(N->getScope()));
1839 Record.push_back(VE.getMetadataOrNullID(N->getInlinedAt()));
1840 Record.push_back(N->isImplicitCode());
1841 Record.push_back(N->getAtomGroup());
1842 Record.push_back(N->getAtomRank());
1843 Stream.EmitRecord(bitc::METADATA_LOCATION, Record, Abbrev);
1844 Record.clear();
1845}
1846
1847unsigned ModuleBitcodeWriter::createGenericDINodeAbbrev() {
1848 // Assume the column is usually under 128, and always output the inlined-at
1849 // location (it's never more expensive than building an array size 1).
1850 auto Abbv = std::make_shared<BitCodeAbbrev>();
1851 Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_GENERIC_DEBUG));
1852 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1853 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1854 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
1855 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1856 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
1857 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
1858 return Stream.EmitAbbrev(std::move(Abbv));
1859}
1860
1861void ModuleBitcodeWriter::writeGenericDINode(const GenericDINode *N,
1862 SmallVectorImpl<uint64_t> &Record,
1863 unsigned &Abbrev) {
1864 if (!Abbrev)
1865 Abbrev = createGenericDINodeAbbrev();
1866
1867 Record.push_back(N->isDistinct());
1868 Record.push_back(N->getTag());
1869 Record.push_back(0); // Per-tag version field; unused for now.
1870
1871 for (auto &I : N->operands())
1872 Record.push_back(VE.getMetadataOrNullID(I));
1873
1874 Stream.EmitRecord(bitc::METADATA_GENERIC_DEBUG, Record, Abbrev);
1875 Record.clear();
1876}
1877
1878void ModuleBitcodeWriter::writeDISubrange(const DISubrange *N,
1879 SmallVectorImpl<uint64_t> &Record,
1880 unsigned Abbrev) {
1881 const uint64_t Version = 2 << 1;
1882 Record.push_back((uint64_t)N->isDistinct() | Version);
1883 Record.push_back(VE.getMetadataOrNullID(N->getRawCountNode()));
1884 Record.push_back(VE.getMetadataOrNullID(N->getRawLowerBound()));
1885 Record.push_back(VE.getMetadataOrNullID(N->getRawUpperBound()));
1886 Record.push_back(VE.getMetadataOrNullID(N->getRawStride()));
1887
1888 Stream.EmitRecord(bitc::METADATA_SUBRANGE, Record, Abbrev);
1889 Record.clear();
1890}
1891
1892void ModuleBitcodeWriter::writeDIGenericSubrange(
1893 const DIGenericSubrange *N, SmallVectorImpl<uint64_t> &Record,
1894 unsigned Abbrev) {
1895 Record.push_back((uint64_t)N->isDistinct());
1896 Record.push_back(VE.getMetadataOrNullID(N->getRawCountNode()));
1897 Record.push_back(VE.getMetadataOrNullID(N->getRawLowerBound()));
1898 Record.push_back(VE.getMetadataOrNullID(N->getRawUpperBound()));
1899 Record.push_back(VE.getMetadataOrNullID(N->getRawStride()));
1900
1901 Stream.EmitRecord(bitc::METADATA_GENERIC_SUBRANGE, Record, Abbrev);
1902 Record.clear();
1903}
1904
1905void ModuleBitcodeWriter::writeDIEnumerator(const DIEnumerator *N,
1906 SmallVectorImpl<uint64_t> &Record,
1907 unsigned Abbrev) {
1908 const uint64_t IsBigInt = 1 << 2;
1909 Record.push_back(IsBigInt | (N->isUnsigned() << 1) | N->isDistinct());
1910 Record.push_back(N->getValue().getBitWidth());
1911 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1912 emitWideAPInt(Record, N->getValue());
1913
1914 Stream.EmitRecord(bitc::METADATA_ENUMERATOR, Record, Abbrev);
1915 Record.clear();
1916}
1917
1918void ModuleBitcodeWriter::writeDIBasicType(const DIBasicType *N,
1919 SmallVectorImpl<uint64_t> &Record,
1920 unsigned Abbrev) {
1921 const unsigned SizeIsMetadata = 0x2;
1922 Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct());
1923 Record.push_back(N->getTag());
1924 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1925 Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));
1926 Record.push_back(N->getAlignInBits());
1927 Record.push_back(N->getEncoding());
1928 Record.push_back(N->getFlags());
1929 Record.push_back(N->getNumExtraInhabitants());
1930 Record.push_back(N->getDataSizeInBits());
1931
1932 Stream.EmitRecord(bitc::METADATA_BASIC_TYPE, Record, Abbrev);
1933 Record.clear();
1934}
1935
1936void ModuleBitcodeWriter::writeDIFixedPointType(
1937 const DIFixedPointType *N, SmallVectorImpl<uint64_t> &Record,
1938 unsigned Abbrev) {
1939 const unsigned SizeIsMetadata = 0x2;
1940 Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct());
1941 Record.push_back(N->getTag());
1942 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1943 Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));
1944 Record.push_back(N->getAlignInBits());
1945 Record.push_back(N->getEncoding());
1946 Record.push_back(N->getFlags());
1947 Record.push_back(N->getKind());
1948 Record.push_back(N->getFactorRaw());
1949
1950 auto WriteWideInt = [&](const APInt &Value) {
1951 // Write an encoded word that holds the number of active words and
1952 // the number of bits.
1953 uint64_t NumWords = Value.getActiveWords();
1954 uint64_t Encoded = (NumWords << 32) | Value.getBitWidth();
1955 Record.push_back(Encoded);
1956 emitWideAPInt(Record, Value);
1957 };
1958
1959 WriteWideInt(N->getNumeratorRaw());
1960 WriteWideInt(N->getDenominatorRaw());
1961
1962 Stream.EmitRecord(bitc::METADATA_FIXED_POINT_TYPE, Record, Abbrev);
1963 Record.clear();
1964}
1965
1966void ModuleBitcodeWriter::writeDIStringType(const DIStringType *N,
1967 SmallVectorImpl<uint64_t> &Record,
1968 unsigned Abbrev) {
1969 const unsigned SizeIsMetadata = 0x2;
1970 Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct());
1971 Record.push_back(N->getTag());
1972 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1973 Record.push_back(VE.getMetadataOrNullID(N->getStringLength()));
1974 Record.push_back(VE.getMetadataOrNullID(N->getStringLengthExp()));
1975 Record.push_back(VE.getMetadataOrNullID(N->getStringLocationExp()));
1976 Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));
1977 Record.push_back(N->getAlignInBits());
1978 Record.push_back(N->getEncoding());
1979
1980 Stream.EmitRecord(bitc::METADATA_STRING_TYPE, Record, Abbrev);
1981 Record.clear();
1982}
1983
1984void ModuleBitcodeWriter::writeDIDerivedType(const DIDerivedType *N,
1985 SmallVectorImpl<uint64_t> &Record,
1986 unsigned Abbrev) {
1987 const unsigned SizeIsMetadata = 0x2;
1988 Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct());
1989 Record.push_back(N->getTag());
1990 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
1991 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
1992 Record.push_back(N->getLine());
1993 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
1994 Record.push_back(VE.getMetadataOrNullID(N->getBaseType()));
1995 Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));
1996 Record.push_back(N->getAlignInBits());
1997 Record.push_back(VE.getMetadataOrNullID(N->getRawOffsetInBits()));
1998 Record.push_back(N->getFlags());
1999 Record.push_back(VE.getMetadataOrNullID(N->getExtraData()));
2000
2001 // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means
2002 // that there is no DWARF address space associated with DIDerivedType.
2003 if (const auto &DWARFAddressSpace = N->getDWARFAddressSpace())
2004 Record.push_back(*DWARFAddressSpace + 1);
2005 else
2006 Record.push_back(0);
2007
2008 Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get()));
2009
2010 if (auto PtrAuthData = N->getPtrAuthData())
2011 Record.push_back(PtrAuthData->RawData);
2012 else
2013 Record.push_back(0);
2014
2015 Stream.EmitRecord(bitc::METADATA_DERIVED_TYPE, Record, Abbrev);
2016 Record.clear();
2017}
2018
2019void ModuleBitcodeWriter::writeDISubrangeType(const DISubrangeType *N,
2020 SmallVectorImpl<uint64_t> &Record,
2021 unsigned Abbrev) {
2022 const unsigned SizeIsMetadata = 0x2;
2023 Record.push_back(SizeIsMetadata | (unsigned)N->isDistinct());
2024 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2025 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2026 Record.push_back(N->getLine());
2027 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
2028 Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));
2029 Record.push_back(N->getAlignInBits());
2030 Record.push_back(N->getFlags());
2031 Record.push_back(VE.getMetadataOrNullID(N->getBaseType()));
2032 Record.push_back(VE.getMetadataOrNullID(N->getRawLowerBound()));
2033 Record.push_back(VE.getMetadataOrNullID(N->getRawUpperBound()));
2034 Record.push_back(VE.getMetadataOrNullID(N->getRawStride()));
2035 Record.push_back(VE.getMetadataOrNullID(N->getRawBias()));
2036
2037 Stream.EmitRecord(bitc::METADATA_SUBRANGE_TYPE, Record, Abbrev);
2038 Record.clear();
2039}
2040
2041void ModuleBitcodeWriter::writeDICompositeType(
2042 const DICompositeType *N, SmallVectorImpl<uint64_t> &Record,
2043 unsigned Abbrev) {
2044 const unsigned IsNotUsedInOldTypeRef = 0x2;
2045 const unsigned SizeIsMetadata = 0x4;
2046 Record.push_back(SizeIsMetadata | IsNotUsedInOldTypeRef |
2047 (unsigned)N->isDistinct());
2048 Record.push_back(N->getTag());
2049 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2050 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2051 Record.push_back(N->getLine());
2052 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
2053 Record.push_back(VE.getMetadataOrNullID(N->getBaseType()));
2054 Record.push_back(VE.getMetadataOrNullID(N->getRawSizeInBits()));
2055 Record.push_back(N->getAlignInBits());
2056 Record.push_back(VE.getMetadataOrNullID(N->getRawOffsetInBits()));
2057 Record.push_back(N->getFlags());
2058 Record.push_back(VE.getMetadataOrNullID(N->getElements().get()));
2059 Record.push_back(N->getRuntimeLang());
2060 Record.push_back(VE.getMetadataOrNullID(N->getVTableHolder()));
2061 Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get()));
2062 Record.push_back(VE.getMetadataOrNullID(N->getRawIdentifier()));
2063 Record.push_back(VE.getMetadataOrNullID(N->getDiscriminator()));
2064 Record.push_back(VE.getMetadataOrNullID(N->getRawDataLocation()));
2065 Record.push_back(VE.getMetadataOrNullID(N->getRawAssociated()));
2066 Record.push_back(VE.getMetadataOrNullID(N->getRawAllocated()));
2067 Record.push_back(VE.getMetadataOrNullID(N->getRawRank()));
2068 Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get()));
2069 Record.push_back(N->getNumExtraInhabitants());
2070 Record.push_back(VE.getMetadataOrNullID(N->getRawSpecification()));
2071 Record.push_back(
2072 N->getEnumKind().value_or(dwarf::DW_APPLE_ENUM_KIND_invalid));
2073 Record.push_back(VE.getMetadataOrNullID(N->getRawBitStride()));
2074
2075 Stream.EmitRecord(bitc::METADATA_COMPOSITE_TYPE, Record, Abbrev);
2076 Record.clear();
2077}
2078
2079void ModuleBitcodeWriter::writeDISubroutineType(
2080 const DISubroutineType *N, SmallVectorImpl<uint64_t> &Record,
2081 unsigned Abbrev) {
2082 const unsigned HasNoOldTypeRefs = 0x2;
2083 Record.push_back(HasNoOldTypeRefs | (unsigned)N->isDistinct());
2084 Record.push_back(N->getFlags());
2085 Record.push_back(VE.getMetadataOrNullID(N->getTypeArray().get()));
2086 Record.push_back(N->getCC());
2087
2088 Stream.EmitRecord(bitc::METADATA_SUBROUTINE_TYPE, Record, Abbrev);
2089 Record.clear();
2090}
2091
2092void ModuleBitcodeWriter::writeDIFile(const DIFile *N,
2093 SmallVectorImpl<uint64_t> &Record,
2094 unsigned Abbrev) {
2095 Record.push_back(N->isDistinct());
2096 Record.push_back(VE.getMetadataOrNullID(N->getRawFilename()));
2097 Record.push_back(VE.getMetadataOrNullID(N->getRawDirectory()));
2098 if (N->getRawChecksum()) {
2099 Record.push_back(N->getRawChecksum()->Kind);
2100 Record.push_back(VE.getMetadataOrNullID(N->getRawChecksum()->Value));
2101 } else {
2102 // Maintain backwards compatibility with the old internal representation of
2103 // CSK_None in ChecksumKind by writing nulls here when Checksum is None.
2104 Record.push_back(0);
2105 Record.push_back(VE.getMetadataOrNullID(nullptr));
2106 }
2107 auto Source = N->getRawSource();
2108 if (Source)
2109 Record.push_back(VE.getMetadataOrNullID(Source));
2110
2111 Stream.EmitRecord(bitc::METADATA_FILE, Record, Abbrev);
2112 Record.clear();
2113}
2114
2115void ModuleBitcodeWriter::writeDICompileUnit(const DICompileUnit *N,
2116 SmallVectorImpl<uint64_t> &Record,
2117 unsigned Abbrev) {
2118 assert(N->isDistinct() && "Expected distinct compile units");
2119 Record.push_back(/* IsDistinct */ true);
2120
2121 auto Lang = N->getSourceLanguage();
2122 Record.push_back(Lang.getName());
2123 // Set bit so the MetadataLoader can distniguish between versioned and
2124 // unversioned names.
2125 if (Lang.hasVersionedName())
2126 Record.back() ^= (uint64_t(1) << 63);
2127
2128 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2129 Record.push_back(VE.getMetadataOrNullID(N->getRawProducer()));
2130 Record.push_back(N->isOptimized());
2131 Record.push_back(VE.getMetadataOrNullID(N->getRawFlags()));
2132 Record.push_back(N->getRuntimeVersion());
2133 Record.push_back(VE.getMetadataOrNullID(N->getRawSplitDebugFilename()));
2134 Record.push_back(N->getEmissionKind());
2135 Record.push_back(VE.getMetadataOrNullID(N->getEnumTypes().get()));
2136 Record.push_back(VE.getMetadataOrNullID(N->getRetainedTypes().get()));
2137 Record.push_back(/* subprograms */ 0);
2138 Record.push_back(VE.getMetadataOrNullID(N->getGlobalVariables().get()));
2139 Record.push_back(VE.getMetadataOrNullID(N->getImportedEntities().get()));
2140 Record.push_back(N->getDWOId());
2141 Record.push_back(VE.getMetadataOrNullID(N->getMacros().get()));
2142 Record.push_back(N->getSplitDebugInlining());
2143 Record.push_back(N->getDebugInfoForProfiling());
2144 Record.push_back((unsigned)N->getNameTableKind());
2145 Record.push_back(N->getRangesBaseAddress());
2146 Record.push_back(VE.getMetadataOrNullID(N->getRawSysRoot()));
2147 Record.push_back(VE.getMetadataOrNullID(N->getRawSDK()));
2148 Record.push_back(Lang.hasVersionedName() ? Lang.getVersion() : 0);
2149
2150 Stream.EmitRecord(bitc::METADATA_COMPILE_UNIT, Record, Abbrev);
2151 Record.clear();
2152}
2153
2154void ModuleBitcodeWriter::writeDISubprogram(const DISubprogram *N,
2155 SmallVectorImpl<uint64_t> &Record,
2156 unsigned Abbrev) {
2157 const uint64_t HasUnitFlag = 1 << 1;
2158 const uint64_t HasSPFlagsFlag = 1 << 2;
2159 Record.push_back(uint64_t(N->isDistinct()) | HasUnitFlag | HasSPFlagsFlag);
2160 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
2161 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2162 Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName()));
2163 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2164 Record.push_back(N->getLine());
2165 Record.push_back(VE.getMetadataOrNullID(N->getType()));
2166 Record.push_back(N->getScopeLine());
2167 Record.push_back(VE.getMetadataOrNullID(N->getContainingType()));
2168 Record.push_back(N->getSPFlags());
2169 Record.push_back(N->getVirtualIndex());
2170 Record.push_back(N->getFlags());
2171 Record.push_back(VE.getMetadataOrNullID(N->getRawUnit()));
2172 Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams().get()));
2173 Record.push_back(VE.getMetadataOrNullID(N->getDeclaration()));
2174 Record.push_back(VE.getMetadataOrNullID(N->getRetainedNodes().get()));
2175 Record.push_back(N->getThisAdjustment());
2176 Record.push_back(VE.getMetadataOrNullID(N->getThrownTypes().get()));
2177 Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get()));
2178 Record.push_back(VE.getMetadataOrNullID(N->getRawTargetFuncName()));
2179 Record.push_back(N->getKeyInstructionsEnabled());
2180
2181 Stream.EmitRecord(bitc::METADATA_SUBPROGRAM, Record, Abbrev);
2182 Record.clear();
2183}
2184
2185void ModuleBitcodeWriter::writeDILexicalBlock(const DILexicalBlock *N,
2186 SmallVectorImpl<uint64_t> &Record,
2187 unsigned Abbrev) {
2188 Record.push_back(N->isDistinct());
2189 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
2190 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2191 Record.push_back(N->getLine());
2192 Record.push_back(N->getColumn());
2193
2194 Stream.EmitRecord(bitc::METADATA_LEXICAL_BLOCK, Record, Abbrev);
2195 Record.clear();
2196}
2197
2198void ModuleBitcodeWriter::writeDILexicalBlockFile(
2199 const DILexicalBlockFile *N, SmallVectorImpl<uint64_t> &Record,
2200 unsigned Abbrev) {
2201 Record.push_back(N->isDistinct());
2202 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
2203 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2204 Record.push_back(N->getDiscriminator());
2205
2206 Stream.EmitRecord(bitc::METADATA_LEXICAL_BLOCK_FILE, Record, Abbrev);
2207 Record.clear();
2208}
2209
2210void ModuleBitcodeWriter::writeDICommonBlock(const DICommonBlock *N,
2211 SmallVectorImpl<uint64_t> &Record,
2212 unsigned Abbrev) {
2213 Record.push_back(N->isDistinct());
2214 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
2215 Record.push_back(VE.getMetadataOrNullID(N->getDecl()));
2216 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2217 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2218 Record.push_back(N->getLineNo());
2219
2220 Stream.EmitRecord(bitc::METADATA_COMMON_BLOCK, Record, Abbrev);
2221 Record.clear();
2222}
2223
2224void ModuleBitcodeWriter::writeDINamespace(const DINamespace *N,
2225 SmallVectorImpl<uint64_t> &Record,
2226 unsigned Abbrev) {
2227 Record.push_back(N->isDistinct() | N->getExportSymbols() << 1);
2228 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
2229 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2230
2231 Stream.EmitRecord(bitc::METADATA_NAMESPACE, Record, Abbrev);
2232 Record.clear();
2233}
2234
2235void ModuleBitcodeWriter::writeDIMacro(const DIMacro *N,
2236 SmallVectorImpl<uint64_t> &Record,
2237 unsigned Abbrev) {
2238 Record.push_back(N->isDistinct());
2239 Record.push_back(N->getMacinfoType());
2240 Record.push_back(N->getLine());
2241 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2242 Record.push_back(VE.getMetadataOrNullID(N->getRawValue()));
2243
2244 Stream.EmitRecord(bitc::METADATA_MACRO, Record, Abbrev);
2245 Record.clear();
2246}
2247
2248void ModuleBitcodeWriter::writeDIMacroFile(const DIMacroFile *N,
2249 SmallVectorImpl<uint64_t> &Record,
2250 unsigned Abbrev) {
2251 Record.push_back(N->isDistinct());
2252 Record.push_back(N->getMacinfoType());
2253 Record.push_back(N->getLine());
2254 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2255 Record.push_back(VE.getMetadataOrNullID(N->getElements().get()));
2256
2257 Stream.EmitRecord(bitc::METADATA_MACRO_FILE, Record, Abbrev);
2258 Record.clear();
2259}
2260
2261void ModuleBitcodeWriter::writeDIArgList(const DIArgList *N,
2262 SmallVectorImpl<uint64_t> &Record) {
2263 Record.reserve(N->getArgs().size());
2264 for (ValueAsMetadata *MD : N->getArgs())
2265 Record.push_back(VE.getMetadataID(MD));
2266
2267 Stream.EmitRecord(bitc::METADATA_ARG_LIST, Record);
2268 Record.clear();
2269}
2270
2271void ModuleBitcodeWriter::writeDIModule(const DIModule *N,
2272 SmallVectorImpl<uint64_t> &Record,
2273 unsigned Abbrev) {
2274 Record.push_back(N->isDistinct());
2275 for (auto &I : N->operands())
2276 Record.push_back(VE.getMetadataOrNullID(I));
2277 Record.push_back(N->getLineNo());
2278 Record.push_back(N->getIsDecl());
2279
2280 Stream.EmitRecord(bitc::METADATA_MODULE, Record, Abbrev);
2281 Record.clear();
2282}
2283
2284void ModuleBitcodeWriter::writeDIAssignID(const DIAssignID *N,
2285 SmallVectorImpl<uint64_t> &Record,
2286 unsigned Abbrev) {
2287 // There are no arguments for this metadata type.
2288 Record.push_back(N->isDistinct());
2289 Stream.EmitRecord(bitc::METADATA_ASSIGN_ID, Record, Abbrev);
2290 Record.clear();
2291}
2292
2293void ModuleBitcodeWriter::writeDITemplateTypeParameter(
2294 const DITemplateTypeParameter *N, SmallVectorImpl<uint64_t> &Record,
2295 unsigned Abbrev) {
2296 Record.push_back(N->isDistinct());
2297 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2298 Record.push_back(VE.getMetadataOrNullID(N->getType()));
2299 Record.push_back(N->isDefault());
2300
2301 Stream.EmitRecord(bitc::METADATA_TEMPLATE_TYPE, Record, Abbrev);
2302 Record.clear();
2303}
2304
2305void ModuleBitcodeWriter::writeDITemplateValueParameter(
2306 const DITemplateValueParameter *N, SmallVectorImpl<uint64_t> &Record,
2307 unsigned Abbrev) {
2308 Record.push_back(N->isDistinct());
2309 Record.push_back(N->getTag());
2310 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2311 Record.push_back(VE.getMetadataOrNullID(N->getType()));
2312 Record.push_back(N->isDefault());
2313 Record.push_back(VE.getMetadataOrNullID(N->getValue()));
2314
2315 Stream.EmitRecord(bitc::METADATA_TEMPLATE_VALUE, Record, Abbrev);
2316 Record.clear();
2317}
2318
2319void ModuleBitcodeWriter::writeDIGlobalVariable(
2320 const DIGlobalVariable *N, SmallVectorImpl<uint64_t> &Record,
2321 unsigned Abbrev) {
2322 const uint64_t Version = 2 << 1;
2323 Record.push_back((uint64_t)N->isDistinct() | Version);
2324 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
2325 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2326 Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName()));
2327 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2328 Record.push_back(N->getLine());
2329 Record.push_back(VE.getMetadataOrNullID(N->getType()));
2330 Record.push_back(N->isLocalToUnit());
2331 Record.push_back(N->isDefinition());
2332 Record.push_back(VE.getMetadataOrNullID(N->getStaticDataMemberDeclaration()));
2333 Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams()));
2334 Record.push_back(N->getAlignInBits());
2335 Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get()));
2336
2337 Stream.EmitRecord(bitc::METADATA_GLOBAL_VAR, Record, Abbrev);
2338 Record.clear();
2339}
2340
2341void ModuleBitcodeWriter::writeDILocalVariable(
2342 const DILocalVariable *N, SmallVectorImpl<uint64_t> &Record,
2343 unsigned Abbrev) {
2344 // In order to support all possible bitcode formats in BitcodeReader we need
2345 // to distinguish the following cases:
2346 // 1) Record has no artificial tag (Record[1]),
2347 // has no obsolete inlinedAt field (Record[9]).
2348 // In this case Record size will be 8, HasAlignment flag is false.
2349 // 2) Record has artificial tag (Record[1]),
2350 // has no obsolete inlignedAt field (Record[9]).
2351 // In this case Record size will be 9, HasAlignment flag is false.
2352 // 3) Record has both artificial tag (Record[1]) and
2353 // obsolete inlignedAt field (Record[9]).
2354 // In this case Record size will be 10, HasAlignment flag is false.
2355 // 4) Record has neither artificial tag, nor inlignedAt field, but
2356 // HasAlignment flag is true and Record[8] contains alignment value.
2357 const uint64_t HasAlignmentFlag = 1 << 1;
2358 Record.push_back((uint64_t)N->isDistinct() | HasAlignmentFlag);
2359 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
2360 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2361 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2362 Record.push_back(N->getLine());
2363 Record.push_back(VE.getMetadataOrNullID(N->getType()));
2364 Record.push_back(N->getArg());
2365 Record.push_back(N->getFlags());
2366 Record.push_back(N->getAlignInBits());
2367 Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get()));
2368
2369 Stream.EmitRecord(bitc::METADATA_LOCAL_VAR, Record, Abbrev);
2370 Record.clear();
2371}
2372
2373void ModuleBitcodeWriter::writeDILabel(
2374 const DILabel *N, SmallVectorImpl<uint64_t> &Record,
2375 unsigned Abbrev) {
2376 uint64_t IsArtificialFlag = uint64_t(N->isArtificial()) << 1;
2377 Record.push_back((uint64_t)N->isDistinct() | IsArtificialFlag);
2378 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
2379 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2380 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2381 Record.push_back(N->getLine());
2382 Record.push_back(N->getColumn());
2383 Record.push_back(N->getCoroSuspendIdx().has_value()
2384 ? (uint64_t)N->getCoroSuspendIdx().value()
2385 : std::numeric_limits<uint64_t>::max());
2386
2387 Stream.EmitRecord(bitc::METADATA_LABEL, Record, Abbrev);
2388 Record.clear();
2389}
2390
2391void ModuleBitcodeWriter::writeDIExpression(const DIExpression *N,
2392 SmallVectorImpl<uint64_t> &Record,
2393 unsigned Abbrev) {
2394 Record.reserve(N->getElements().size() + 1);
2395 const uint64_t Version = 3 << 1;
2396 Record.push_back((uint64_t)N->isDistinct() | Version);
2397 Record.append(N->elements_begin(), N->elements_end());
2398
2399 Stream.EmitRecord(bitc::METADATA_EXPRESSION, Record, Abbrev);
2400 Record.clear();
2401}
2402
2403void ModuleBitcodeWriter::writeDIGlobalVariableExpression(
2404 const DIGlobalVariableExpression *N, SmallVectorImpl<uint64_t> &Record,
2405 unsigned Abbrev) {
2406 Record.push_back(N->isDistinct());
2407 Record.push_back(VE.getMetadataOrNullID(N->getVariable()));
2408 Record.push_back(VE.getMetadataOrNullID(N->getExpression()));
2409
2410 Stream.EmitRecord(bitc::METADATA_GLOBAL_VAR_EXPR, Record, Abbrev);
2411 Record.clear();
2412}
2413
2414void ModuleBitcodeWriter::writeDIObjCProperty(const DIObjCProperty *N,
2415 SmallVectorImpl<uint64_t> &Record,
2416 unsigned Abbrev) {
2417 Record.push_back(N->isDistinct());
2418 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2419 Record.push_back(VE.getMetadataOrNullID(N->getFile()));
2420 Record.push_back(N->getLine());
2421 Record.push_back(VE.getMetadataOrNullID(N->getRawSetterName()));
2422 Record.push_back(VE.getMetadataOrNullID(N->getRawGetterName()));
2423 Record.push_back(N->getAttributes());
2424 Record.push_back(VE.getMetadataOrNullID(N->getType()));
2425
2426 Stream.EmitRecord(bitc::METADATA_OBJC_PROPERTY, Record, Abbrev);
2427 Record.clear();
2428}
2429
2430void ModuleBitcodeWriter::writeDIImportedEntity(
2431 const DIImportedEntity *N, SmallVectorImpl<uint64_t> &Record,
2432 unsigned Abbrev) {
2433 Record.push_back(N->isDistinct());
2434 Record.push_back(N->getTag());
2435 Record.push_back(VE.getMetadataOrNullID(N->getScope()));
2436 Record.push_back(VE.getMetadataOrNullID(N->getEntity()));
2437 Record.push_back(N->getLine());
2438 Record.push_back(VE.getMetadataOrNullID(N->getRawName()));
2439 Record.push_back(VE.getMetadataOrNullID(N->getRawFile()));
2440 Record.push_back(VE.getMetadataOrNullID(N->getElements().get()));
2441
2442 Stream.EmitRecord(bitc::METADATA_IMPORTED_ENTITY, Record, Abbrev);
2443 Record.clear();
2444}
2445
2446unsigned ModuleBitcodeWriter::createNamedMetadataAbbrev() {
2447 auto Abbv = std::make_shared<BitCodeAbbrev>();
2448 Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_NAME));
2449 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2450 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));
2451 return Stream.EmitAbbrev(std::move(Abbv));
2452}
2453
2454void ModuleBitcodeWriter::writeNamedMetadata(
2455 SmallVectorImpl<uint64_t> &Record) {
2456 if (M.named_metadata_empty())
2457 return;
2458
2459 unsigned Abbrev = createNamedMetadataAbbrev();
2460 for (const NamedMDNode &NMD : M.named_metadata()) {
2461 // Write name.
2462 StringRef Str = NMD.getName();
2463 Record.append(Str.bytes_begin(), Str.bytes_end());
2464 Stream.EmitRecord(bitc::METADATA_NAME, Record, Abbrev);
2465 Record.clear();
2466
2467 // Write named metadata operands.
2468 for (const MDNode *N : NMD.operands())
2469 Record.push_back(VE.getMetadataID(N));
2470 Stream.EmitRecord(bitc::METADATA_NAMED_NODE, Record, 0);
2471 Record.clear();
2472 }
2473}
2474
2475unsigned ModuleBitcodeWriter::createMetadataStringsAbbrev() {
2476 auto Abbv = std::make_shared<BitCodeAbbrev>();
2477 Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_STRINGS));
2478 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of strings
2479 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // offset to chars
2480 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
2481 return Stream.EmitAbbrev(std::move(Abbv));
2482}
2483
2484/// Write out a record for MDString.
2485///
2486/// All the metadata strings in a metadata block are emitted in a single
2487/// record. The sizes and strings themselves are shoved into a blob.
2488void ModuleBitcodeWriter::writeMetadataStrings(
2489 ArrayRef<const Metadata *> Strings, SmallVectorImpl<uint64_t> &Record) {
2490 if (Strings.empty())
2491 return;
2492
2493 // Start the record with the number of strings.
2495 Record.push_back(Strings.size());
2496
2497 // Emit the sizes of the strings in the blob.
2498 SmallString<256> Blob;
2499 {
2500 BitstreamWriter W(Blob);
2501 for (const Metadata *MD : Strings)
2502 W.EmitVBR(cast<MDString>(MD)->getLength(), 6);
2503 W.FlushToWord();
2504 }
2505
2506 // Add the offset to the strings to the record.
2507 Record.push_back(Blob.size());
2508
2509 // Add the strings to the blob.
2510 for (const Metadata *MD : Strings)
2511 Blob.append(cast<MDString>(MD)->getString());
2512
2513 // Emit the final record.
2514 Stream.EmitRecordWithBlob(createMetadataStringsAbbrev(), Record, Blob);
2515 Record.clear();
2516}
2517
2518// Generates an enum to use as an index in the Abbrev array of Metadata record.
2519enum MetadataAbbrev : unsigned {
2520#define HANDLE_MDNODE_LEAF(CLASS) CLASS##AbbrevID,
2521#include "llvm/IR/Metadata.def"
2523};
2524
2525void ModuleBitcodeWriter::writeMetadataRecords(
2526 ArrayRef<const Metadata *> MDs, SmallVectorImpl<uint64_t> &Record,
2527 std::vector<unsigned> *MDAbbrevs, std::vector<uint64_t> *IndexPos) {
2528 if (MDs.empty())
2529 return;
2530
2531 // Initialize MDNode abbreviations.
2532#define HANDLE_MDNODE_LEAF(CLASS) unsigned CLASS##Abbrev = 0;
2533#include "llvm/IR/Metadata.def"
2534
2535 for (const Metadata *MD : MDs) {
2536 if (IndexPos)
2537 IndexPos->push_back(Stream.GetCurrentBitNo());
2538 if (const MDNode *N = dyn_cast<MDNode>(MD)) {
2539 assert(N->isResolved() && "Expected forward references to be resolved");
2540
2541 switch (N->getMetadataID()) {
2542 default:
2543 llvm_unreachable("Invalid MDNode subclass");
2544#define HANDLE_MDNODE_LEAF(CLASS) \
2545 case Metadata::CLASS##Kind: \
2546 if (MDAbbrevs) \
2547 write##CLASS(cast<CLASS>(N), Record, \
2548 (*MDAbbrevs)[MetadataAbbrev::CLASS##AbbrevID]); \
2549 else \
2550 write##CLASS(cast<CLASS>(N), Record, CLASS##Abbrev); \
2551 continue;
2552#include "llvm/IR/Metadata.def"
2553 }
2554 }
2555 if (auto *AL = dyn_cast<DIArgList>(MD)) {
2556 writeDIArgList(AL, Record);
2557 continue;
2558 }
2559 writeValueAsMetadata(cast<ValueAsMetadata>(MD), Record);
2560 }
2561}
2562
2563void ModuleBitcodeWriter::writeModuleMetadata() {
2564 if (!VE.hasMDs() && M.named_metadata_empty())
2565 return;
2566
2568 SmallVector<uint64_t, 64> Record;
2569
2570 // Emit all abbrevs upfront, so that the reader can jump in the middle of the
2571 // block and load any metadata.
2572 std::vector<unsigned> MDAbbrevs;
2573
2574 MDAbbrevs.resize(MetadataAbbrev::LastPlusOne);
2575 MDAbbrevs[MetadataAbbrev::DILocationAbbrevID] = createDILocationAbbrev();
2576 MDAbbrevs[MetadataAbbrev::GenericDINodeAbbrevID] =
2577 createGenericDINodeAbbrev();
2578
2579 auto Abbv = std::make_shared<BitCodeAbbrev>();
2580 Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_INDEX_OFFSET));
2581 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2582 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
2583 unsigned OffsetAbbrev = Stream.EmitAbbrev(std::move(Abbv));
2584
2585 Abbv = std::make_shared<BitCodeAbbrev>();
2586 Abbv->Add(BitCodeAbbrevOp(bitc::METADATA_INDEX));
2587 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2588 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
2589 unsigned IndexAbbrev = Stream.EmitAbbrev(std::move(Abbv));
2590
2591 // Emit MDStrings together upfront.
2592 writeMetadataStrings(VE.getMDStrings(), Record);
2593
2594 // We only emit an index for the metadata record if we have more than a given
2595 // (naive) threshold of metadatas, otherwise it is not worth it.
2596 if (VE.getNonMDStrings().size() > IndexThreshold) {
2597 // Write a placeholder value in for the offset of the metadata index,
2598 // which is written after the records, so that it can include
2599 // the offset of each entry. The placeholder offset will be
2600 // updated after all records are emitted.
2601 uint64_t Vals[] = {0, 0};
2602 Stream.EmitRecord(bitc::METADATA_INDEX_OFFSET, Vals, OffsetAbbrev);
2603 }
2604
2605 // Compute and save the bit offset to the current position, which will be
2606 // patched when we emit the index later. We can simply subtract the 64-bit
2607 // fixed size from the current bit number to get the location to backpatch.
2608 uint64_t IndexOffsetRecordBitPos = Stream.GetCurrentBitNo();
2609
2610 // This index will contain the bitpos for each individual record.
2611 std::vector<uint64_t> IndexPos;
2612 IndexPos.reserve(VE.getNonMDStrings().size());
2613
2614 // Write all the records
2615 writeMetadataRecords(VE.getNonMDStrings(), Record, &MDAbbrevs, &IndexPos);
2616
2617 if (VE.getNonMDStrings().size() > IndexThreshold) {
2618 // Now that we have emitted all the records we will emit the index. But
2619 // first
2620 // backpatch the forward reference so that the reader can skip the records
2621 // efficiently.
2622 Stream.BackpatchWord64(IndexOffsetRecordBitPos - 64,
2623 Stream.GetCurrentBitNo() - IndexOffsetRecordBitPos);
2624
2625 // Delta encode the index.
2626 uint64_t PreviousValue = IndexOffsetRecordBitPos;
2627 for (auto &Elt : IndexPos) {
2628 auto EltDelta = Elt - PreviousValue;
2629 PreviousValue = Elt;
2630 Elt = EltDelta;
2631 }
2632 // Emit the index record.
2633 Stream.EmitRecord(bitc::METADATA_INDEX, IndexPos, IndexAbbrev);
2634 IndexPos.clear();
2635 }
2636
2637 // Write the named metadata now.
2638 writeNamedMetadata(Record);
2639
2640 auto AddDeclAttachedMetadata = [&](const GlobalObject &GO) {
2641 SmallVector<uint64_t, 4> Record;
2642 Record.push_back(VE.getValueID(&GO));
2643 pushGlobalMetadataAttachment(Record, GO);
2645 };
2646 for (const Function &F : M)
2647 if (F.isDeclaration() && F.hasMetadata())
2648 AddDeclAttachedMetadata(F);
2649 for (const GlobalIFunc &GI : M.ifuncs())
2650 if (GI.hasMetadata())
2651 AddDeclAttachedMetadata(GI);
2652 // FIXME: Only store metadata for declarations here, and move data for global
2653 // variable definitions to a separate block (PR28134).
2654 for (const GlobalVariable &GV : M.globals())
2655 if (GV.hasMetadata())
2656 AddDeclAttachedMetadata(GV);
2657
2658 Stream.ExitBlock();
2659}
2660
2661void ModuleBitcodeWriter::writeFunctionMetadata(const Function &F) {
2662 if (!VE.hasMDs())
2663 return;
2664
2666 SmallVector<uint64_t, 64> Record;
2667 writeMetadataStrings(VE.getMDStrings(), Record);
2668 writeMetadataRecords(VE.getNonMDStrings(), Record);
2669 Stream.ExitBlock();
2670}
2671
2672void ModuleBitcodeWriter::pushGlobalMetadataAttachment(
2673 SmallVectorImpl<uint64_t> &Record, const GlobalObject &GO) {
2674 // [n x [id, mdnode]]
2676 GO.getAllMetadata(MDs);
2677 for (const auto &I : MDs) {
2678 Record.push_back(I.first);
2679 Record.push_back(VE.getMetadataID(I.second));
2680 }
2681}
2682
2683void ModuleBitcodeWriter::writeFunctionMetadataAttachment(const Function &F) {
2685
2686 SmallVector<uint64_t, 64> Record;
2687
2688 if (F.hasMetadata()) {
2689 pushGlobalMetadataAttachment(Record, F);
2690 Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);
2691 Record.clear();
2692 }
2693
2694 // Write metadata attachments
2695 // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]]
2697 for (const BasicBlock &BB : F)
2698 for (const Instruction &I : BB) {
2699 MDs.clear();
2700 I.getAllMetadataOtherThanDebugLoc(MDs);
2701
2702 // If no metadata, ignore instruction.
2703 if (MDs.empty()) continue;
2704
2705 Record.push_back(VE.getInstructionID(&I));
2706
2707 for (const auto &[ID, MD] : MDs) {
2708 Record.push_back(ID);
2709 Record.push_back(VE.getMetadataID(MD));
2710 }
2711 Stream.EmitRecord(bitc::METADATA_ATTACHMENT, Record, 0);
2712 Record.clear();
2713 }
2714
2715 Stream.ExitBlock();
2716}
2717
2718void ModuleBitcodeWriter::writeModuleMetadataKinds() {
2719 SmallVector<uint64_t, 64> Record;
2720
2721 // Write metadata kinds
2722 // METADATA_KIND - [n x [id, name]]
2724 M.getMDKindNames(Names);
2725
2726 if (Names.empty()) return;
2727
2729
2730 for (unsigned MDKindID = 0, e = Names.size(); MDKindID != e; ++MDKindID) {
2731 Record.push_back(MDKindID);
2732 StringRef KName = Names[MDKindID];
2733 Record.append(KName.begin(), KName.end());
2734
2735 Stream.EmitRecord(bitc::METADATA_KIND, Record, 0);
2736 Record.clear();
2737 }
2738
2739 Stream.ExitBlock();
2740}
2741
2742void ModuleBitcodeWriter::writeOperandBundleTags() {
2743 // Write metadata kinds
2744 //
2745 // OPERAND_BUNDLE_TAGS_BLOCK_ID : N x OPERAND_BUNDLE_TAG
2746 //
2747 // OPERAND_BUNDLE_TAG - [strchr x N]
2748
2750 M.getOperandBundleTags(Tags);
2751
2752 if (Tags.empty())
2753 return;
2754
2756
2757 SmallVector<uint64_t, 64> Record;
2758
2759 for (auto Tag : Tags) {
2760 Record.append(Tag.begin(), Tag.end());
2761
2762 Stream.EmitRecord(bitc::OPERAND_BUNDLE_TAG, Record, 0);
2763 Record.clear();
2764 }
2765
2766 Stream.ExitBlock();
2767}
2768
2769void ModuleBitcodeWriter::writeSyncScopeNames() {
2771 M.getContext().getSyncScopeNames(SSNs);
2772 if (SSNs.empty())
2773 return;
2774
2776
2777 SmallVector<uint64_t, 64> Record;
2778 for (auto SSN : SSNs) {
2779 Record.append(SSN.begin(), SSN.end());
2780 Stream.EmitRecord(bitc::SYNC_SCOPE_NAME, Record, 0);
2781 Record.clear();
2782 }
2783
2784 Stream.ExitBlock();
2785}
2786
2787void ModuleBitcodeWriter::writeConstants(unsigned FirstVal, unsigned LastVal,
2788 bool isGlobal) {
2789 if (FirstVal == LastVal) return;
2790
2792
2793 unsigned AggregateAbbrev = 0;
2794 unsigned String8Abbrev = 0;
2795 unsigned CString7Abbrev = 0;
2796 unsigned CString6Abbrev = 0;
2797 // If this is a constant pool for the module, emit module-specific abbrevs.
2798 if (isGlobal) {
2799 // Abbrev for CST_CODE_AGGREGATE.
2800 auto Abbv = std::make_shared<BitCodeAbbrev>();
2801 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_AGGREGATE));
2802 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2803 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, Log2_32_Ceil(LastVal+1)));
2804 AggregateAbbrev = Stream.EmitAbbrev(std::move(Abbv));
2805
2806 // Abbrev for CST_CODE_STRING.
2807 Abbv = std::make_shared<BitCodeAbbrev>();
2808 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_STRING));
2809 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2810 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));
2811 String8Abbrev = Stream.EmitAbbrev(std::move(Abbv));
2812 // Abbrev for CST_CODE_CSTRING.
2813 Abbv = std::make_shared<BitCodeAbbrev>();
2814 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING));
2815 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2816 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));
2817 CString7Abbrev = Stream.EmitAbbrev(std::move(Abbv));
2818 // Abbrev for CST_CODE_CSTRING.
2819 Abbv = std::make_shared<BitCodeAbbrev>();
2820 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CSTRING));
2821 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
2822 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));
2823 CString6Abbrev = Stream.EmitAbbrev(std::move(Abbv));
2824 }
2825
2826 SmallVector<uint64_t, 64> Record;
2827
2828 const ValueEnumerator::ValueList &Vals = VE.getValues();
2829 Type *LastTy = nullptr;
2830 for (unsigned i = FirstVal; i != LastVal; ++i) {
2831 const Value *V = Vals[i].first;
2832 // If we need to switch types, do so now.
2833 if (V->getType() != LastTy) {
2834 LastTy = V->getType();
2835 Record.push_back(VE.getTypeID(LastTy));
2836 Stream.EmitRecord(bitc::CST_CODE_SETTYPE, Record,
2837 CONSTANTS_SETTYPE_ABBREV);
2838 Record.clear();
2839 }
2840
2841 if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {
2842 Record.push_back(VE.getTypeID(IA->getFunctionType()));
2843 Record.push_back(
2844 unsigned(IA->hasSideEffects()) | unsigned(IA->isAlignStack()) << 1 |
2845 unsigned(IA->getDialect() & 1) << 2 | unsigned(IA->canThrow()) << 3);
2846
2847 // Add the asm string.
2848 StringRef AsmStr = IA->getAsmString();
2849 Record.push_back(AsmStr.size());
2850 Record.append(AsmStr.begin(), AsmStr.end());
2851
2852 // Add the constraint string.
2853 StringRef ConstraintStr = IA->getConstraintString();
2854 Record.push_back(ConstraintStr.size());
2855 Record.append(ConstraintStr.begin(), ConstraintStr.end());
2856 Stream.EmitRecord(bitc::CST_CODE_INLINEASM, Record);
2857 Record.clear();
2858 continue;
2859 }
2860 const Constant *C = cast<Constant>(V);
2861 unsigned Code = -1U;
2862 unsigned AbbrevToUse = 0;
2863 if (C->isNullValue()) {
2865 } else if (isa<PoisonValue>(C)) {
2867 } else if (isa<UndefValue>(C)) {
2869 } else if (const ConstantInt *IV = dyn_cast<ConstantInt>(C)) {
2870 if (IV->getBitWidth() <= 64) {
2871 uint64_t V = IV->getSExtValue();
2872 emitSignedInt64(Record, V);
2874 AbbrevToUse = CONSTANTS_INTEGER_ABBREV;
2875 } else { // Wide integers, > 64 bits in size.
2876 emitWideAPInt(Record, IV->getValue());
2878 }
2879 } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(C)) {
2881 Type *Ty = CFP->getType()->getScalarType();
2882 if (Ty->isHalfTy() || Ty->isBFloatTy() || Ty->isFloatTy() ||
2883 Ty->isDoubleTy()) {
2884 Record.push_back(CFP->getValueAPF().bitcastToAPInt().getZExtValue());
2885 } else if (Ty->isX86_FP80Ty()) {
2886 // api needed to prevent premature destruction
2887 // bits are not in the same order as a normal i80 APInt, compensate.
2888 APInt api = CFP->getValueAPF().bitcastToAPInt();
2889 const uint64_t *p = api.getRawData();
2890 Record.push_back((p[1] << 48) | (p[0] >> 16));
2891 Record.push_back(p[0] & 0xffffLL);
2892 } else if (Ty->isFP128Ty() || Ty->isPPC_FP128Ty()) {
2893 APInt api = CFP->getValueAPF().bitcastToAPInt();
2894 const uint64_t *p = api.getRawData();
2895 Record.push_back(p[0]);
2896 Record.push_back(p[1]);
2897 } else {
2898 assert(0 && "Unknown FP type!");
2899 }
2900 } else if (isa<ConstantDataSequential>(C) &&
2901 cast<ConstantDataSequential>(C)->isString()) {
2902 const ConstantDataSequential *Str = cast<ConstantDataSequential>(C);
2903 // Emit constant strings specially.
2904 uint64_t NumElts = Str->getNumElements();
2905 // If this is a null-terminated string, use the denser CSTRING encoding.
2906 if (Str->isCString()) {
2908 --NumElts; // Don't encode the null, which isn't allowed by char6.
2909 } else {
2911 AbbrevToUse = String8Abbrev;
2912 }
2913 bool isCStr7 = Code == bitc::CST_CODE_CSTRING;
2914 bool isCStrChar6 = Code == bitc::CST_CODE_CSTRING;
2915 for (uint64_t i = 0; i != NumElts; ++i) {
2916 unsigned char V = Str->getElementAsInteger(i);
2917 Record.push_back(V);
2918 isCStr7 &= (V & 128) == 0;
2919 if (isCStrChar6)
2920 isCStrChar6 = BitCodeAbbrevOp::isChar6(V);
2921 }
2922
2923 if (isCStrChar6)
2924 AbbrevToUse = CString6Abbrev;
2925 else if (isCStr7)
2926 AbbrevToUse = CString7Abbrev;
2927 } else if (const ConstantDataSequential *CDS =
2930 Type *EltTy = CDS->getElementType();
2931 if (isa<IntegerType>(EltTy)) {
2932 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
2933 Record.push_back(CDS->getElementAsInteger(i));
2934 } else {
2935 for (uint64_t i = 0, e = CDS->getNumElements(); i != e; ++i)
2936 Record.push_back(
2937 CDS->getElementAsAPFloat(i).bitcastToAPInt().getLimitedValue());
2938 }
2939 } else if (isa<ConstantAggregate>(C)) {
2941 for (const Value *Op : C->operands())
2942 Record.push_back(VE.getValueID(Op));
2943 AbbrevToUse = AggregateAbbrev;
2944 } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) {
2945 switch (CE->getOpcode()) {
2946 default:
2947 if (Instruction::isCast(CE->getOpcode())) {
2949 Record.push_back(getEncodedCastOpcode(CE->getOpcode()));
2950 Record.push_back(VE.getTypeID(C->getOperand(0)->getType()));
2951 Record.push_back(VE.getValueID(C->getOperand(0)));
2952 AbbrevToUse = CONSTANTS_CE_CAST_Abbrev;
2953 } else {
2954 assert(CE->getNumOperands() == 2 && "Unknown constant expr!");
2956 Record.push_back(getEncodedBinaryOpcode(CE->getOpcode()));
2957 Record.push_back(VE.getValueID(C->getOperand(0)));
2958 Record.push_back(VE.getValueID(C->getOperand(1)));
2959 uint64_t Flags = getOptimizationFlags(CE);
2960 if (Flags != 0)
2961 Record.push_back(Flags);
2962 }
2963 break;
2964 case Instruction::FNeg: {
2965 assert(CE->getNumOperands() == 1 && "Unknown constant expr!");
2967 Record.push_back(getEncodedUnaryOpcode(CE->getOpcode()));
2968 Record.push_back(VE.getValueID(C->getOperand(0)));
2969 uint64_t Flags = getOptimizationFlags(CE);
2970 if (Flags != 0)
2971 Record.push_back(Flags);
2972 break;
2973 }
2974 case Instruction::GetElementPtr: {
2976 const auto *GO = cast<GEPOperator>(C);
2977 Record.push_back(VE.getTypeID(GO->getSourceElementType()));
2978 Record.push_back(getOptimizationFlags(GO));
2979 if (std::optional<ConstantRange> Range = GO->getInRange()) {
2981 emitConstantRange(Record, *Range, /*EmitBitWidth=*/true);
2982 }
2983 for (const Value *Op : CE->operands()) {
2984 Record.push_back(VE.getTypeID(Op->getType()));
2985 Record.push_back(VE.getValueID(Op));
2986 }
2987 break;
2988 }
2989 case Instruction::ExtractElement:
2991 Record.push_back(VE.getTypeID(C->getOperand(0)->getType()));
2992 Record.push_back(VE.getValueID(C->getOperand(0)));
2993 Record.push_back(VE.getTypeID(C->getOperand(1)->getType()));
2994 Record.push_back(VE.getValueID(C->getOperand(1)));
2995 break;
2996 case Instruction::InsertElement:
2998 Record.push_back(VE.getValueID(C->getOperand(0)));
2999 Record.push_back(VE.getValueID(C->getOperand(1)));
3000 Record.push_back(VE.getTypeID(C->getOperand(2)->getType()));
3001 Record.push_back(VE.getValueID(C->getOperand(2)));
3002 break;
3003 case Instruction::ShuffleVector:
3004 // If the return type and argument types are the same, this is a
3005 // standard shufflevector instruction. If the types are different,
3006 // then the shuffle is widening or truncating the input vectors, and
3007 // the argument type must also be encoded.
3008 if (C->getType() == C->getOperand(0)->getType()) {
3010 } else {
3012 Record.push_back(VE.getTypeID(C->getOperand(0)->getType()));
3013 }
3014 Record.push_back(VE.getValueID(C->getOperand(0)));
3015 Record.push_back(VE.getValueID(C->getOperand(1)));
3016 Record.push_back(VE.getValueID(CE->getShuffleMaskForBitcode()));
3017 break;
3018 }
3019 } else if (const BlockAddress *BA = dyn_cast<BlockAddress>(C)) {
3021 Record.push_back(VE.getTypeID(BA->getFunction()->getType()));
3022 Record.push_back(VE.getValueID(BA->getFunction()));
3023 Record.push_back(VE.getGlobalBasicBlockID(BA->getBasicBlock()));
3024 } else if (const auto *Equiv = dyn_cast<DSOLocalEquivalent>(C)) {
3026 Record.push_back(VE.getTypeID(Equiv->getGlobalValue()->getType()));
3027 Record.push_back(VE.getValueID(Equiv->getGlobalValue()));
3028 } else if (const auto *NC = dyn_cast<NoCFIValue>(C)) {
3030 Record.push_back(VE.getTypeID(NC->getGlobalValue()->getType()));
3031 Record.push_back(VE.getValueID(NC->getGlobalValue()));
3032 } else if (const auto *CPA = dyn_cast<ConstantPtrAuth>(C)) {
3034 Record.push_back(VE.getValueID(CPA->getPointer()));
3035 Record.push_back(VE.getValueID(CPA->getKey()));
3036 Record.push_back(VE.getValueID(CPA->getDiscriminator()));
3037 Record.push_back(VE.getValueID(CPA->getAddrDiscriminator()));
3038 Record.push_back(VE.getValueID(CPA->getDeactivationSymbol()));
3039 } else {
3040#ifndef NDEBUG
3041 C->dump();
3042#endif
3043 llvm_unreachable("Unknown constant!");
3044 }
3045 Stream.EmitRecord(Code, Record, AbbrevToUse);
3046 Record.clear();
3047 }
3048
3049 Stream.ExitBlock();
3050}
3051
3052void ModuleBitcodeWriter::writeModuleConstants() {
3053 const ValueEnumerator::ValueList &Vals = VE.getValues();
3054
3055 // Find the first constant to emit, which is the first non-globalvalue value.
3056 // We know globalvalues have been emitted by WriteModuleInfo.
3057 for (unsigned i = 0, e = Vals.size(); i != e; ++i) {
3058 if (!isa<GlobalValue>(Vals[i].first)) {
3059 writeConstants(i, Vals.size(), true);
3060 return;
3061 }
3062 }
3063}
3064
3065/// pushValueAndType - The file has to encode both the value and type id for
3066/// many values, because we need to know what type to create for forward
3067/// references. However, most operands are not forward references, so this type
3068/// field is not needed.
3069///
3070/// This function adds V's value ID to Vals. If the value ID is higher than the
3071/// instruction ID, then it is a forward reference, and it also includes the
3072/// type ID. The value ID that is written is encoded relative to the InstID.
3073bool ModuleBitcodeWriter::pushValueAndType(const Value *V, unsigned InstID,
3074 SmallVectorImpl<unsigned> &Vals) {
3075 unsigned ValID = VE.getValueID(V);
3076 // Make encoding relative to the InstID.
3077 Vals.push_back(InstID - ValID);
3078 if (ValID >= InstID) {
3079 Vals.push_back(VE.getTypeID(V->getType()));
3080 return true;
3081 }
3082 return false;
3083}
3084
3085bool ModuleBitcodeWriter::pushValueOrMetadata(const Value *V, unsigned InstID,
3086 SmallVectorImpl<unsigned> &Vals) {
3087 bool IsMetadata = V->getType()->isMetadataTy();
3088 if (IsMetadata) {
3090 Metadata *MD = cast<MetadataAsValue>(V)->getMetadata();
3091 unsigned ValID = VE.getMetadataID(MD);
3092 Vals.push_back(InstID - ValID);
3093 return false;
3094 }
3095 return pushValueAndType(V, InstID, Vals);
3096}
3097
3098void ModuleBitcodeWriter::writeOperandBundles(const CallBase &CS,
3099 unsigned InstID) {
3101 LLVMContext &C = CS.getContext();
3102
3103 for (unsigned i = 0, e = CS.getNumOperandBundles(); i != e; ++i) {
3104 const auto &Bundle = CS.getOperandBundleAt(i);
3105 Record.push_back(C.getOperandBundleTagID(Bundle.getTagName()));
3106
3107 for (auto &Input : Bundle.Inputs)
3108 pushValueOrMetadata(Input, InstID, Record);
3109
3111 Record.clear();
3112 }
3113}
3114
3115/// pushValue - Like pushValueAndType, but where the type of the value is
3116/// omitted (perhaps it was already encoded in an earlier operand).
3117void ModuleBitcodeWriter::pushValue(const Value *V, unsigned InstID,
3118 SmallVectorImpl<unsigned> &Vals) {
3119 unsigned ValID = VE.getValueID(V);
3120 Vals.push_back(InstID - ValID);
3121}
3122
3123void ModuleBitcodeWriter::pushValueSigned(const Value *V, unsigned InstID,
3124 SmallVectorImpl<uint64_t> &Vals) {
3125 unsigned ValID = VE.getValueID(V);
3126 int64_t diff = ((int32_t)InstID - (int32_t)ValID);
3127 emitSignedInt64(Vals, diff);
3128}
3129
3130/// WriteInstruction - Emit an instruction to the specified stream.
3131void ModuleBitcodeWriter::writeInstruction(const Instruction &I,
3132 unsigned InstID,
3133 SmallVectorImpl<unsigned> &Vals) {
3134 unsigned Code = 0;
3135 unsigned AbbrevToUse = 0;
3136 VE.setInstructionID(&I);
3137 switch (I.getOpcode()) {
3138 default:
3139 if (Instruction::isCast(I.getOpcode())) {
3141 if (!pushValueAndType(I.getOperand(0), InstID, Vals))
3142 AbbrevToUse = FUNCTION_INST_CAST_ABBREV;
3143 Vals.push_back(VE.getTypeID(I.getType()));
3144 Vals.push_back(getEncodedCastOpcode(I.getOpcode()));
3145 uint64_t Flags = getOptimizationFlags(&I);
3146 if (Flags != 0) {
3147 if (AbbrevToUse == FUNCTION_INST_CAST_ABBREV)
3148 AbbrevToUse = FUNCTION_INST_CAST_FLAGS_ABBREV;
3149 Vals.push_back(Flags);
3150 }
3151 } else {
3152 assert(isa<BinaryOperator>(I) && "Unknown instruction!");
3154 if (!pushValueAndType(I.getOperand(0), InstID, Vals))
3155 AbbrevToUse = FUNCTION_INST_BINOP_ABBREV;
3156 pushValue(I.getOperand(1), InstID, Vals);
3157 Vals.push_back(getEncodedBinaryOpcode(I.getOpcode()));
3158 uint64_t Flags = getOptimizationFlags(&I);
3159 if (Flags != 0) {
3160 if (AbbrevToUse == FUNCTION_INST_BINOP_ABBREV)
3161 AbbrevToUse = FUNCTION_INST_BINOP_FLAGS_ABBREV;
3162 Vals.push_back(Flags);
3163 }
3164 }
3165 break;
3166 case Instruction::FNeg: {
3168 if (!pushValueAndType(I.getOperand(0), InstID, Vals))
3169 AbbrevToUse = FUNCTION_INST_UNOP_ABBREV;
3170 Vals.push_back(getEncodedUnaryOpcode(I.getOpcode()));
3171 uint64_t Flags = getOptimizationFlags(&I);
3172 if (Flags != 0) {
3173 if (AbbrevToUse == FUNCTION_INST_UNOP_ABBREV)
3174 AbbrevToUse = FUNCTION_INST_UNOP_FLAGS_ABBREV;
3175 Vals.push_back(Flags);
3176 }
3177 break;
3178 }
3179 case Instruction::GetElementPtr: {
3181 AbbrevToUse = FUNCTION_INST_GEP_ABBREV;
3182 auto &GEPInst = cast<GetElementPtrInst>(I);
3184 Vals.push_back(VE.getTypeID(GEPInst.getSourceElementType()));
3185 for (const Value *Op : I.operands())
3186 pushValueAndType(Op, InstID, Vals);
3187 break;
3188 }
3189 case Instruction::ExtractValue: {
3191 pushValueAndType(I.getOperand(0), InstID, Vals);
3192 const ExtractValueInst *EVI = cast<ExtractValueInst>(&I);
3193 Vals.append(EVI->idx_begin(), EVI->idx_end());
3194 break;
3195 }
3196 case Instruction::InsertValue: {
3198 pushValueAndType(I.getOperand(0), InstID, Vals);
3199 pushValueAndType(I.getOperand(1), InstID, Vals);
3200 const InsertValueInst *IVI = cast<InsertValueInst>(&I);
3201 Vals.append(IVI->idx_begin(), IVI->idx_end());
3202 break;
3203 }
3204 case Instruction::Select: {
3206 pushValueAndType(I.getOperand(1), InstID, Vals);
3207 pushValue(I.getOperand(2), InstID, Vals);
3208 pushValueAndType(I.getOperand(0), InstID, Vals);
3209 uint64_t Flags = getOptimizationFlags(&I);
3210 if (Flags != 0)
3211 Vals.push_back(Flags);
3212 break;
3213 }
3214 case Instruction::ExtractElement:
3216 pushValueAndType(I.getOperand(0), InstID, Vals);
3217 pushValueAndType(I.getOperand(1), InstID, Vals);
3218 break;
3219 case Instruction::InsertElement:
3221 pushValueAndType(I.getOperand(0), InstID, Vals);
3222 pushValue(I.getOperand(1), InstID, Vals);
3223 pushValueAndType(I.getOperand(2), InstID, Vals);
3224 break;
3225 case Instruction::ShuffleVector:
3227 pushValueAndType(I.getOperand(0), InstID, Vals);
3228 pushValue(I.getOperand(1), InstID, Vals);
3229 pushValue(cast<ShuffleVectorInst>(I).getShuffleMaskForBitcode(), InstID,
3230 Vals);
3231 break;
3232 case Instruction::ICmp:
3233 case Instruction::FCmp: {
3234 // compare returning Int1Ty or vector of Int1Ty
3236 AbbrevToUse = FUNCTION_INST_CMP_ABBREV;
3237 if (pushValueAndType(I.getOperand(0), InstID, Vals))
3238 AbbrevToUse = 0;
3239 pushValue(I.getOperand(1), InstID, Vals);
3241 uint64_t Flags = getOptimizationFlags(&I);
3242 if (Flags != 0) {
3243 Vals.push_back(Flags);
3244 if (AbbrevToUse)
3245 AbbrevToUse = FUNCTION_INST_CMP_FLAGS_ABBREV;
3246 }
3247 break;
3248 }
3249
3250 case Instruction::Ret:
3251 {
3253 unsigned NumOperands = I.getNumOperands();
3254 if (NumOperands == 0)
3255 AbbrevToUse = FUNCTION_INST_RET_VOID_ABBREV;
3256 else if (NumOperands == 1) {
3257 if (!pushValueAndType(I.getOperand(0), InstID, Vals))
3258 AbbrevToUse = FUNCTION_INST_RET_VAL_ABBREV;
3259 } else {
3260 for (const Value *Op : I.operands())
3261 pushValueAndType(Op, InstID, Vals);
3262 }
3263 }
3264 break;
3265 case Instruction::Br:
3266 {
3268 AbbrevToUse = FUNCTION_INST_BR_UNCOND_ABBREV;
3269 const BranchInst &II = cast<BranchInst>(I);
3270 Vals.push_back(VE.getValueID(II.getSuccessor(0)));
3271 if (II.isConditional()) {
3272 Vals.push_back(VE.getValueID(II.getSuccessor(1)));
3273 pushValue(II.getCondition(), InstID, Vals);
3274 AbbrevToUse = FUNCTION_INST_BR_COND_ABBREV;
3275 }
3276 }
3277 break;
3278 case Instruction::Switch:
3279 {
3281 const SwitchInst &SI = cast<SwitchInst>(I);
3282 Vals.push_back(VE.getTypeID(SI.getCondition()->getType()));
3283 pushValue(SI.getCondition(), InstID, Vals);
3284 Vals.push_back(VE.getValueID(SI.getDefaultDest()));
3285 for (auto Case : SI.cases()) {
3286 Vals.push_back(VE.getValueID(Case.getCaseValue()));
3287 Vals.push_back(VE.getValueID(Case.getCaseSuccessor()));
3288 }
3289 }
3290 break;
3291 case Instruction::IndirectBr:
3293 Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
3294 // Encode the address operand as relative, but not the basic blocks.
3295 pushValue(I.getOperand(0), InstID, Vals);
3296 for (const Value *Op : drop_begin(I.operands()))
3297 Vals.push_back(VE.getValueID(Op));
3298 break;
3299
3300 case Instruction::Invoke: {
3301 const InvokeInst *II = cast<InvokeInst>(&I);
3302 const Value *Callee = II->getCalledOperand();
3303 FunctionType *FTy = II->getFunctionType();
3304
3305 if (II->hasOperandBundles())
3306 writeOperandBundles(*II, InstID);
3307
3309
3310 Vals.push_back(VE.getAttributeListID(II->getAttributes()));
3311 Vals.push_back(II->getCallingConv() | 1 << 13);
3312 Vals.push_back(VE.getValueID(II->getNormalDest()));
3313 Vals.push_back(VE.getValueID(II->getUnwindDest()));
3314 Vals.push_back(VE.getTypeID(FTy));
3315 pushValueAndType(Callee, InstID, Vals);
3316
3317 // Emit value #'s for the fixed parameters.
3318 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3319 pushValue(I.getOperand(i), InstID, Vals); // fixed param.
3320
3321 // Emit type/value pairs for varargs params.
3322 if (FTy->isVarArg()) {
3323 for (unsigned i = FTy->getNumParams(), e = II->arg_size(); i != e; ++i)
3324 pushValueAndType(I.getOperand(i), InstID, Vals); // vararg
3325 }
3326 break;
3327 }
3328 case Instruction::Resume:
3330 pushValueAndType(I.getOperand(0), InstID, Vals);
3331 break;
3332 case Instruction::CleanupRet: {
3334 const auto &CRI = cast<CleanupReturnInst>(I);
3335 pushValue(CRI.getCleanupPad(), InstID, Vals);
3336 if (CRI.hasUnwindDest())
3337 Vals.push_back(VE.getValueID(CRI.getUnwindDest()));
3338 break;
3339 }
3340 case Instruction::CatchRet: {
3342 const auto &CRI = cast<CatchReturnInst>(I);
3343 pushValue(CRI.getCatchPad(), InstID, Vals);
3344 Vals.push_back(VE.getValueID(CRI.getSuccessor()));
3345 break;
3346 }
3347 case Instruction::CleanupPad:
3348 case Instruction::CatchPad: {
3349 const auto &FuncletPad = cast<FuncletPadInst>(I);
3352 pushValue(FuncletPad.getParentPad(), InstID, Vals);
3353
3354 unsigned NumArgOperands = FuncletPad.arg_size();
3355 Vals.push_back(NumArgOperands);
3356 for (unsigned Op = 0; Op != NumArgOperands; ++Op)
3357 pushValueAndType(FuncletPad.getArgOperand(Op), InstID, Vals);
3358 break;
3359 }
3360 case Instruction::CatchSwitch: {
3362 const auto &CatchSwitch = cast<CatchSwitchInst>(I);
3363
3364 pushValue(CatchSwitch.getParentPad(), InstID, Vals);
3365
3366 unsigned NumHandlers = CatchSwitch.getNumHandlers();
3367 Vals.push_back(NumHandlers);
3368 for (const BasicBlock *CatchPadBB : CatchSwitch.handlers())
3369 Vals.push_back(VE.getValueID(CatchPadBB));
3370
3371 if (CatchSwitch.hasUnwindDest())
3372 Vals.push_back(VE.getValueID(CatchSwitch.getUnwindDest()));
3373 break;
3374 }
3375 case Instruction::CallBr: {
3376 const CallBrInst *CBI = cast<CallBrInst>(&I);
3377 const Value *Callee = CBI->getCalledOperand();
3378 FunctionType *FTy = CBI->getFunctionType();
3379
3380 if (CBI->hasOperandBundles())
3381 writeOperandBundles(*CBI, InstID);
3382
3384
3386
3389
3390 Vals.push_back(VE.getValueID(CBI->getDefaultDest()));
3391 Vals.push_back(CBI->getNumIndirectDests());
3392 for (unsigned i = 0, e = CBI->getNumIndirectDests(); i != e; ++i)
3393 Vals.push_back(VE.getValueID(CBI->getIndirectDest(i)));
3394
3395 Vals.push_back(VE.getTypeID(FTy));
3396 pushValueAndType(Callee, InstID, Vals);
3397
3398 // Emit value #'s for the fixed parameters.
3399 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3400 pushValue(I.getOperand(i), InstID, Vals); // fixed param.
3401
3402 // Emit type/value pairs for varargs params.
3403 if (FTy->isVarArg()) {
3404 for (unsigned i = FTy->getNumParams(), e = CBI->arg_size(); i != e; ++i)
3405 pushValueAndType(I.getOperand(i), InstID, Vals); // vararg
3406 }
3407 break;
3408 }
3409 case Instruction::Unreachable:
3411 AbbrevToUse = FUNCTION_INST_UNREACHABLE_ABBREV;
3412 break;
3413
3414 case Instruction::PHI: {
3415 const PHINode &PN = cast<PHINode>(I);
3417 // With the newer instruction encoding, forward references could give
3418 // negative valued IDs. This is most common for PHIs, so we use
3419 // signed VBRs.
3421 Vals64.push_back(VE.getTypeID(PN.getType()));
3422 for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i) {
3423 pushValueSigned(PN.getIncomingValue(i), InstID, Vals64);
3424 Vals64.push_back(VE.getValueID(PN.getIncomingBlock(i)));
3425 }
3426
3427 uint64_t Flags = getOptimizationFlags(&I);
3428 if (Flags != 0)
3429 Vals64.push_back(Flags);
3430
3431 // Emit a Vals64 vector and exit.
3432 Stream.EmitRecord(Code, Vals64, AbbrevToUse);
3433 Vals64.clear();
3434 return;
3435 }
3436
3437 case Instruction::LandingPad: {
3438 const LandingPadInst &LP = cast<LandingPadInst>(I);
3440 Vals.push_back(VE.getTypeID(LP.getType()));
3441 Vals.push_back(LP.isCleanup());
3442 Vals.push_back(LP.getNumClauses());
3443 for (unsigned I = 0, E = LP.getNumClauses(); I != E; ++I) {
3444 if (LP.isCatch(I))
3446 else
3448 pushValueAndType(LP.getClause(I), InstID, Vals);
3449 }
3450 break;
3451 }
3452
3453 case Instruction::Alloca: {
3455 const AllocaInst &AI = cast<AllocaInst>(I);
3456 Vals.push_back(VE.getTypeID(AI.getAllocatedType()));
3457 Vals.push_back(VE.getTypeID(I.getOperand(0)->getType()));
3458 Vals.push_back(VE.getValueID(I.getOperand(0))); // size.
3459 using APV = AllocaPackedValues;
3460 unsigned Record = 0;
3461 unsigned EncodedAlign = getEncodedAlign(AI.getAlign());
3463 Record, EncodedAlign & ((1 << APV::AlignLower::Bits) - 1));
3465 EncodedAlign >> APV::AlignLower::Bits);
3469 Vals.push_back(Record);
3470
3471 unsigned AS = AI.getAddressSpace();
3472 if (AS != M.getDataLayout().getAllocaAddrSpace())
3473 Vals.push_back(AS);
3474 break;
3475 }
3476
3477 case Instruction::Load:
3478 if (cast<LoadInst>(I).isAtomic()) {
3480 pushValueAndType(I.getOperand(0), InstID, Vals);
3481 } else {
3483 if (!pushValueAndType(I.getOperand(0), InstID, Vals)) // ptr
3484 AbbrevToUse = FUNCTION_INST_LOAD_ABBREV;
3485 }
3486 Vals.push_back(VE.getTypeID(I.getType()));
3487 Vals.push_back(getEncodedAlign(cast<LoadInst>(I).getAlign()));
3488 Vals.push_back(cast<LoadInst>(I).isVolatile());
3489 if (cast<LoadInst>(I).isAtomic()) {
3490 Vals.push_back(getEncodedOrdering(cast<LoadInst>(I).getOrdering()));
3491 Vals.push_back(getEncodedSyncScopeID(cast<LoadInst>(I).getSyncScopeID()));
3492 }
3493 break;
3494 case Instruction::Store:
3495 if (cast<StoreInst>(I).isAtomic()) {
3497 } else {
3499 AbbrevToUse = FUNCTION_INST_STORE_ABBREV;
3500 }
3501 if (pushValueAndType(I.getOperand(1), InstID, Vals)) // ptrty + ptr
3502 AbbrevToUse = 0;
3503 if (pushValueAndType(I.getOperand(0), InstID, Vals)) // valty + val
3504 AbbrevToUse = 0;
3505 Vals.push_back(getEncodedAlign(cast<StoreInst>(I).getAlign()));
3506 Vals.push_back(cast<StoreInst>(I).isVolatile());
3507 if (cast<StoreInst>(I).isAtomic()) {
3508 Vals.push_back(getEncodedOrdering(cast<StoreInst>(I).getOrdering()));
3509 Vals.push_back(
3510 getEncodedSyncScopeID(cast<StoreInst>(I).getSyncScopeID()));
3511 }
3512 break;
3513 case Instruction::AtomicCmpXchg:
3515 pushValueAndType(I.getOperand(0), InstID, Vals); // ptrty + ptr
3516 pushValueAndType(I.getOperand(1), InstID, Vals); // cmp.
3517 pushValue(I.getOperand(2), InstID, Vals); // newval.
3518 Vals.push_back(cast<AtomicCmpXchgInst>(I).isVolatile());
3519 Vals.push_back(
3520 getEncodedOrdering(cast<AtomicCmpXchgInst>(I).getSuccessOrdering()));
3521 Vals.push_back(
3522 getEncodedSyncScopeID(cast<AtomicCmpXchgInst>(I).getSyncScopeID()));
3523 Vals.push_back(
3524 getEncodedOrdering(cast<AtomicCmpXchgInst>(I).getFailureOrdering()));
3525 Vals.push_back(cast<AtomicCmpXchgInst>(I).isWeak());
3526 Vals.push_back(getEncodedAlign(cast<AtomicCmpXchgInst>(I).getAlign()));
3527 break;
3528 case Instruction::AtomicRMW:
3530 pushValueAndType(I.getOperand(0), InstID, Vals); // ptrty + ptr
3531 pushValueAndType(I.getOperand(1), InstID, Vals); // valty + val
3532 Vals.push_back(
3534 Vals.push_back(cast<AtomicRMWInst>(I).isVolatile());
3535 Vals.push_back(getEncodedOrdering(cast<AtomicRMWInst>(I).getOrdering()));
3536 Vals.push_back(
3537 getEncodedSyncScopeID(cast<AtomicRMWInst>(I).getSyncScopeID()));
3538 Vals.push_back(getEncodedAlign(cast<AtomicRMWInst>(I).getAlign()));
3539 break;
3540 case Instruction::Fence:
3542 Vals.push_back(getEncodedOrdering(cast<FenceInst>(I).getOrdering()));
3543 Vals.push_back(getEncodedSyncScopeID(cast<FenceInst>(I).getSyncScopeID()));
3544 break;
3545 case Instruction::Call: {
3546 const CallInst &CI = cast<CallInst>(I);
3547 FunctionType *FTy = CI.getFunctionType();
3548
3549 if (CI.hasOperandBundles())
3550 writeOperandBundles(CI, InstID);
3551
3553
3555
3556 unsigned Flags = getOptimizationFlags(&I);
3558 unsigned(CI.isTailCall()) << bitc::CALL_TAIL |
3559 unsigned(CI.isMustTailCall()) << bitc::CALL_MUSTTAIL |
3561 unsigned(CI.isNoTailCall()) << bitc::CALL_NOTAIL |
3562 unsigned(Flags != 0) << bitc::CALL_FMF);
3563 if (Flags != 0)
3564 Vals.push_back(Flags);
3565
3566 Vals.push_back(VE.getTypeID(FTy));
3567 pushValueAndType(CI.getCalledOperand(), InstID, Vals); // Callee
3568
3569 // Emit value #'s for the fixed parameters.
3570 for (unsigned i = 0, e = FTy->getNumParams(); i != e; ++i)
3571 pushValue(CI.getArgOperand(i), InstID, Vals); // fixed param.
3572
3573 // Emit type/value pairs for varargs params.
3574 if (FTy->isVarArg()) {
3575 for (unsigned i = FTy->getNumParams(), e = CI.arg_size(); i != e; ++i)
3576 pushValueAndType(CI.getArgOperand(i), InstID, Vals); // varargs
3577 }
3578 break;
3579 }
3580 case Instruction::VAArg:
3582 Vals.push_back(VE.getTypeID(I.getOperand(0)->getType())); // valistty
3583 pushValue(I.getOperand(0), InstID, Vals); // valist.
3584 Vals.push_back(VE.getTypeID(I.getType())); // restype.
3585 break;
3586 case Instruction::Freeze:
3588 pushValueAndType(I.getOperand(0), InstID, Vals);
3589 break;
3590 }
3591
3592 Stream.EmitRecord(Code, Vals, AbbrevToUse);
3593 Vals.clear();
3594}
3595
3596/// Write a GlobalValue VST to the module. The purpose of this data structure is
3597/// to allow clients to efficiently find the function body.
3598void ModuleBitcodeWriter::writeGlobalValueSymbolTable(
3599 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3600 // Get the offset of the VST we are writing, and backpatch it into
3601 // the VST forward declaration record.
3602 uint64_t VSTOffset = Stream.GetCurrentBitNo();
3603 // The BitcodeStartBit was the stream offset of the identification block.
3604 VSTOffset -= bitcodeStartBit();
3605 assert((VSTOffset & 31) == 0 && "VST block not 32-bit aligned");
3606 // Note that we add 1 here because the offset is relative to one word
3607 // before the start of the identification block, which was historically
3608 // always the start of the regular bitcode header.
3609 Stream.BackpatchWord(VSTOffsetPlaceholder, VSTOffset / 32 + 1);
3610
3612
3613 auto Abbv = std::make_shared<BitCodeAbbrev>();
3614 Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_FNENTRY));
3615 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id
3616 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // funcoffset
3617 unsigned FnEntryAbbrev = Stream.EmitAbbrev(std::move(Abbv));
3618
3619 for (const Function &F : M) {
3620 uint64_t Record[2];
3621
3622 if (F.isDeclaration())
3623 continue;
3624
3625 Record[0] = VE.getValueID(&F);
3626
3627 // Save the word offset of the function (from the start of the
3628 // actual bitcode written to the stream).
3629 uint64_t BitcodeIndex = FunctionToBitcodeIndex[&F] - bitcodeStartBit();
3630 assert((BitcodeIndex & 31) == 0 && "function block not 32-bit aligned");
3631 // Note that we add 1 here because the offset is relative to one word
3632 // before the start of the identification block, which was historically
3633 // always the start of the regular bitcode header.
3634 Record[1] = BitcodeIndex / 32 + 1;
3635
3636 Stream.EmitRecord(bitc::VST_CODE_FNENTRY, Record, FnEntryAbbrev);
3637 }
3638
3639 Stream.ExitBlock();
3640}
3641
3642/// Emit names for arguments, instructions and basic blocks in a function.
3643void ModuleBitcodeWriter::writeFunctionLevelValueSymbolTable(
3644 const ValueSymbolTable &VST) {
3645 if (VST.empty())
3646 return;
3647
3649
3650 // FIXME: Set up the abbrev, we know how many values there are!
3651 // FIXME: We know if the type names can use 7-bit ascii.
3652 SmallVector<uint64_t, 64> NameVals;
3653
3654 for (const ValueName &Name : VST) {
3655 // Figure out the encoding to use for the name.
3657
3658 unsigned AbbrevToUse = VST_ENTRY_8_ABBREV;
3659 NameVals.push_back(VE.getValueID(Name.getValue()));
3660
3661 // VST_CODE_ENTRY: [valueid, namechar x N]
3662 // VST_CODE_BBENTRY: [bbid, namechar x N]
3663 unsigned Code;
3664 if (isa<BasicBlock>(Name.getValue())) {
3666 if (Bits == SE_Char6)
3667 AbbrevToUse = VST_BBENTRY_6_ABBREV;
3668 } else {
3670 if (Bits == SE_Char6)
3671 AbbrevToUse = VST_ENTRY_6_ABBREV;
3672 else if (Bits == SE_Fixed7)
3673 AbbrevToUse = VST_ENTRY_7_ABBREV;
3674 }
3675
3676 for (const auto P : Name.getKey())
3677 NameVals.push_back((unsigned char)P);
3678
3679 // Emit the finished record.
3680 Stream.EmitRecord(Code, NameVals, AbbrevToUse);
3681 NameVals.clear();
3682 }
3683
3684 Stream.ExitBlock();
3685}
3686
3687void ModuleBitcodeWriter::writeUseList(UseListOrder &&Order) {
3688 assert(Order.Shuffle.size() >= 2 && "Shuffle too small");
3689 unsigned Code;
3690 if (isa<BasicBlock>(Order.V))
3692 else
3694
3695 SmallVector<uint64_t, 64> Record(Order.Shuffle.begin(), Order.Shuffle.end());
3696 Record.push_back(VE.getValueID(Order.V));
3697 Stream.EmitRecord(Code, Record);
3698}
3699
3700void ModuleBitcodeWriter::writeUseListBlock(const Function *F) {
3702 "Expected to be preserving use-list order");
3703
3704 auto hasMore = [&]() {
3705 return !VE.UseListOrders.empty() && VE.UseListOrders.back().F == F;
3706 };
3707 if (!hasMore())
3708 // Nothing to do.
3709 return;
3710
3712 while (hasMore()) {
3713 writeUseList(std::move(VE.UseListOrders.back()));
3714 VE.UseListOrders.pop_back();
3715 }
3716 Stream.ExitBlock();
3717}
3718
3719/// Emit a function body to the module stream.
3720void ModuleBitcodeWriter::writeFunction(
3721 const Function &F,
3722 DenseMap<const Function *, uint64_t> &FunctionToBitcodeIndex) {
3723 // Save the bitcode index of the start of this function block for recording
3724 // in the VST.
3725 FunctionToBitcodeIndex[&F] = Stream.GetCurrentBitNo();
3726
3729
3731
3732 // Emit the number of basic blocks, so the reader can create them ahead of
3733 // time.
3734 Vals.push_back(VE.getBasicBlocks().size());
3736 Vals.clear();
3737
3738 // If there are function-local constants, emit them now.
3739 unsigned CstStart, CstEnd;
3740 VE.getFunctionConstantRange(CstStart, CstEnd);
3741 writeConstants(CstStart, CstEnd, false);
3742
3743 // If there is function-local metadata, emit it now.
3744 writeFunctionMetadata(F);
3745
3746 // Keep a running idea of what the instruction ID is.
3747 unsigned InstID = CstEnd;
3748
3749 bool NeedsMetadataAttachment = F.hasMetadata();
3750
3751 DILocation *LastDL = nullptr;
3752 SmallSetVector<Function *, 4> BlockAddressUsers;
3753
3754 // Finally, emit all the instructions, in order.
3755 for (const BasicBlock &BB : F) {
3756 for (const Instruction &I : BB) {
3757 writeInstruction(I, InstID, Vals);
3758
3759 if (!I.getType()->isVoidTy())
3760 ++InstID;
3761
3762 // If the instruction has metadata, write a metadata attachment later.
3763 NeedsMetadataAttachment |= I.hasMetadataOtherThanDebugLoc();
3764
3765 // If the instruction has a debug location, emit it.
3766 if (DILocation *DL = I.getDebugLoc()) {
3767 if (DL == LastDL) {
3768 // Just repeat the same debug loc as last time.
3770 } else {
3771 Vals.push_back(DL->getLine());
3772 Vals.push_back(DL->getColumn());
3773 Vals.push_back(VE.getMetadataOrNullID(DL->getScope()));
3774 Vals.push_back(VE.getMetadataOrNullID(DL->getInlinedAt()));
3775 Vals.push_back(DL->isImplicitCode());
3776 Vals.push_back(DL->getAtomGroup());
3777 Vals.push_back(DL->getAtomRank());
3779 FUNCTION_DEBUG_LOC_ABBREV);
3780 Vals.clear();
3781 LastDL = DL;
3782 }
3783 }
3784
3785 // If the instruction has DbgRecords attached to it, emit them. Note that
3786 // they come after the instruction so that it's easy to attach them again
3787 // when reading the bitcode, even though conceptually the debug locations
3788 // start "before" the instruction.
3789 if (I.hasDbgRecords()) {
3790 /// Try to push the value only (unwrapped), otherwise push the
3791 /// metadata wrapped value. Returns true if the value was pushed
3792 /// without the ValueAsMetadata wrapper.
3793 auto PushValueOrMetadata = [&Vals, InstID,
3794 this](Metadata *RawLocation) {
3795 assert(RawLocation &&
3796 "RawLocation unexpectedly null in DbgVariableRecord");
3797 if (ValueAsMetadata *VAM = dyn_cast<ValueAsMetadata>(RawLocation)) {
3798 SmallVector<unsigned, 2> ValAndType;
3799 // If the value is a fwd-ref the type is also pushed. We don't
3800 // want the type, so fwd-refs are kept wrapped (pushValueAndType
3801 // returns false if the value is pushed without type).
3802 if (!pushValueAndType(VAM->getValue(), InstID, ValAndType)) {
3803 Vals.push_back(ValAndType[0]);
3804 return true;
3805 }
3806 }
3807 // The metadata is a DIArgList, or ValueAsMetadata wrapping a
3808 // fwd-ref. Push the metadata ID.
3809 Vals.push_back(VE.getMetadataID(RawLocation));
3810 return false;
3811 };
3812
3813 // Write out non-instruction debug information attached to this
3814 // instruction. Write it after the instruction so that it's easy to
3815 // re-attach to the instruction reading the records in.
3816 for (DbgRecord &DR : I.DebugMarker->getDbgRecordRange()) {
3817 if (DbgLabelRecord *DLR = dyn_cast<DbgLabelRecord>(&DR)) {
3818 Vals.push_back(VE.getMetadataID(&*DLR->getDebugLoc()));
3819 Vals.push_back(VE.getMetadataID(DLR->getLabel()));
3821 Vals.clear();
3822 continue;
3823 }
3824
3825 // First 3 fields are common to all kinds:
3826 // DILocation, DILocalVariable, DIExpression
3827 // dbg_value (FUNC_CODE_DEBUG_RECORD_VALUE)
3828 // ..., LocationMetadata
3829 // dbg_value (FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE - abbrev'd)
3830 // ..., Value
3831 // dbg_declare (FUNC_CODE_DEBUG_RECORD_DECLARE)
3832 // ..., LocationMetadata
3833 // dbg_assign (FUNC_CODE_DEBUG_RECORD_ASSIGN)
3834 // ..., LocationMetadata, DIAssignID, DIExpression, LocationMetadata
3835 DbgVariableRecord &DVR = cast<DbgVariableRecord>(DR);
3836 Vals.push_back(VE.getMetadataID(&*DVR.getDebugLoc()));
3837 Vals.push_back(VE.getMetadataID(DVR.getVariable()));
3838 Vals.push_back(VE.getMetadataID(DVR.getExpression()));
3839 if (DVR.isDbgValue()) {
3840 if (PushValueOrMetadata(DVR.getRawLocation()))
3842 FUNCTION_DEBUG_RECORD_VALUE_ABBREV);
3843 else
3845 } else if (DVR.isDbgDeclare()) {
3846 Vals.push_back(VE.getMetadataID(DVR.getRawLocation()));
3848 } else if (DVR.isDbgDeclareValue()) {
3849 Vals.push_back(VE.getMetadataID(DVR.getRawLocation()));
3851 } else {
3852 assert(DVR.isDbgAssign() && "Unexpected DbgRecord kind");
3853 Vals.push_back(VE.getMetadataID(DVR.getRawLocation()));
3854 Vals.push_back(VE.getMetadataID(DVR.getAssignID()));
3856 Vals.push_back(VE.getMetadataID(DVR.getRawAddress()));
3858 }
3859 Vals.clear();
3860 }
3861 }
3862 }
3863
3864 if (BlockAddress *BA = BlockAddress::lookup(&BB)) {
3865 SmallVector<Value *> Worklist{BA};
3866 SmallPtrSet<Value *, 8> Visited{BA};
3867 while (!Worklist.empty()) {
3868 Value *V = Worklist.pop_back_val();
3869 for (User *U : V->users()) {
3870 if (auto *I = dyn_cast<Instruction>(U)) {
3871 Function *P = I->getFunction();
3872 if (P != &F)
3873 BlockAddressUsers.insert(P);
3874 } else if (isa<Constant>(U) && !isa<GlobalValue>(U) &&
3875 Visited.insert(U).second)
3876 Worklist.push_back(U);
3877 }
3878 }
3879 }
3880 }
3881
3882 if (!BlockAddressUsers.empty()) {
3883 Vals.resize(BlockAddressUsers.size());
3884 for (auto I : llvm::enumerate(BlockAddressUsers))
3885 Vals[I.index()] = VE.getValueID(I.value());
3887 Vals.clear();
3888 }
3889
3890 // Emit names for all the instructions etc.
3891 if (auto *Symtab = F.getValueSymbolTable())
3892 writeFunctionLevelValueSymbolTable(*Symtab);
3893
3894 if (NeedsMetadataAttachment)
3895 writeFunctionMetadataAttachment(F);
3897 writeUseListBlock(&F);
3898 VE.purgeFunction();
3899 Stream.ExitBlock();
3900}
3901
3902// Emit blockinfo, which defines the standard abbreviations etc.
3903void ModuleBitcodeWriter::writeBlockInfo() {
3904 // We only want to emit block info records for blocks that have multiple
3905 // instances: CONSTANTS_BLOCK, FUNCTION_BLOCK and VALUE_SYMTAB_BLOCK.
3906 // Other blocks can define their abbrevs inline.
3907 Stream.EnterBlockInfoBlock();
3908
3909 // Encode type indices using fixed size based on number of types.
3910 BitCodeAbbrevOp TypeAbbrevOp(BitCodeAbbrevOp::Fixed,
3912 // Encode value indices as 6-bit VBR.
3913 BitCodeAbbrevOp ValAbbrevOp(BitCodeAbbrevOp::VBR, 6);
3914
3915 { // 8-bit fixed-width VST_CODE_ENTRY/VST_CODE_BBENTRY strings.
3916 auto Abbv = std::make_shared<BitCodeAbbrev>();
3917 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3));
3918 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
3919 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
3920 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));
3922 VST_ENTRY_8_ABBREV)
3923 llvm_unreachable("Unexpected abbrev ordering!");
3924 }
3925
3926 { // 7-bit fixed width VST_CODE_ENTRY strings.
3927 auto Abbv = std::make_shared<BitCodeAbbrev>();
3928 Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY));
3929 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
3930 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
3931 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));
3933 VST_ENTRY_7_ABBREV)
3934 llvm_unreachable("Unexpected abbrev ordering!");
3935 }
3936 { // 6-bit char6 VST_CODE_ENTRY strings.
3937 auto Abbv = std::make_shared<BitCodeAbbrev>();
3938 Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_ENTRY));
3939 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
3940 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
3941 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));
3943 VST_ENTRY_6_ABBREV)
3944 llvm_unreachable("Unexpected abbrev ordering!");
3945 }
3946 { // 6-bit char6 VST_CODE_BBENTRY strings.
3947 auto Abbv = std::make_shared<BitCodeAbbrev>();
3948 Abbv->Add(BitCodeAbbrevOp(bitc::VST_CODE_BBENTRY));
3949 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
3950 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
3951 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));
3953 VST_BBENTRY_6_ABBREV)
3954 llvm_unreachable("Unexpected abbrev ordering!");
3955 }
3956
3957 { // SETTYPE abbrev for CONSTANTS_BLOCK.
3958 auto Abbv = std::make_shared<BitCodeAbbrev>();
3959 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_SETTYPE));
3960 Abbv->Add(TypeAbbrevOp);
3962 CONSTANTS_SETTYPE_ABBREV)
3963 llvm_unreachable("Unexpected abbrev ordering!");
3964 }
3965
3966 { // INTEGER abbrev for CONSTANTS_BLOCK.
3967 auto Abbv = std::make_shared<BitCodeAbbrev>();
3968 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_INTEGER));
3969 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
3971 CONSTANTS_INTEGER_ABBREV)
3972 llvm_unreachable("Unexpected abbrev ordering!");
3973 }
3974
3975 { // CE_CAST abbrev for CONSTANTS_BLOCK.
3976 auto Abbv = std::make_shared<BitCodeAbbrev>();
3977 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_CE_CAST));
3978 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // cast opc
3979 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, // typeid
3981 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // value id
3982
3984 CONSTANTS_CE_CAST_Abbrev)
3985 llvm_unreachable("Unexpected abbrev ordering!");
3986 }
3987 { // NULL abbrev for CONSTANTS_BLOCK.
3988 auto Abbv = std::make_shared<BitCodeAbbrev>();
3989 Abbv->Add(BitCodeAbbrevOp(bitc::CST_CODE_NULL));
3991 CONSTANTS_NULL_Abbrev)
3992 llvm_unreachable("Unexpected abbrev ordering!");
3993 }
3994
3995 // FIXME: This should only use space for first class types!
3996
3997 { // INST_LOAD abbrev for FUNCTION_BLOCK.
3998 auto Abbv = std::make_shared<BitCodeAbbrev>();
3999 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_LOAD));
4000 Abbv->Add(ValAbbrevOp); // Ptr
4001 Abbv->Add(TypeAbbrevOp); // dest ty
4002 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // Align
4003 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile
4004 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4005 FUNCTION_INST_LOAD_ABBREV)
4006 llvm_unreachable("Unexpected abbrev ordering!");
4007 }
4008 {
4009 auto Abbv = std::make_shared<BitCodeAbbrev>();
4010 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_STORE));
4011 Abbv->Add(ValAbbrevOp); // op1
4012 Abbv->Add(ValAbbrevOp); // op0
4013 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // align
4014 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // volatile
4015 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4016 FUNCTION_INST_STORE_ABBREV)
4017 llvm_unreachable("Unexpected abbrev ordering!");
4018 }
4019 { // INST_UNOP abbrev for FUNCTION_BLOCK.
4020 auto Abbv = std::make_shared<BitCodeAbbrev>();
4021 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNOP));
4022 Abbv->Add(ValAbbrevOp); // LHS
4023 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc
4024 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4025 FUNCTION_INST_UNOP_ABBREV)
4026 llvm_unreachable("Unexpected abbrev ordering!");
4027 }
4028 { // INST_UNOP_FLAGS abbrev for FUNCTION_BLOCK.
4029 auto Abbv = std::make_shared<BitCodeAbbrev>();
4030 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNOP));
4031 Abbv->Add(ValAbbrevOp); // LHS
4032 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc
4033 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); // flags
4034 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4035 FUNCTION_INST_UNOP_FLAGS_ABBREV)
4036 llvm_unreachable("Unexpected abbrev ordering!");
4037 }
4038 { // INST_BINOP abbrev for FUNCTION_BLOCK.
4039 auto Abbv = std::make_shared<BitCodeAbbrev>();
4040 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP));
4041 Abbv->Add(ValAbbrevOp); // LHS
4042 Abbv->Add(ValAbbrevOp); // RHS
4043 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc
4044 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4045 FUNCTION_INST_BINOP_ABBREV)
4046 llvm_unreachable("Unexpected abbrev ordering!");
4047 }
4048 { // INST_BINOP_FLAGS abbrev for FUNCTION_BLOCK.
4049 auto Abbv = std::make_shared<BitCodeAbbrev>();
4050 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BINOP));
4051 Abbv->Add(ValAbbrevOp); // LHS
4052 Abbv->Add(ValAbbrevOp); // RHS
4053 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc
4054 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); // flags
4055 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4056 FUNCTION_INST_BINOP_FLAGS_ABBREV)
4057 llvm_unreachable("Unexpected abbrev ordering!");
4058 }
4059 { // INST_CAST abbrev for FUNCTION_BLOCK.
4060 auto Abbv = std::make_shared<BitCodeAbbrev>();
4061 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CAST));
4062 Abbv->Add(ValAbbrevOp); // OpVal
4063 Abbv->Add(TypeAbbrevOp); // dest ty
4064 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc
4065 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4066 FUNCTION_INST_CAST_ABBREV)
4067 llvm_unreachable("Unexpected abbrev ordering!");
4068 }
4069 { // INST_CAST_FLAGS abbrev for FUNCTION_BLOCK.
4070 auto Abbv = std::make_shared<BitCodeAbbrev>();
4071 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CAST));
4072 Abbv->Add(ValAbbrevOp); // OpVal
4073 Abbv->Add(TypeAbbrevOp); // dest ty
4074 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 4)); // opc
4075 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); // flags
4076 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4077 FUNCTION_INST_CAST_FLAGS_ABBREV)
4078 llvm_unreachable("Unexpected abbrev ordering!");
4079 }
4080
4081 { // INST_RET abbrev for FUNCTION_BLOCK.
4082 auto Abbv = std::make_shared<BitCodeAbbrev>();
4083 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET));
4084 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4085 FUNCTION_INST_RET_VOID_ABBREV)
4086 llvm_unreachable("Unexpected abbrev ordering!");
4087 }
4088 { // INST_RET abbrev for FUNCTION_BLOCK.
4089 auto Abbv = std::make_shared<BitCodeAbbrev>();
4090 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_RET));
4091 Abbv->Add(ValAbbrevOp);
4092 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4093 FUNCTION_INST_RET_VAL_ABBREV)
4094 llvm_unreachable("Unexpected abbrev ordering!");
4095 }
4096 {
4097 auto Abbv = std::make_shared<BitCodeAbbrev>();
4098 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BR));
4099 // TODO: Use different abbrev for absolute value reference (succ0)?
4100 Abbv->Add(ValAbbrevOp); // succ0
4101 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4102 FUNCTION_INST_BR_UNCOND_ABBREV)
4103 llvm_unreachable("Unexpected abbrev ordering!");
4104 }
4105 {
4106 auto Abbv = std::make_shared<BitCodeAbbrev>();
4107 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_BR));
4108 // TODO: Use different abbrev for absolute value references (succ0, succ1)?
4109 Abbv->Add(ValAbbrevOp); // succ0
4110 Abbv->Add(ValAbbrevOp); // succ1
4111 Abbv->Add(ValAbbrevOp); // cond
4112 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4113 FUNCTION_INST_BR_COND_ABBREV)
4114 llvm_unreachable("Unexpected abbrev ordering!");
4115 }
4116 { // INST_UNREACHABLE abbrev for FUNCTION_BLOCK.
4117 auto Abbv = std::make_shared<BitCodeAbbrev>();
4118 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_UNREACHABLE));
4119 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4120 FUNCTION_INST_UNREACHABLE_ABBREV)
4121 llvm_unreachable("Unexpected abbrev ordering!");
4122 }
4123 {
4124 auto Abbv = std::make_shared<BitCodeAbbrev>();
4125 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_GEP));
4126 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // flags
4127 Abbv->Add(TypeAbbrevOp); // dest ty
4128 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4129 Abbv->Add(ValAbbrevOp);
4130 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4131 FUNCTION_INST_GEP_ABBREV)
4132 llvm_unreachable("Unexpected abbrev ordering!");
4133 }
4134 {
4135 auto Abbv = std::make_shared<BitCodeAbbrev>();
4136 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CMP2));
4137 Abbv->Add(ValAbbrevOp); // op0
4138 Abbv->Add(ValAbbrevOp); // op1
4139 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 6)); // pred
4140 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4141 FUNCTION_INST_CMP_ABBREV)
4142 llvm_unreachable("Unexpected abbrev ordering!");
4143 }
4144 {
4145 auto Abbv = std::make_shared<BitCodeAbbrev>();
4146 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_INST_CMP2));
4147 Abbv->Add(ValAbbrevOp); // op0
4148 Abbv->Add(ValAbbrevOp); // op1
4149 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 6)); // pred
4150 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); // flags
4151 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4152 FUNCTION_INST_CMP_FLAGS_ABBREV)
4153 llvm_unreachable("Unexpected abbrev ordering!");
4154 }
4155 {
4156 auto Abbv = std::make_shared<BitCodeAbbrev>();
4157 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE));
4158 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 7)); // dbgloc
4159 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 7)); // var
4160 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 7)); // expr
4161 Abbv->Add(ValAbbrevOp); // val
4162 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4163 FUNCTION_DEBUG_RECORD_VALUE_ABBREV)
4164 llvm_unreachable("Unexpected abbrev ordering! 1");
4165 }
4166 {
4167 auto Abbv = std::make_shared<BitCodeAbbrev>();
4168 Abbv->Add(BitCodeAbbrevOp(bitc::FUNC_CODE_DEBUG_LOC));
4169 // NOTE: No IsDistinct field for FUNC_CODE_DEBUG_LOC.
4170 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
4171 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4172 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
4173 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
4174 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1));
4175 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Atom group.
4176 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 3)); // Atom rank.
4177 if (Stream.EmitBlockInfoAbbrev(bitc::FUNCTION_BLOCK_ID, Abbv) !=
4178 FUNCTION_DEBUG_LOC_ABBREV)
4179 llvm_unreachable("Unexpected abbrev ordering!");
4180 }
4181 Stream.ExitBlock();
4182}
4183
4184/// Write the module path strings, currently only used when generating
4185/// a combined index file.
4186void IndexBitcodeWriter::writeModStrings() {
4188
4189 // TODO: See which abbrev sizes we actually need to emit
4190
4191 // 8-bit fixed-width MST_ENTRY strings.
4192 auto Abbv = std::make_shared<BitCodeAbbrev>();
4193 Abbv->Add(BitCodeAbbrevOp(bitc::MST_CODE_ENTRY));
4194 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4195 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4196 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8));
4197 unsigned Abbrev8Bit = Stream.EmitAbbrev(std::move(Abbv));
4198
4199 // 7-bit fixed width MST_ENTRY strings.
4200 Abbv = std::make_shared<BitCodeAbbrev>();
4201 Abbv->Add(BitCodeAbbrevOp(bitc::MST_CODE_ENTRY));
4202 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4203 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4204 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7));
4205 unsigned Abbrev7Bit = Stream.EmitAbbrev(std::move(Abbv));
4206
4207 // 6-bit char6 MST_ENTRY strings.
4208 Abbv = std::make_shared<BitCodeAbbrev>();
4209 Abbv->Add(BitCodeAbbrevOp(bitc::MST_CODE_ENTRY));
4210 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4211 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4212 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Char6));
4213 unsigned Abbrev6Bit = Stream.EmitAbbrev(std::move(Abbv));
4214
4215 // Module Hash, 160 bits SHA1. Optionally, emitted after each MST_CODE_ENTRY.
4216 Abbv = std::make_shared<BitCodeAbbrev>();
4217 Abbv->Add(BitCodeAbbrevOp(bitc::MST_CODE_HASH));
4218 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4219 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4220 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4221 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4222 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4223 unsigned AbbrevHash = Stream.EmitAbbrev(std::move(Abbv));
4224
4226 forEachModule([&](const StringMapEntry<ModuleHash> &MPSE) {
4227 StringRef Key = MPSE.getKey();
4228 const auto &Hash = MPSE.getValue();
4230 unsigned AbbrevToUse = Abbrev8Bit;
4231 if (Bits == SE_Char6)
4232 AbbrevToUse = Abbrev6Bit;
4233 else if (Bits == SE_Fixed7)
4234 AbbrevToUse = Abbrev7Bit;
4235
4236 auto ModuleId = ModuleIdMap.size();
4237 ModuleIdMap[Key] = ModuleId;
4238 Vals.push_back(ModuleId);
4239 Vals.append(Key.begin(), Key.end());
4240
4241 // Emit the finished record.
4242 Stream.EmitRecord(bitc::MST_CODE_ENTRY, Vals, AbbrevToUse);
4243
4244 // Emit an optional hash for the module now
4245 if (llvm::any_of(Hash, [](uint32_t H) { return H; })) {
4246 Vals.assign(Hash.begin(), Hash.end());
4247 // Emit the hash record.
4248 Stream.EmitRecord(bitc::MST_CODE_HASH, Vals, AbbrevHash);
4249 }
4250
4251 Vals.clear();
4252 });
4253 Stream.ExitBlock();
4254}
4255
4256/// Write the function type metadata related records that need to appear before
4257/// a function summary entry (whether per-module or combined).
4258template <typename Fn>
4260 FunctionSummary *FS,
4261 Fn GetValueID) {
4262 if (!FS->type_tests().empty())
4263 Stream.EmitRecord(bitc::FS_TYPE_TESTS, FS->type_tests());
4264
4266
4267 auto WriteVFuncIdVec = [&](uint64_t Ty,
4269 if (VFs.empty())
4270 return;
4271 Record.clear();
4272 for (auto &VF : VFs) {
4273 Record.push_back(VF.GUID);
4274 Record.push_back(VF.Offset);
4275 }
4276 Stream.EmitRecord(Ty, Record);
4277 };
4278
4279 WriteVFuncIdVec(bitc::FS_TYPE_TEST_ASSUME_VCALLS,
4280 FS->type_test_assume_vcalls());
4281 WriteVFuncIdVec(bitc::FS_TYPE_CHECKED_LOAD_VCALLS,
4282 FS->type_checked_load_vcalls());
4283
4284 auto WriteConstVCallVec = [&](uint64_t Ty,
4286 for (auto &VC : VCs) {
4287 Record.clear();
4288 Record.push_back(VC.VFunc.GUID);
4289 Record.push_back(VC.VFunc.Offset);
4290 llvm::append_range(Record, VC.Args);
4291 Stream.EmitRecord(Ty, Record);
4292 }
4293 };
4294
4295 WriteConstVCallVec(bitc::FS_TYPE_TEST_ASSUME_CONST_VCALL,
4296 FS->type_test_assume_const_vcalls());
4297 WriteConstVCallVec(bitc::FS_TYPE_CHECKED_LOAD_CONST_VCALL,
4298 FS->type_checked_load_const_vcalls());
4299
4300 auto WriteRange = [&](ConstantRange Range) {
4302 assert(Range.getLower().getNumWords() == 1);
4303 assert(Range.getUpper().getNumWords() == 1);
4304 emitSignedInt64(Record, *Range.getLower().getRawData());
4305 emitSignedInt64(Record, *Range.getUpper().getRawData());
4306 };
4307
4308 if (!FS->paramAccesses().empty()) {
4309 Record.clear();
4310 for (auto &Arg : FS->paramAccesses()) {
4311 size_t UndoSize = Record.size();
4312 Record.push_back(Arg.ParamNo);
4313 WriteRange(Arg.Use);
4314 Record.push_back(Arg.Calls.size());
4315 for (auto &Call : Arg.Calls) {
4316 Record.push_back(Call.ParamNo);
4317 std::optional<unsigned> ValueID = GetValueID(Call.Callee);
4318 if (!ValueID) {
4319 // If ValueID is unknown we can't drop just this call, we must drop
4320 // entire parameter.
4321 Record.resize(UndoSize);
4322 break;
4323 }
4324 Record.push_back(*ValueID);
4325 WriteRange(Call.Offsets);
4326 }
4327 }
4328 if (!Record.empty())
4330 }
4331}
4332
4333/// Collect type IDs from type tests used by function.
4334static void
4336 std::set<GlobalValue::GUID> &ReferencedTypeIds) {
4337 if (!FS->type_tests().empty())
4338 for (auto &TT : FS->type_tests())
4339 ReferencedTypeIds.insert(TT);
4340
4341 auto GetReferencedTypesFromVFuncIdVec =
4343 for (auto &VF : VFs)
4344 ReferencedTypeIds.insert(VF.GUID);
4345 };
4346
4347 GetReferencedTypesFromVFuncIdVec(FS->type_test_assume_vcalls());
4348 GetReferencedTypesFromVFuncIdVec(FS->type_checked_load_vcalls());
4349
4350 auto GetReferencedTypesFromConstVCallVec =
4352 for (auto &VC : VCs)
4353 ReferencedTypeIds.insert(VC.VFunc.GUID);
4354 };
4355
4356 GetReferencedTypesFromConstVCallVec(FS->type_test_assume_const_vcalls());
4357 GetReferencedTypesFromConstVCallVec(FS->type_checked_load_const_vcalls());
4358}
4359
4361 SmallVector<uint64_t, 64> &NameVals, const std::vector<uint64_t> &args,
4363 NameVals.push_back(args.size());
4364 llvm::append_range(NameVals, args);
4365
4366 NameVals.push_back(ByArg.TheKind);
4367 NameVals.push_back(ByArg.Info);
4368 NameVals.push_back(ByArg.Byte);
4369 NameVals.push_back(ByArg.Bit);
4370}
4371
4373 SmallVector<uint64_t, 64> &NameVals, StringTableBuilder &StrtabBuilder,
4374 uint64_t Id, const WholeProgramDevirtResolution &Wpd) {
4375 NameVals.push_back(Id);
4376
4377 NameVals.push_back(Wpd.TheKind);
4378 NameVals.push_back(StrtabBuilder.add(Wpd.SingleImplName));
4379 NameVals.push_back(Wpd.SingleImplName.size());
4380
4381 NameVals.push_back(Wpd.ResByArg.size());
4382 for (auto &A : Wpd.ResByArg)
4383 writeWholeProgramDevirtResolutionByArg(NameVals, A.first, A.second);
4384}
4385
4387 StringTableBuilder &StrtabBuilder,
4388 StringRef Id,
4389 const TypeIdSummary &Summary) {
4390 NameVals.push_back(StrtabBuilder.add(Id));
4391 NameVals.push_back(Id.size());
4392
4393 NameVals.push_back(Summary.TTRes.TheKind);
4394 NameVals.push_back(Summary.TTRes.SizeM1BitWidth);
4395 NameVals.push_back(Summary.TTRes.AlignLog2);
4396 NameVals.push_back(Summary.TTRes.SizeM1);
4397 NameVals.push_back(Summary.TTRes.BitMask);
4398 NameVals.push_back(Summary.TTRes.InlineBits);
4399
4400 for (auto &W : Summary.WPDRes)
4401 writeWholeProgramDevirtResolution(NameVals, StrtabBuilder, W.first,
4402 W.second);
4403}
4404
4406 SmallVector<uint64_t, 64> &NameVals, StringTableBuilder &StrtabBuilder,
4407 StringRef Id, const TypeIdCompatibleVtableInfo &Summary,
4409 NameVals.push_back(StrtabBuilder.add(Id));
4410 NameVals.push_back(Id.size());
4411
4412 for (auto &P : Summary) {
4413 NameVals.push_back(P.AddressPointOffset);
4414 NameVals.push_back(VE.getValueID(P.VTableVI.getValue()));
4415 }
4416}
4417
4418// Adds the allocation contexts to the CallStacks map. We simply use the
4419// size at the time the context was added as the CallStackId. This works because
4420// when we look up the call stacks later on we process the function summaries
4421// and their allocation records in the same exact order.
4423 FunctionSummary *FS, std::function<LinearFrameId(unsigned)> GetStackIndex,
4425 // The interfaces in ProfileData/MemProf.h use a type alias for a stack frame
4426 // id offset into the index of the full stack frames. The ModuleSummaryIndex
4427 // currently uses unsigned. Make sure these stay in sync.
4428 static_assert(std::is_same_v<LinearFrameId, unsigned>);
4429 for (auto &AI : FS->allocs()) {
4430 for (auto &MIB : AI.MIBs) {
4431 SmallVector<unsigned> StackIdIndices;
4432 StackIdIndices.reserve(MIB.StackIdIndices.size());
4433 for (auto Id : MIB.StackIdIndices)
4434 StackIdIndices.push_back(GetStackIndex(Id));
4435 // The CallStackId is the size at the time this context was inserted.
4436 CallStacks.insert({CallStacks.size(), StackIdIndices});
4437 }
4438 }
4439}
4440
4441// Build the radix tree from the accumulated CallStacks, write out the resulting
4442// linearized radix tree array, and return the map of call stack positions into
4443// this array for use when writing the allocation records. The returned map is
4444// indexed by a CallStackId which in this case is implicitly determined by the
4445// order of function summaries and their allocation infos being written.
4448 BitstreamWriter &Stream, unsigned RadixAbbrev) {
4449 assert(!CallStacks.empty());
4450 DenseMap<unsigned, FrameStat> FrameHistogram =
4453 // We don't need a MemProfFrameIndexes map as we have already converted the
4454 // full stack id hash to a linear offset into the StackIds array.
4455 Builder.build(std::move(CallStacks), /*MemProfFrameIndexes=*/nullptr,
4456 FrameHistogram);
4457 Stream.EmitRecord(bitc::FS_CONTEXT_RADIX_TREE_ARRAY, Builder.getRadixArray(),
4458 RadixAbbrev);
4459 return Builder.takeCallStackPos();
4460}
4461
4463 BitstreamWriter &Stream, FunctionSummary *FS, unsigned CallsiteAbbrev,
4464 unsigned AllocAbbrev, unsigned ContextIdAbbvId, bool PerModule,
4465 std::function<unsigned(const ValueInfo &VI)> GetValueID,
4466 std::function<unsigned(unsigned)> GetStackIndex,
4467 bool WriteContextSizeInfoIndex,
4469 CallStackId &CallStackCount) {
4471
4472 for (auto &CI : FS->callsites()) {
4473 Record.clear();
4474 // Per module callsite clones should always have a single entry of
4475 // value 0.
4476 assert(!PerModule || (CI.Clones.size() == 1 && CI.Clones[0] == 0));
4477 Record.push_back(GetValueID(CI.Callee));
4478 if (!PerModule) {
4479 Record.push_back(CI.StackIdIndices.size());
4480 Record.push_back(CI.Clones.size());
4481 }
4482 for (auto Id : CI.StackIdIndices)
4483 Record.push_back(GetStackIndex(Id));
4484 if (!PerModule)
4485 llvm::append_range(Record, CI.Clones);
4488 Record, CallsiteAbbrev);
4489 }
4490
4491 for (auto &AI : FS->allocs()) {
4492 Record.clear();
4493 // Per module alloc versions should always have a single entry of
4494 // value 0.
4495 assert(!PerModule || (AI.Versions.size() == 1 && AI.Versions[0] == 0));
4496 Record.push_back(AI.MIBs.size());
4497 if (!PerModule)
4498 Record.push_back(AI.Versions.size());
4499 for (auto &MIB : AI.MIBs) {
4500 Record.push_back((uint8_t)MIB.AllocType);
4501 // The per-module summary always needs to include the alloc context, as we
4502 // use it during the thin link. For the combined index it is optional (see
4503 // comments where CombinedIndexMemProfContext is defined).
4504 if (PerModule || CombinedIndexMemProfContext) {
4505 // Record the index into the radix tree array for this context.
4506 assert(CallStackCount <= CallStackPos.size());
4507 Record.push_back(CallStackPos[CallStackCount++]);
4508 }
4509 }
4510 if (!PerModule)
4511 llvm::append_range(Record, AI.Versions);
4512 assert(AI.ContextSizeInfos.empty() ||
4513 AI.ContextSizeInfos.size() == AI.MIBs.size());
4514 // Optionally emit the context size information if it exists.
4515 if (WriteContextSizeInfoIndex && !AI.ContextSizeInfos.empty()) {
4516 // The abbreviation id for the context ids record should have been created
4517 // if we are emitting the per-module index, which is where we write this
4518 // info.
4519 assert(ContextIdAbbvId);
4520 SmallVector<uint32_t> ContextIds;
4521 // At least one context id per ContextSizeInfos entry (MIB), broken into 2
4522 // halves.
4523 ContextIds.reserve(AI.ContextSizeInfos.size() * 2);
4524 for (auto &Infos : AI.ContextSizeInfos) {
4525 Record.push_back(Infos.size());
4526 for (auto [FullStackId, TotalSize] : Infos) {
4527 // The context ids are emitted separately as a fixed width array,
4528 // which is more efficient than a VBR given that these hashes are
4529 // typically close to 64-bits. The max fixed width entry is 32 bits so
4530 // it is split into 2.
4531 ContextIds.push_back(static_cast<uint32_t>(FullStackId >> 32));
4532 ContextIds.push_back(static_cast<uint32_t>(FullStackId));
4533 Record.push_back(TotalSize);
4534 }
4535 }
4536 // The context ids are expected by the reader to immediately precede the
4537 // associated alloc info record.
4538 Stream.EmitRecord(bitc::FS_ALLOC_CONTEXT_IDS, ContextIds,
4539 ContextIdAbbvId);
4540 }
4541 Stream.EmitRecord(PerModule
4546 Record, AllocAbbrev);
4547 }
4548}
4549
4550// Helper to emit a single function summary record.
4551void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
4552 SmallVector<uint64_t, 64> &NameVals, GlobalValueSummary *Summary,
4553 unsigned ValueID, unsigned FSCallsRelBFAbbrev,
4554 unsigned FSCallsProfileAbbrev, unsigned CallsiteAbbrev,
4555 unsigned AllocAbbrev, unsigned ContextIdAbbvId, const Function &F,
4556 DenseMap<CallStackId, LinearCallStackId> &CallStackPos,
4557 CallStackId &CallStackCount) {
4558 NameVals.push_back(ValueID);
4559
4560 FunctionSummary *FS = cast<FunctionSummary>(Summary);
4561
4563 Stream, FS, [&](const ValueInfo &VI) -> std::optional<unsigned> {
4564 return {VE.getValueID(VI.getValue())};
4565 });
4566
4568 Stream, FS, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId,
4569 /*PerModule*/ true,
4570 /*GetValueId*/ [&](const ValueInfo &VI) { return getValueId(VI); },
4571 /*GetStackIndex*/ [&](unsigned I) { return I; },
4572 /*WriteContextSizeInfoIndex*/ true, CallStackPos, CallStackCount);
4573
4574 auto SpecialRefCnts = FS->specialRefCounts();
4575 NameVals.push_back(getEncodedGVSummaryFlags(FS->flags()));
4576 NameVals.push_back(FS->instCount());
4577 NameVals.push_back(getEncodedFFlags(FS->fflags()));
4578 NameVals.push_back(FS->refs().size());
4579 NameVals.push_back(SpecialRefCnts.first); // rorefcnt
4580 NameVals.push_back(SpecialRefCnts.second); // worefcnt
4581
4582 for (auto &RI : FS->refs())
4583 NameVals.push_back(getValueId(RI));
4584
4585 const bool UseRelBFRecord =
4586 WriteRelBFToSummary && !F.hasProfileData() &&
4588 for (auto &ECI : FS->calls()) {
4589 NameVals.push_back(getValueId(ECI.first));
4590 if (UseRelBFRecord)
4591 NameVals.push_back(getEncodedRelBFCallEdgeInfo(ECI.second));
4592 else
4593 NameVals.push_back(getEncodedHotnessCallEdgeInfo(ECI.second));
4594 }
4595
4596 unsigned FSAbbrev =
4597 (UseRelBFRecord ? FSCallsRelBFAbbrev : FSCallsProfileAbbrev);
4598 unsigned Code =
4600
4601 // Emit the finished record.
4602 Stream.EmitRecord(Code, NameVals, FSAbbrev);
4603 NameVals.clear();
4604}
4605
4606// Collect the global value references in the given variable's initializer,
4607// and emit them in a summary record.
4608void ModuleBitcodeWriterBase::writeModuleLevelReferences(
4609 const GlobalVariable &V, SmallVector<uint64_t, 64> &NameVals,
4610 unsigned FSModRefsAbbrev, unsigned FSModVTableRefsAbbrev) {
4611 auto VI = Index->getValueInfo(V.getGUID());
4612 if (!VI || VI.getSummaryList().empty()) {
4613 // Only declarations should not have a summary (a declaration might however
4614 // have a summary if the def was in module level asm).
4615 assert(V.isDeclaration());
4616 return;
4617 }
4618 auto *Summary = VI.getSummaryList()[0].get();
4619 NameVals.push_back(VE.getValueID(&V));
4620 GlobalVarSummary *VS = cast<GlobalVarSummary>(Summary);
4621 NameVals.push_back(getEncodedGVSummaryFlags(VS->flags()));
4622 NameVals.push_back(getEncodedGVarFlags(VS->varflags()));
4623
4624 auto VTableFuncs = VS->vTableFuncs();
4625 if (!VTableFuncs.empty())
4626 NameVals.push_back(VS->refs().size());
4627
4628 unsigned SizeBeforeRefs = NameVals.size();
4629 for (auto &RI : VS->refs())
4630 NameVals.push_back(VE.getValueID(RI.getValue()));
4631 // Sort the refs for determinism output, the vector returned by FS->refs() has
4632 // been initialized from a DenseSet.
4633 llvm::sort(drop_begin(NameVals, SizeBeforeRefs));
4634
4635 if (VTableFuncs.empty())
4637 FSModRefsAbbrev);
4638 else {
4639 // VTableFuncs pairs should already be sorted by offset.
4640 for (auto &P : VTableFuncs) {
4641 NameVals.push_back(VE.getValueID(P.FuncVI.getValue()));
4642 NameVals.push_back(P.VTableOffset);
4643 }
4644
4646 FSModVTableRefsAbbrev);
4647 }
4648 NameVals.clear();
4649}
4650
4651/// Emit the per-module summary section alongside the rest of
4652/// the module's bitcode.
4653void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
4654 // By default we compile with ThinLTO if the module has a summary, but the
4655 // client can request full LTO with a module flag.
4656 bool IsThinLTO = true;
4657 if (auto *MD =
4658 mdconst::extract_or_null<ConstantInt>(M.getModuleFlag("ThinLTO")))
4659 IsThinLTO = MD->getZExtValue();
4662 4);
4663
4664 Stream.EmitRecord(
4666 ArrayRef<uint64_t>{ModuleSummaryIndex::BitcodeSummaryVersion});
4667
4668 // Write the index flags.
4669 uint64_t Flags = 0;
4670 // Bits 1-3 are set only in the combined index, skip them.
4671 if (Index->enableSplitLTOUnit())
4672 Flags |= 0x8;
4673 if (Index->hasUnifiedLTO())
4674 Flags |= 0x200;
4675
4676 Stream.EmitRecord(bitc::FS_FLAGS, ArrayRef<uint64_t>{Flags});
4677
4678 if (Index->begin() == Index->end()) {
4679 Stream.ExitBlock();
4680 return;
4681 }
4682
4683 auto Abbv = std::make_shared<BitCodeAbbrev>();
4684 Abbv->Add(BitCodeAbbrevOp(bitc::FS_VALUE_GUID));
4685 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
4686 // GUIDS often use up most of 64-bits, so encode as two Fixed 32.
4687 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4688 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4689 unsigned ValueGuidAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4690
4691 for (const auto &GVI : valueIds()) {
4693 ArrayRef<uint32_t>{GVI.second,
4694 static_cast<uint32_t>(GVI.first >> 32),
4695 static_cast<uint32_t>(GVI.first)},
4696 ValueGuidAbbrev);
4697 }
4698
4699 if (!Index->stackIds().empty()) {
4700 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4701 StackIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_STACK_IDS));
4702 // numids x stackid
4703 StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4704 // The stack ids are hashes that are close to 64 bits in size, so emitting
4705 // as a pair of 32-bit fixed-width values is more efficient than a VBR.
4706 StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4707 unsigned StackIdAbbvId = Stream.EmitAbbrev(std::move(StackIdAbbv));
4708 SmallVector<uint32_t> Vals;
4709 Vals.reserve(Index->stackIds().size() * 2);
4710 for (auto Id : Index->stackIds()) {
4711 Vals.push_back(static_cast<uint32_t>(Id >> 32));
4712 Vals.push_back(static_cast<uint32_t>(Id));
4713 }
4714 Stream.EmitRecord(bitc::FS_STACK_IDS, Vals, StackIdAbbvId);
4715 }
4716
4717 unsigned ContextIdAbbvId = 0;
4719 // n x context id
4720 auto ContextIdAbbv = std::make_shared<BitCodeAbbrev>();
4721 ContextIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_ALLOC_CONTEXT_IDS));
4722 ContextIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4723 // The context ids are hashes that are close to 64 bits in size, so emitting
4724 // as a pair of 32-bit fixed-width values is more efficient than a VBR if we
4725 // are emitting them for all MIBs. Otherwise we use VBR to better compress 0
4726 // values that are expected to more frequently occur in an alloc's memprof
4727 // summary.
4729 ContextIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4730 else
4731 ContextIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4732 ContextIdAbbvId = Stream.EmitAbbrev(std::move(ContextIdAbbv));
4733 }
4734
4735 // Abbrev for FS_PERMODULE_PROFILE.
4736 Abbv = std::make_shared<BitCodeAbbrev>();
4737 Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_PROFILE));
4738 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
4739 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // flags
4740 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // instcount
4741 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // fflags
4742 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs
4743 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // rorefcnt
4744 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // worefcnt
4745 // numrefs x valueid, n x (valueid, hotness+tailcall flags)
4746 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4747 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4748 unsigned FSCallsProfileAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4749
4750 // Abbrev for FS_PERMODULE_RELBF.
4751 Abbv = std::make_shared<BitCodeAbbrev>();
4752 Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_RELBF));
4753 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
4754 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags
4755 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // instcount
4756 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // fflags
4757 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs
4758 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // rorefcnt
4759 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // worefcnt
4760 // numrefs x valueid, n x (valueid, rel_block_freq+tailcall])
4761 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4762 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4763 unsigned FSCallsRelBFAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4764
4765 // Abbrev for FS_PERMODULE_GLOBALVAR_INIT_REFS.
4766 Abbv = std::make_shared<BitCodeAbbrev>();
4767 Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_GLOBALVAR_INIT_REFS));
4768 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
4769 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags
4770 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); // valueids
4771 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4772 unsigned FSModRefsAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4773
4774 // Abbrev for FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS.
4775 Abbv = std::make_shared<BitCodeAbbrev>();
4776 Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS));
4777 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
4778 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags
4779 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs
4780 // numrefs x valueid, n x (valueid , offset)
4781 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4782 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4783 unsigned FSModVTableRefsAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4784
4785 // Abbrev for FS_ALIAS.
4786 Abbv = std::make_shared<BitCodeAbbrev>();
4787 Abbv->Add(BitCodeAbbrevOp(bitc::FS_ALIAS));
4788 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
4789 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags
4790 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
4791 unsigned FSAliasAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4792
4793 // Abbrev for FS_TYPE_ID_METADATA
4794 Abbv = std::make_shared<BitCodeAbbrev>();
4795 Abbv->Add(BitCodeAbbrevOp(bitc::FS_TYPE_ID_METADATA));
4796 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // typeid strtab index
4797 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // typeid length
4798 // n x (valueid , offset)
4799 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4800 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4801 unsigned TypeIdCompatibleVtableAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4802
4803 Abbv = std::make_shared<BitCodeAbbrev>();
4804 Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_CALLSITE_INFO));
4805 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
4806 // n x stackidindex
4807 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4808 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4809 unsigned CallsiteAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4810
4811 Abbv = std::make_shared<BitCodeAbbrev>();
4812 Abbv->Add(BitCodeAbbrevOp(bitc::FS_PERMODULE_ALLOC_INFO));
4813 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // nummib
4814 // n x (alloc type, context radix tree index)
4815 // optional: nummib x (numcontext x total size)
4816 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4817 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4818 unsigned AllocAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4819
4820 Abbv = std::make_shared<BitCodeAbbrev>();
4821 Abbv->Add(BitCodeAbbrevOp(bitc::FS_CONTEXT_RADIX_TREE_ARRAY));
4822 // n x entry
4823 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4824 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4825 unsigned RadixAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4826
4827 // First walk through all the functions and collect the allocation contexts in
4828 // their associated summaries, for use in constructing a radix tree of
4829 // contexts. Note that we need to do this in the same order as the functions
4830 // are processed further below since the call stack positions in the resulting
4831 // radix tree array are identified based on this order.
4832 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
4833 for (const Function &F : M) {
4834 // Summary emission does not support anonymous functions, they have to be
4835 // renamed using the anonymous function renaming pass.
4836 if (!F.hasName())
4837 report_fatal_error("Unexpected anonymous function when writing summary");
4838
4839 ValueInfo VI = Index->getValueInfo(F.getGUID());
4840 if (!VI || VI.getSummaryList().empty()) {
4841 // Only declarations should not have a summary (a declaration might
4842 // however have a summary if the def was in module level asm).
4843 assert(F.isDeclaration());
4844 continue;
4845 }
4846 auto *Summary = VI.getSummaryList()[0].get();
4847 FunctionSummary *FS = cast<FunctionSummary>(Summary);
4849 FS, /*GetStackIndex*/ [](unsigned I) { return I; }, CallStacks);
4850 }
4851 // Finalize the radix tree, write it out, and get the map of positions in the
4852 // linearized tree array.
4853 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
4854 if (!CallStacks.empty()) {
4855 CallStackPos =
4856 writeMemoryProfileRadixTree(std::move(CallStacks), Stream, RadixAbbrev);
4857 }
4858
4859 // Keep track of the current index into the CallStackPos map.
4860 CallStackId CallStackCount = 0;
4861
4862 SmallVector<uint64_t, 64> NameVals;
4863 // Iterate over the list of functions instead of the Index to
4864 // ensure the ordering is stable.
4865 for (const Function &F : M) {
4866 // Summary emission does not support anonymous functions, they have to
4867 // renamed using the anonymous function renaming pass.
4868 if (!F.hasName())
4869 report_fatal_error("Unexpected anonymous function when writing summary");
4870
4871 ValueInfo VI = Index->getValueInfo(F.getGUID());
4872 if (!VI || VI.getSummaryList().empty()) {
4873 // Only declarations should not have a summary (a declaration might
4874 // however have a summary if the def was in module level asm).
4875 assert(F.isDeclaration());
4876 continue;
4877 }
4878 auto *Summary = VI.getSummaryList()[0].get();
4879 writePerModuleFunctionSummaryRecord(
4880 NameVals, Summary, VE.getValueID(&F), FSCallsRelBFAbbrev,
4881 FSCallsProfileAbbrev, CallsiteAbbrev, AllocAbbrev, ContextIdAbbvId, F,
4882 CallStackPos, CallStackCount);
4883 }
4884
4885 // Capture references from GlobalVariable initializers, which are outside
4886 // of a function scope.
4887 for (const GlobalVariable &G : M.globals())
4888 writeModuleLevelReferences(G, NameVals, FSModRefsAbbrev,
4889 FSModVTableRefsAbbrev);
4890
4891 for (const GlobalAlias &A : M.aliases()) {
4892 auto *Aliasee = A.getAliaseeObject();
4893 // Skip ifunc and nameless functions which don't have an entry in the
4894 // summary.
4895 if (!Aliasee->hasName() || isa<GlobalIFunc>(Aliasee))
4896 continue;
4897 auto AliasId = VE.getValueID(&A);
4898 auto AliaseeId = VE.getValueID(Aliasee);
4899 NameVals.push_back(AliasId);
4900 auto *Summary = Index->getGlobalValueSummary(A);
4901 AliasSummary *AS = cast<AliasSummary>(Summary);
4902 NameVals.push_back(getEncodedGVSummaryFlags(AS->flags()));
4903 NameVals.push_back(AliaseeId);
4904 Stream.EmitRecord(bitc::FS_ALIAS, NameVals, FSAliasAbbrev);
4905 NameVals.clear();
4906 }
4907
4908 for (auto &S : Index->typeIdCompatibleVtableMap()) {
4909 writeTypeIdCompatibleVtableSummaryRecord(NameVals, StrtabBuilder, S.first,
4910 S.second, VE);
4911 Stream.EmitRecord(bitc::FS_TYPE_ID_METADATA, NameVals,
4912 TypeIdCompatibleVtableAbbrev);
4913 NameVals.clear();
4914 }
4915
4916 if (Index->getBlockCount())
4918 ArrayRef<uint64_t>{Index->getBlockCount()});
4919
4920 Stream.ExitBlock();
4921}
4922
4923/// Emit the combined summary section into the combined index file.
4924void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
4926 Stream.EmitRecord(
4928 ArrayRef<uint64_t>{ModuleSummaryIndex::BitcodeSummaryVersion});
4929
4930 // Write the index flags.
4931 Stream.EmitRecord(bitc::FS_FLAGS, ArrayRef<uint64_t>{Index.getFlags()});
4932
4933 auto Abbv = std::make_shared<BitCodeAbbrev>();
4934 Abbv->Add(BitCodeAbbrevOp(bitc::FS_VALUE_GUID));
4935 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
4936 // GUIDS often use up most of 64-bits, so encode as two Fixed 32.
4937 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4938 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4939 unsigned ValueGuidAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4940
4941 for (const auto &GVI : valueIds()) {
4943 ArrayRef<uint32_t>{GVI.second,
4944 static_cast<uint32_t>(GVI.first >> 32),
4945 static_cast<uint32_t>(GVI.first)},
4946 ValueGuidAbbrev);
4947 }
4948
4949 // Write the stack ids used by this index, which will be a subset of those in
4950 // the full index in the case of distributed indexes.
4951 if (!StackIds.empty()) {
4952 auto StackIdAbbv = std::make_shared<BitCodeAbbrev>();
4953 StackIdAbbv->Add(BitCodeAbbrevOp(bitc::FS_STACK_IDS));
4954 // numids x stackid
4955 StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4956 // The stack ids are hashes that are close to 64 bits in size, so emitting
4957 // as a pair of 32-bit fixed-width values is more efficient than a VBR.
4958 StackIdAbbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));
4959 unsigned StackIdAbbvId = Stream.EmitAbbrev(std::move(StackIdAbbv));
4960 SmallVector<uint32_t> Vals;
4961 Vals.reserve(StackIds.size() * 2);
4962 for (auto Id : StackIds) {
4963 Vals.push_back(static_cast<uint32_t>(Id >> 32));
4964 Vals.push_back(static_cast<uint32_t>(Id));
4965 }
4966 Stream.EmitRecord(bitc::FS_STACK_IDS, Vals, StackIdAbbvId);
4967 }
4968
4969 // Abbrev for FS_COMBINED_PROFILE.
4970 Abbv = std::make_shared<BitCodeAbbrev>();
4971 Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_PROFILE));
4972 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
4973 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // modid
4974 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags
4975 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // instcount
4976 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // fflags
4977 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // entrycount
4978 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numrefs
4979 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // rorefcnt
4980 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // worefcnt
4981 // numrefs x valueid, n x (valueid, hotness+tailcall flags)
4982 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
4983 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4984 unsigned FSCallsProfileAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4985
4986 // Abbrev for FS_COMBINED_GLOBALVAR_INIT_REFS.
4987 Abbv = std::make_shared<BitCodeAbbrev>();
4988 Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_GLOBALVAR_INIT_REFS));
4989 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
4990 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // modid
4991 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags
4992 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array)); // valueids
4993 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
4994 unsigned FSModRefsAbbrev = Stream.EmitAbbrev(std::move(Abbv));
4995
4996 // Abbrev for FS_COMBINED_ALIAS.
4997 Abbv = std::make_shared<BitCodeAbbrev>();
4998 Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_ALIAS));
4999 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
5000 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // modid
5001 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // flags
5002 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
5003 unsigned FSAliasAbbrev = Stream.EmitAbbrev(std::move(Abbv));
5004
5005 Abbv = std::make_shared<BitCodeAbbrev>();
5006 Abbv->Add(BitCodeAbbrevOp(bitc::FS_COMBINED_CALLSITE_INFO));
5007 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8)); // valueid
5008 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numstackindices
5009 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numver
5010 // numstackindices x stackidindex, numver x version
5011 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
5012 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
5013 unsigned CallsiteAbbrev = Stream.EmitAbbrev(std::move(Abbv));
5014
5015 Abbv = std::make_shared<BitCodeAbbrev>();
5016 Abbv->Add(BitCodeAbbrevOp(CombinedIndexMemProfContext
5019 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // nummib
5020 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 4)); // numver
5021 // nummib x (alloc type, context radix tree index),
5022 // numver x version
5023 // optional: nummib x total size
5024 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
5025 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
5026 unsigned AllocAbbrev = Stream.EmitAbbrev(std::move(Abbv));
5027
5028 auto shouldImportValueAsDecl = [&](GlobalValueSummary *GVS) -> bool {
5029 if (DecSummaries == nullptr)
5030 return false;
5031 return DecSummaries->count(GVS);
5032 };
5033
5034 // The aliases are emitted as a post-pass, and will point to the value
5035 // id of the aliasee. Save them in a vector for post-processing.
5037
5038 // Save the value id for each summary for alias emission.
5039 DenseMap<const GlobalValueSummary *, unsigned> SummaryToValueIdMap;
5040
5041 SmallVector<uint64_t, 64> NameVals;
5042
5043 // Set that will be populated during call to writeFunctionTypeMetadataRecords
5044 // with the type ids referenced by this index file.
5045 std::set<GlobalValue::GUID> ReferencedTypeIds;
5046
5047 // For local linkage, we also emit the original name separately
5048 // immediately after the record.
5049 auto MaybeEmitOriginalName = [&](GlobalValueSummary &S) {
5050 // We don't need to emit the original name if we are writing the index for
5051 // distributed backends (in which case ModuleToSummariesForIndex is
5052 // non-null). The original name is only needed during the thin link, since
5053 // for SamplePGO the indirect call targets for local functions have
5054 // have the original name annotated in profile.
5055 // Continue to emit it when writing out the entire combined index, which is
5056 // used in testing the thin link via llvm-lto.
5057 if (ModuleToSummariesForIndex || !GlobalValue::isLocalLinkage(S.linkage()))
5058 return;
5059 NameVals.push_back(S.getOriginalName());
5061 NameVals.clear();
5062 };
5063
5064 DenseMap<CallStackId, LinearCallStackId> CallStackPos;
5066 Abbv = std::make_shared<BitCodeAbbrev>();
5067 Abbv->Add(BitCodeAbbrevOp(bitc::FS_CONTEXT_RADIX_TREE_ARRAY));
5068 // n x entry
5069 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Array));
5070 Abbv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 8));
5071 unsigned RadixAbbrev = Stream.EmitAbbrev(std::move(Abbv));
5072
5073 // First walk through all the functions and collect the allocation contexts
5074 // in their associated summaries, for use in constructing a radix tree of
5075 // contexts. Note that we need to do this in the same order as the functions
5076 // are processed further below since the call stack positions in the
5077 // resulting radix tree array are identified based on this order.
5078 MapVector<CallStackId, llvm::SmallVector<LinearFrameId>> CallStacks;
5079 forEachSummary([&](GVInfo I, bool IsAliasee) {
5080 // Don't collect this when invoked for an aliasee, as it is not needed for
5081 // the alias summary. If the aliasee is to be imported, we will invoke
5082 // this separately with IsAliasee=false.
5083 if (IsAliasee)
5084 return;
5085 GlobalValueSummary *S = I.second;
5086 assert(S);
5087 auto *FS = dyn_cast<FunctionSummary>(S);
5088 if (!FS)
5089 return;
5091 FS,
5092 /*GetStackIndex*/
5093 [&](unsigned I) {
5094 // Get the corresponding index into the list of StackIds actually
5095 // being written for this combined index (which may be a subset in
5096 // the case of distributed indexes).
5097 assert(StackIdIndicesToIndex.contains(I));
5098 return StackIdIndicesToIndex[I];
5099 },
5100 CallStacks);
5101 });
5102 // Finalize the radix tree, write it out, and get the map of positions in
5103 // the linearized tree array.
5104 if (!CallStacks.empty()) {
5105 CallStackPos = writeMemoryProfileRadixTree(std::move(CallStacks), Stream,
5106 RadixAbbrev);
5107 }
5108 }
5109
5110 // Keep track of the current index into the CallStackPos map. Not used if
5111 // CombinedIndexMemProfContext is false.
5112 CallStackId CallStackCount = 0;
5113
5114 DenseSet<GlobalValue::GUID> DefOrUseGUIDs;
5115 forEachSummary([&](GVInfo I, bool IsAliasee) {
5116 GlobalValueSummary *S = I.second;
5117 assert(S);
5118 DefOrUseGUIDs.insert(I.first);
5119 for (const ValueInfo &VI : S->refs())
5120 DefOrUseGUIDs.insert(VI.getGUID());
5121
5122 auto ValueId = getValueId(I.first);
5123 assert(ValueId);
5124 SummaryToValueIdMap[S] = *ValueId;
5125
5126 // If this is invoked for an aliasee, we want to record the above
5127 // mapping, but then not emit a summary entry (if the aliasee is
5128 // to be imported, we will invoke this separately with IsAliasee=false).
5129 if (IsAliasee)
5130 return;
5131
5132 if (auto *AS = dyn_cast<AliasSummary>(S)) {
5133 // Will process aliases as a post-pass because the reader wants all
5134 // global to be loaded first.
5135 Aliases.push_back(AS);
5136 return;
5137 }
5138
5139 if (auto *VS = dyn_cast<GlobalVarSummary>(S)) {
5140 NameVals.push_back(*ValueId);
5141 assert(ModuleIdMap.count(VS->modulePath()));
5142 NameVals.push_back(ModuleIdMap[VS->modulePath()]);
5143 NameVals.push_back(
5144 getEncodedGVSummaryFlags(VS->flags(), shouldImportValueAsDecl(VS)));
5145 NameVals.push_back(getEncodedGVarFlags(VS->varflags()));
5146 for (auto &RI : VS->refs()) {
5147 auto RefValueId = getValueId(RI.getGUID());
5148 if (!RefValueId)
5149 continue;
5150 NameVals.push_back(*RefValueId);
5151 }
5152
5153 // Emit the finished record.
5155 FSModRefsAbbrev);
5156 NameVals.clear();
5157 MaybeEmitOriginalName(*S);
5158 return;
5159 }
5160
5161 auto GetValueId = [&](const ValueInfo &VI) -> std::optional<unsigned> {
5162 if (!VI)
5163 return std::nullopt;
5164 return getValueId(VI.getGUID());
5165 };
5166
5167 auto *FS = cast<FunctionSummary>(S);
5168 writeFunctionTypeMetadataRecords(Stream, FS, GetValueId);
5169 getReferencedTypeIds(FS, ReferencedTypeIds);
5170
5172 Stream, FS, CallsiteAbbrev, AllocAbbrev, /*ContextIdAbbvId*/ 0,
5173 /*PerModule*/ false,
5174 /*GetValueId*/
5175 [&](const ValueInfo &VI) -> unsigned {
5176 std::optional<unsigned> ValueID = GetValueId(VI);
5177 // This can happen in shared index files for distributed ThinLTO if
5178 // the callee function summary is not included. Record 0 which we
5179 // will have to deal with conservatively when doing any kind of
5180 // validation in the ThinLTO backends.
5181 if (!ValueID)
5182 return 0;
5183 return *ValueID;
5184 },
5185 /*GetStackIndex*/
5186 [&](unsigned I) {
5187 // Get the corresponding index into the list of StackIds actually
5188 // being written for this combined index (which may be a subset in
5189 // the case of distributed indexes).
5190 assert(StackIdIndicesToIndex.contains(I));
5191 return StackIdIndicesToIndex[I];
5192 },
5193 /*WriteContextSizeInfoIndex*/ false, CallStackPos, CallStackCount);
5194
5195 NameVals.push_back(*ValueId);
5196 assert(ModuleIdMap.count(FS->modulePath()));
5197 NameVals.push_back(ModuleIdMap[FS->modulePath()]);
5198 NameVals.push_back(
5199 getEncodedGVSummaryFlags(FS->flags(), shouldImportValueAsDecl(FS)));
5200 NameVals.push_back(FS->instCount());
5201 NameVals.push_back(getEncodedFFlags(FS->fflags()));
5202 // TODO: Stop writing entry count and bump bitcode version.
5203 NameVals.push_back(0 /* EntryCount */);
5204
5205 // Fill in below
5206 NameVals.push_back(0); // numrefs
5207 NameVals.push_back(0); // rorefcnt
5208 NameVals.push_back(0); // worefcnt
5209
5210 unsigned Count = 0, RORefCnt = 0, WORefCnt = 0;
5211 for (auto &RI : FS->refs()) {
5212 auto RefValueId = getValueId(RI.getGUID());
5213 if (!RefValueId)
5214 continue;
5215 NameVals.push_back(*RefValueId);
5216 if (RI.isReadOnly())
5217 RORefCnt++;
5218 else if (RI.isWriteOnly())
5219 WORefCnt++;
5220 Count++;
5221 }
5222 NameVals[6] = Count;
5223 NameVals[7] = RORefCnt;
5224 NameVals[8] = WORefCnt;
5225
5226 for (auto &EI : FS->calls()) {
5227 // If this GUID doesn't have a value id, it doesn't have a function
5228 // summary and we don't need to record any calls to it.
5229 std::optional<unsigned> CallValueId = GetValueId(EI.first);
5230 if (!CallValueId)
5231 continue;
5232 NameVals.push_back(*CallValueId);
5233 NameVals.push_back(getEncodedHotnessCallEdgeInfo(EI.second));
5234 }
5235
5236 // Emit the finished record.
5237 Stream.EmitRecord(bitc::FS_COMBINED_PROFILE, NameVals,
5238 FSCallsProfileAbbrev);
5239 NameVals.clear();
5240 MaybeEmitOriginalName(*S);
5241 });
5242
5243 for (auto *AS : Aliases) {
5244 auto AliasValueId = SummaryToValueIdMap[AS];
5245 assert(AliasValueId);
5246 NameVals.push_back(AliasValueId);
5247 assert(ModuleIdMap.count(AS->modulePath()));
5248 NameVals.push_back(ModuleIdMap[AS->modulePath()]);
5249 NameVals.push_back(
5250 getEncodedGVSummaryFlags(AS->flags(), shouldImportValueAsDecl(AS)));
5251 // Set value id to 0 when an alias is imported but the aliasee summary is
5252 // not contained in the index.
5253 auto AliaseeValueId =
5254 AS->hasAliasee() ? SummaryToValueIdMap[&AS->getAliasee()] : 0;
5255 NameVals.push_back(AliaseeValueId);
5256
5257 // Emit the finished record.
5258 Stream.EmitRecord(bitc::FS_COMBINED_ALIAS, NameVals, FSAliasAbbrev);
5259 NameVals.clear();
5260 MaybeEmitOriginalName(*AS);
5261
5262 if (AS->hasAliasee())
5263 if (auto *FS = dyn_cast<FunctionSummary>(&AS->getAliasee()))
5264 getReferencedTypeIds(FS, ReferencedTypeIds);
5265 }
5266
5267 SmallVector<StringRef, 4> Functions;
5268 auto EmitCfiFunctions = [&](const CfiFunctionIndex &CfiIndex,
5270 if (CfiIndex.empty())
5271 return;
5272 for (GlobalValue::GUID GUID : DefOrUseGUIDs) {
5273 auto Defs = CfiIndex.forGuid(GUID);
5274 llvm::append_range(Functions, Defs);
5275 }
5276 if (Functions.empty())
5277 return;
5278 llvm::sort(Functions);
5279 for (const auto &S : Functions) {
5280 NameVals.push_back(StrtabBuilder.add(S));
5281 NameVals.push_back(S.size());
5282 }
5283 Stream.EmitRecord(Code, NameVals);
5284 NameVals.clear();
5285 Functions.clear();
5286 };
5287
5288 EmitCfiFunctions(Index.cfiFunctionDefs(), bitc::FS_CFI_FUNCTION_DEFS);
5289 EmitCfiFunctions(Index.cfiFunctionDecls(), bitc::FS_CFI_FUNCTION_DECLS);
5290
5291 // Walk the GUIDs that were referenced, and write the
5292 // corresponding type id records.
5293 for (auto &T : ReferencedTypeIds) {
5294 auto TidIter = Index.typeIds().equal_range(T);
5295 for (const auto &[GUID, TypeIdPair] : make_range(TidIter)) {
5296 writeTypeIdSummaryRecord(NameVals, StrtabBuilder, TypeIdPair.first,
5297 TypeIdPair.second);
5298 Stream.EmitRecord(bitc::FS_TYPE_ID, NameVals);
5299 NameVals.clear();
5300 }
5301 }
5302
5303 if (Index.getBlockCount())
5305 ArrayRef<uint64_t>{Index.getBlockCount()});
5306
5307 Stream.ExitBlock();
5308}
5309
5310/// Create the "IDENTIFICATION_BLOCK_ID" containing a single string with the
5311/// current llvm version, and a record for the epoch number.
5314
5315 // Write the "user readable" string identifying the bitcode producer
5316 auto Abbv = std::make_shared<BitCodeAbbrev>();
5320 auto StringAbbrev = Stream.EmitAbbrev(std::move(Abbv));
5322 "LLVM" LLVM_VERSION_STRING, StringAbbrev);
5323
5324 // Write the epoch version
5325 Abbv = std::make_shared<BitCodeAbbrev>();
5328 auto EpochAbbrev = Stream.EmitAbbrev(std::move(Abbv));
5329 constexpr std::array<unsigned, 1> Vals = {{bitc::BITCODE_CURRENT_EPOCH}};
5330 Stream.EmitRecord(bitc::IDENTIFICATION_CODE_EPOCH, Vals, EpochAbbrev);
5331 Stream.ExitBlock();
5332}
5333
5334void ModuleBitcodeWriter::writeModuleHash(StringRef View) {
5335 // Emit the module's hash.
5336 // MODULE_CODE_HASH: [5*i32]
5337 if (GenerateHash) {
5338 uint32_t Vals[5];
5339 Hasher.update(ArrayRef<uint8_t>(
5340 reinterpret_cast<const uint8_t *>(View.data()), View.size()));
5341 std::array<uint8_t, 20> Hash = Hasher.result();
5342 for (int Pos = 0; Pos < 20; Pos += 4) {
5343 Vals[Pos / 4] = support::endian::read32be(Hash.data() + Pos);
5344 }
5345
5346 // Emit the finished record.
5347 Stream.EmitRecord(bitc::MODULE_CODE_HASH, Vals);
5348
5349 if (ModHash)
5350 // Save the written hash value.
5351 llvm::copy(Vals, std::begin(*ModHash));
5352 }
5353}
5354
5355void ModuleBitcodeWriter::write() {
5357
5359 // We will want to write the module hash at this point. Block any flushing so
5360 // we can have access to the whole underlying data later.
5361 Stream.markAndBlockFlushing();
5362
5363 writeModuleVersion();
5364
5365 // Emit blockinfo, which defines the standard abbreviations etc.
5366 writeBlockInfo();
5367
5368 // Emit information describing all of the types in the module.
5369 writeTypeTable();
5370
5371 // Emit information about attribute groups.
5372 writeAttributeGroupTable();
5373
5374 // Emit information about parameter attributes.
5375 writeAttributeTable();
5376
5377 writeComdats();
5378
5379 // Emit top-level description of module, including target triple, inline asm,
5380 // descriptors for global variables, and function prototype info.
5381 writeModuleInfo();
5382
5383 // Emit constants.
5384 writeModuleConstants();
5385
5386 // Emit metadata kind names.
5387 writeModuleMetadataKinds();
5388
5389 // Emit metadata.
5390 writeModuleMetadata();
5391
5392 // Emit module-level use-lists.
5394 writeUseListBlock(nullptr);
5395
5396 writeOperandBundleTags();
5397 writeSyncScopeNames();
5398
5399 // Emit function bodies.
5400 DenseMap<const Function *, uint64_t> FunctionToBitcodeIndex;
5401 for (const Function &F : M)
5402 if (!F.isDeclaration())
5403 writeFunction(F, FunctionToBitcodeIndex);
5404
5405 // Need to write after the above call to WriteFunction which populates
5406 // the summary information in the index.
5407 if (Index)
5408 writePerModuleGlobalValueSummary();
5409
5410 writeGlobalValueSymbolTable(FunctionToBitcodeIndex);
5411
5412 writeModuleHash(Stream.getMarkedBufferAndResumeFlushing());
5413
5414 Stream.ExitBlock();
5415}
5416
5418 uint32_t &Position) {
5419 support::endian::write32le(&Buffer[Position], Value);
5420 Position += 4;
5421}
5422
5423/// If generating a bc file on darwin, we have to emit a
5424/// header and trailer to make it compatible with the system archiver. To do
5425/// this we emit the following header, and then emit a trailer that pads the
5426/// file out to be a multiple of 16 bytes.
5427///
5428/// struct bc_header {
5429/// uint32_t Magic; // 0x0B17C0DE
5430/// uint32_t Version; // Version, currently always 0.
5431/// uint32_t BitcodeOffset; // Offset to traditional bitcode file.
5432/// uint32_t BitcodeSize; // Size of traditional bitcode file.
5433/// uint32_t CPUType; // CPU specifier.
5434/// ... potentially more later ...
5435/// };
5437 const Triple &TT) {
5438 unsigned CPUType = ~0U;
5439
5440 // Match x86_64-*, i[3-9]86-*, powerpc-*, powerpc64-*, arm-*, thumb-*,
5441 // armv[0-9]-*, thumbv[0-9]-*, armv5te-*, or armv6t2-*. The CPUType is a magic
5442 // number from /usr/include/mach/machine.h. It is ok to reproduce the
5443 // specific constants here because they are implicitly part of the Darwin ABI.
5444 enum {
5445 DARWIN_CPU_ARCH_ABI64 = 0x01000000,
5446 DARWIN_CPU_TYPE_X86 = 7,
5447 DARWIN_CPU_TYPE_ARM = 12,
5448 DARWIN_CPU_TYPE_POWERPC = 18
5449 };
5450
5451 Triple::ArchType Arch = TT.getArch();
5452 if (Arch == Triple::x86_64)
5453 CPUType = DARWIN_CPU_TYPE_X86 | DARWIN_CPU_ARCH_ABI64;
5454 else if (Arch == Triple::x86)
5455 CPUType = DARWIN_CPU_TYPE_X86;
5456 else if (Arch == Triple::ppc)
5457 CPUType = DARWIN_CPU_TYPE_POWERPC;
5458 else if (Arch == Triple::ppc64)
5459 CPUType = DARWIN_CPU_TYPE_POWERPC | DARWIN_CPU_ARCH_ABI64;
5460 else if (Arch == Triple::arm || Arch == Triple::thumb)
5461 CPUType = DARWIN_CPU_TYPE_ARM;
5462
5463 // Traditional Bitcode starts after header.
5464 assert(Buffer.size() >= BWH_HeaderSize &&
5465 "Expected header size to be reserved");
5466 unsigned BCOffset = BWH_HeaderSize;
5467 unsigned BCSize = Buffer.size() - BWH_HeaderSize;
5468
5469 // Write the magic and version.
5470 unsigned Position = 0;
5471 writeInt32ToBuffer(0x0B17C0DE, Buffer, Position);
5472 writeInt32ToBuffer(0, Buffer, Position); // Version.
5473 writeInt32ToBuffer(BCOffset, Buffer, Position);
5474 writeInt32ToBuffer(BCSize, Buffer, Position);
5475 writeInt32ToBuffer(CPUType, Buffer, Position);
5476
5477 // If the file is not a multiple of 16 bytes, insert dummy padding.
5478 while (Buffer.size() & 15)
5479 Buffer.push_back(0);
5480}
5481
5482/// Helper to write the header common to all bitcode files.
5484 // Emit the file header.
5485 Stream.Emit((unsigned)'B', 8);
5486 Stream.Emit((unsigned)'C', 8);
5487 Stream.Emit(0x0, 4);
5488 Stream.Emit(0xC, 4);
5489 Stream.Emit(0xE, 4);
5490 Stream.Emit(0xD, 4);
5491}
5492
5494 : Stream(new BitstreamWriter(Buffer)) {
5495 writeBitcodeHeader(*Stream);
5496}
5497
5502
5504
5505void BitcodeWriter::writeBlob(unsigned Block, unsigned Record, StringRef Blob) {
5506 Stream->EnterSubblock(Block, 3);
5507
5508 auto Abbv = std::make_shared<BitCodeAbbrev>();
5509 Abbv->Add(BitCodeAbbrevOp(Record));
5511 auto AbbrevNo = Stream->EmitAbbrev(std::move(Abbv));
5512
5513 Stream->EmitRecordWithBlob(AbbrevNo, ArrayRef<uint64_t>{Record}, Blob);
5514
5515 Stream->ExitBlock();
5516}
5517
5519 assert(!WroteStrtab && !WroteSymtab);
5520
5521 // If any module has module-level inline asm, we will require a registered asm
5522 // parser for the target so that we can create an accurate symbol table for
5523 // the module.
5524 for (Module *M : Mods) {
5525 if (M->getModuleInlineAsm().empty())
5526 continue;
5527
5528 std::string Err;
5529 const Triple TT(M->getTargetTriple());
5530 const Target *T = TargetRegistry::lookupTarget(TT, Err);
5531 if (!T || !T->hasMCAsmParser())
5532 return;
5533 }
5534
5535 WroteSymtab = true;
5536 SmallVector<char, 0> Symtab;
5537 // The irsymtab::build function may be unable to create a symbol table if the
5538 // module is malformed (e.g. it contains an invalid alias). Writing a symbol
5539 // table is not required for correctness, but we still want to be able to
5540 // write malformed modules to bitcode files, so swallow the error.
5541 if (Error E = irsymtab::build(Mods, Symtab, StrtabBuilder, Alloc)) {
5542 consumeError(std::move(E));
5543 return;
5544 }
5545
5547 {Symtab.data(), Symtab.size()});
5548}
5549
5551 assert(!WroteStrtab);
5552
5553 std::vector<char> Strtab;
5554 StrtabBuilder.finalizeInOrder();
5555 Strtab.resize(StrtabBuilder.getSize());
5556 StrtabBuilder.write((uint8_t *)Strtab.data());
5557
5559 {Strtab.data(), Strtab.size()});
5560
5561 WroteStrtab = true;
5562}
5563
5565 writeBlob(bitc::STRTAB_BLOCK_ID, bitc::STRTAB_BLOB, Strtab);
5566 WroteStrtab = true;
5567}
5568
5570 bool ShouldPreserveUseListOrder,
5571 const ModuleSummaryIndex *Index,
5572 bool GenerateHash, ModuleHash *ModHash) {
5573 assert(!WroteStrtab);
5574
5575 // The Mods vector is used by irsymtab::build, which requires non-const
5576 // Modules in case it needs to materialize metadata. But the bitcode writer
5577 // requires that the module is materialized, so we can cast to non-const here,
5578 // after checking that it is in fact materialized.
5579 assert(M.isMaterialized());
5580 Mods.push_back(const_cast<Module *>(&M));
5581
5582 ModuleBitcodeWriter ModuleWriter(M, StrtabBuilder, *Stream,
5583 ShouldPreserveUseListOrder, Index,
5584 GenerateHash, ModHash);
5585 ModuleWriter.write();
5586}
5587
5589 const ModuleSummaryIndex *Index,
5590 const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex,
5591 const GVSummaryPtrSet *DecSummaries) {
5592 IndexBitcodeWriter IndexWriter(*Stream, StrtabBuilder, *Index, DecSummaries,
5593 ModuleToSummariesForIndex);
5594 IndexWriter.write();
5595}
5596
5597/// Write the specified module to the specified output stream.
5599 bool ShouldPreserveUseListOrder,
5600 const ModuleSummaryIndex *Index,
5601 bool GenerateHash, ModuleHash *ModHash) {
5602 auto Write = [&](BitcodeWriter &Writer) {
5603 Writer.writeModule(M, ShouldPreserveUseListOrder, Index, GenerateHash,
5604 ModHash);
5605 Writer.writeSymtab();
5606 Writer.writeStrtab();
5607 };
5608 Triple TT(M.getTargetTriple());
5609 if (TT.isOSDarwin() || TT.isOSBinFormatMachO()) {
5610 // If this is darwin or another generic macho target, reserve space for the
5611 // header. Note that the header is computed *after* the output is known, so
5612 // we currently explicitly use a buffer, write to it, and then subsequently
5613 // flush to Out.
5614 SmallVector<char, 0> Buffer;
5615 Buffer.reserve(256 * 1024);
5616 Buffer.insert(Buffer.begin(), BWH_HeaderSize, 0);
5617 BitcodeWriter Writer(Buffer);
5618 Write(Writer);
5619 emitDarwinBCHeaderAndTrailer(Buffer, TT);
5620 Out.write(Buffer.data(), Buffer.size());
5621 } else {
5622 BitcodeWriter Writer(Out);
5623 Write(Writer);
5624 }
5625}
5626
5627void IndexBitcodeWriter::write() {
5629
5630 writeModuleVersion();
5631
5632 // Write the module paths in the combined index.
5633 writeModStrings();
5634
5635 // Write the summary combined index records.
5636 writeCombinedGlobalValueSummary();
5637
5638 Stream.ExitBlock();
5639}
5640
5641// Write the specified module summary index to the given raw output stream,
5642// where it will be written in a new bitcode block. This is used when
5643// writing the combined index file for ThinLTO. When writing a subset of the
5644// index for a distributed backend, provide a \p ModuleToSummariesForIndex map.
5646 const ModuleSummaryIndex &Index, raw_ostream &Out,
5647 const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex,
5648 const GVSummaryPtrSet *DecSummaries) {
5649 SmallVector<char, 0> Buffer;
5650 Buffer.reserve(256 * 1024);
5651
5652 BitcodeWriter Writer(Buffer);
5653 Writer.writeIndex(&Index, ModuleToSummariesForIndex, DecSummaries);
5654 Writer.writeStrtab();
5655
5656 Out.write((char *)&Buffer.front(), Buffer.size());
5657}
5658
5659namespace {
5660
5661/// Class to manage the bitcode writing for a thin link bitcode file.
5662class ThinLinkBitcodeWriter : public ModuleBitcodeWriterBase {
5663 /// ModHash is for use in ThinLTO incremental build, generated while writing
5664 /// the module bitcode file.
5665 const ModuleHash *ModHash;
5666
5667public:
5668 ThinLinkBitcodeWriter(const Module &M, StringTableBuilder &StrtabBuilder,
5669 BitstreamWriter &Stream,
5670 const ModuleSummaryIndex &Index,
5671 const ModuleHash &ModHash)
5672 : ModuleBitcodeWriterBase(M, StrtabBuilder, Stream,
5673 /*ShouldPreserveUseListOrder=*/false, &Index),
5674 ModHash(&ModHash) {}
5675
5676 void write();
5677
5678private:
5679 void writeSimplifiedModuleInfo();
5680};
5681
5682} // end anonymous namespace
5683
5684// This function writes a simpilified module info for thin link bitcode file.
5685// It only contains the source file name along with the name(the offset and
5686// size in strtab) and linkage for global values. For the global value info
5687// entry, in order to keep linkage at offset 5, there are three zeros used
5688// as padding.
5689void ThinLinkBitcodeWriter::writeSimplifiedModuleInfo() {
5691 // Emit the module's source file name.
5692 {
5693 StringEncoding Bits = getStringEncoding(M.getSourceFileName());
5695 if (Bits == SE_Char6)
5696 AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Char6);
5697 else if (Bits == SE_Fixed7)
5698 AbbrevOpToUse = BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7);
5699
5700 // MODULE_CODE_SOURCE_FILENAME: [namechar x N]
5701 auto Abbv = std::make_shared<BitCodeAbbrev>();
5704 Abbv->Add(AbbrevOpToUse);
5705 unsigned FilenameAbbrev = Stream.EmitAbbrev(std::move(Abbv));
5706
5707 for (const auto P : M.getSourceFileName())
5708 Vals.push_back((unsigned char)P);
5709
5710 Stream.EmitRecord(bitc::MODULE_CODE_SOURCE_FILENAME, Vals, FilenameAbbrev);
5711 Vals.clear();
5712 }
5713
5714 // Emit the global variable information.
5715 for (const GlobalVariable &GV : M.globals()) {
5716 // GLOBALVAR: [strtab offset, strtab size, 0, 0, 0, linkage]
5717 Vals.push_back(StrtabBuilder.add(GV.getName()));
5718 Vals.push_back(GV.getName().size());
5719 Vals.push_back(0);
5720 Vals.push_back(0);
5721 Vals.push_back(0);
5722 Vals.push_back(getEncodedLinkage(GV));
5723
5725 Vals.clear();
5726 }
5727
5728 // Emit the function proto information.
5729 for (const Function &F : M) {
5730 // FUNCTION: [strtab offset, strtab size, 0, 0, 0, linkage]
5731 Vals.push_back(StrtabBuilder.add(F.getName()));
5732 Vals.push_back(F.getName().size());
5733 Vals.push_back(0);
5734 Vals.push_back(0);
5735 Vals.push_back(0);
5737
5739 Vals.clear();
5740 }
5741
5742 // Emit the alias information.
5743 for (const GlobalAlias &A : M.aliases()) {
5744 // ALIAS: [strtab offset, strtab size, 0, 0, 0, linkage]
5745 Vals.push_back(StrtabBuilder.add(A.getName()));
5746 Vals.push_back(A.getName().size());
5747 Vals.push_back(0);
5748 Vals.push_back(0);
5749 Vals.push_back(0);
5751
5752 Stream.EmitRecord(bitc::MODULE_CODE_ALIAS, Vals);
5753 Vals.clear();
5754 }
5755
5756 // Emit the ifunc information.
5757 for (const GlobalIFunc &I : M.ifuncs()) {
5758 // IFUNC: [strtab offset, strtab size, 0, 0, 0, linkage]
5759 Vals.push_back(StrtabBuilder.add(I.getName()));
5760 Vals.push_back(I.getName().size());
5761 Vals.push_back(0);
5762 Vals.push_back(0);
5763 Vals.push_back(0);
5765
5766 Stream.EmitRecord(bitc::MODULE_CODE_IFUNC, Vals);
5767 Vals.clear();
5768 }
5769}
5770
5771void ThinLinkBitcodeWriter::write() {
5773
5774 writeModuleVersion();
5775
5776 writeSimplifiedModuleInfo();
5777
5778 writePerModuleGlobalValueSummary();
5779
5780 // Write module hash.
5782
5783 Stream.ExitBlock();
5784}
5785
5787 const ModuleSummaryIndex &Index,
5788 const ModuleHash &ModHash) {
5789 assert(!WroteStrtab);
5790
5791 // The Mods vector is used by irsymtab::build, which requires non-const
5792 // Modules in case it needs to materialize metadata. But the bitcode writer
5793 // requires that the module is materialized, so we can cast to non-const here,
5794 // after checking that it is in fact materialized.
5795 assert(M.isMaterialized());
5796 Mods.push_back(const_cast<Module *>(&M));
5797
5798 ThinLinkBitcodeWriter ThinLinkWriter(M, StrtabBuilder, *Stream, Index,
5799 ModHash);
5800 ThinLinkWriter.write();
5801}
5802
5803// Write the specified thin link bitcode file to the given raw output stream,
5804// where it will be written in a new bitcode block. This is used when
5805// writing the per-module index file for ThinLTO.
5807 const ModuleSummaryIndex &Index,
5808 const ModuleHash &ModHash) {
5809 SmallVector<char, 0> Buffer;
5810 Buffer.reserve(256 * 1024);
5811
5812 BitcodeWriter Writer(Buffer);
5813 Writer.writeThinLinkBitcode(M, Index, ModHash);
5814 Writer.writeSymtab();
5815 Writer.writeStrtab();
5816
5817 Out.write((char *)&Buffer.front(), Buffer.size());
5818}
5819
5820static const char *getSectionNameForBitcode(const Triple &T) {
5821 switch (T.getObjectFormat()) {
5822 case Triple::MachO:
5823 return "__LLVM,__bitcode";
5824 case Triple::COFF:
5825 case Triple::ELF:
5826 case Triple::Wasm:
5828 return ".llvmbc";
5829 case Triple::GOFF:
5830 llvm_unreachable("GOFF is not yet implemented");
5831 break;
5832 case Triple::SPIRV:
5833 if (T.getVendor() == Triple::AMD)
5834 return ".llvmbc";
5835 llvm_unreachable("SPIRV is not yet implemented");
5836 break;
5837 case Triple::XCOFF:
5838 llvm_unreachable("XCOFF is not yet implemented");
5839 break;
5841 llvm_unreachable("DXContainer is not yet implemented");
5842 break;
5843 }
5844 llvm_unreachable("Unimplemented ObjectFormatType");
5845}
5846
5847static const char *getSectionNameForCommandline(const Triple &T) {
5848 switch (T.getObjectFormat()) {
5849 case Triple::MachO:
5850 return "__LLVM,__cmdline";
5851 case Triple::COFF:
5852 case Triple::ELF:
5853 case Triple::Wasm:
5855 return ".llvmcmd";
5856 case Triple::GOFF:
5857 llvm_unreachable("GOFF is not yet implemented");
5858 break;
5859 case Triple::SPIRV:
5860 if (T.getVendor() == Triple::AMD)
5861 return ".llvmcmd";
5862 llvm_unreachable("SPIRV is not yet implemented");
5863 break;
5864 case Triple::XCOFF:
5865 llvm_unreachable("XCOFF is not yet implemented");
5866 break;
5868 llvm_unreachable("DXC is not yet implemented");
5869 break;
5870 }
5871 llvm_unreachable("Unimplemented ObjectFormatType");
5872}
5873
5875 bool EmbedBitcode, bool EmbedCmdline,
5876 const std::vector<uint8_t> &CmdArgs) {
5877 // Save llvm.compiler.used and remove it.
5880 GlobalVariable *Used = collectUsedGlobalVariables(M, UsedGlobals, true);
5881 Type *UsedElementType = Used ? Used->getValueType()->getArrayElementType()
5882 : PointerType::getUnqual(M.getContext());
5883 for (auto *GV : UsedGlobals) {
5884 if (GV->getName() != "llvm.embedded.module" &&
5885 GV->getName() != "llvm.cmdline")
5886 UsedArray.push_back(
5888 }
5889 if (Used)
5890 Used->eraseFromParent();
5891
5892 // Embed the bitcode for the llvm module.
5893 std::string Data;
5894 ArrayRef<uint8_t> ModuleData;
5895 Triple T(M.getTargetTriple());
5896
5897 if (EmbedBitcode) {
5898 if (Buf.getBufferSize() == 0 ||
5899 !isBitcode((const unsigned char *)Buf.getBufferStart(),
5900 (const unsigned char *)Buf.getBufferEnd())) {
5901 // If the input is LLVM Assembly, bitcode is produced by serializing
5902 // the module. Use-lists order need to be preserved in this case.
5904 llvm::WriteBitcodeToFile(M, OS, /* ShouldPreserveUseListOrder */ true);
5905 ModuleData =
5906 ArrayRef<uint8_t>((const uint8_t *)OS.str().data(), OS.str().size());
5907 } else
5908 // If the input is LLVM bitcode, write the input byte stream directly.
5909 ModuleData = ArrayRef<uint8_t>((const uint8_t *)Buf.getBufferStart(),
5910 Buf.getBufferSize());
5911 }
5912 llvm::Constant *ModuleConstant =
5913 llvm::ConstantDataArray::get(M.getContext(), ModuleData);
5915 M, ModuleConstant->getType(), true, llvm::GlobalValue::PrivateLinkage,
5916 ModuleConstant);
5918 // Set alignment to 1 to prevent padding between two contributions from input
5919 // sections after linking.
5920 GV->setAlignment(Align(1));
5921 UsedArray.push_back(
5923 if (llvm::GlobalVariable *Old =
5924 M.getGlobalVariable("llvm.embedded.module", true)) {
5925 assert(Old->hasZeroLiveUses() &&
5926 "llvm.embedded.module can only be used once in llvm.compiler.used");
5927 GV->takeName(Old);
5928 Old->eraseFromParent();
5929 } else {
5930 GV->setName("llvm.embedded.module");
5931 }
5932
5933 // Skip if only bitcode needs to be embedded.
5934 if (EmbedCmdline) {
5935 // Embed command-line options.
5936 ArrayRef<uint8_t> CmdData(const_cast<uint8_t *>(CmdArgs.data()),
5937 CmdArgs.size());
5938 llvm::Constant *CmdConstant =
5939 llvm::ConstantDataArray::get(M.getContext(), CmdData);
5940 GV = new llvm::GlobalVariable(M, CmdConstant->getType(), true,
5942 CmdConstant);
5944 GV->setAlignment(Align(1));
5945 UsedArray.push_back(
5947 if (llvm::GlobalVariable *Old = M.getGlobalVariable("llvm.cmdline", true)) {
5948 assert(Old->hasZeroLiveUses() &&
5949 "llvm.cmdline can only be used once in llvm.compiler.used");
5950 GV->takeName(Old);
5951 Old->eraseFromParent();
5952 } else {
5953 GV->setName("llvm.cmdline");
5954 }
5955 }
5956
5957 if (UsedArray.empty())
5958 return;
5959
5960 // Recreate llvm.compiler.used.
5961 ArrayType *ATy = ArrayType::get(UsedElementType, UsedArray.size());
5962 auto *NewUsed = new GlobalVariable(
5964 llvm::ConstantArray::get(ATy, UsedArray), "llvm.compiler.used");
5965 NewUsed->setSection("llvm.metadata");
5966}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static void writeDIMacro(raw_ostream &Out, const DIMacro *N, AsmWriterContext &WriterCtx)
static void writeDIGlobalVariableExpression(raw_ostream &Out, const DIGlobalVariableExpression *N, AsmWriterContext &WriterCtx)
static void writeDICompositeType(raw_ostream &Out, const DICompositeType *N, AsmWriterContext &WriterCtx)
static void writeDIFixedPointType(raw_ostream &Out, const DIFixedPointType *N, AsmWriterContext &WriterCtx)
static void writeDISubrangeType(raw_ostream &Out, const DISubrangeType *N, AsmWriterContext &WriterCtx)
static void writeDIStringType(raw_ostream &Out, const DIStringType *N, AsmWriterContext &WriterCtx)
static void writeDIGlobalVariable(raw_ostream &Out, const DIGlobalVariable *N, AsmWriterContext &WriterCtx)
static void writeDIBasicType(raw_ostream &Out, const DIBasicType *N, AsmWriterContext &WriterCtx)
static void writeDIModule(raw_ostream &Out, const DIModule *N, AsmWriterContext &WriterCtx)
static void writeDIFile(raw_ostream &Out, const DIFile *N, AsmWriterContext &)
static void writeDISubroutineType(raw_ostream &Out, const DISubroutineType *N, AsmWriterContext &WriterCtx)
static void writeDILabel(raw_ostream &Out, const DILabel *N, AsmWriterContext &WriterCtx)
static void writeDIDerivedType(raw_ostream &Out, const DIDerivedType *N, AsmWriterContext &WriterCtx)
static void writeDIImportedEntity(raw_ostream &Out, const DIImportedEntity *N, AsmWriterContext &WriterCtx)
static void writeDIObjCProperty(raw_ostream &Out, const DIObjCProperty *N, AsmWriterContext &WriterCtx)
static void writeDISubprogram(raw_ostream &Out, const DISubprogram *N, AsmWriterContext &WriterCtx)
static void writeDILocation(raw_ostream &Out, const DILocation *DL, AsmWriterContext &WriterCtx)
static void writeDINamespace(raw_ostream &Out, const DINamespace *N, AsmWriterContext &WriterCtx)
static void writeDICommonBlock(raw_ostream &Out, const DICommonBlock *N, AsmWriterContext &WriterCtx)
static void writeGenericDINode(raw_ostream &Out, const GenericDINode *N, AsmWriterContext &WriterCtx)
static void writeDILocalVariable(raw_ostream &Out, const DILocalVariable *N, AsmWriterContext &WriterCtx)
static void writeDITemplateTypeParameter(raw_ostream &Out, const DITemplateTypeParameter *N, AsmWriterContext &WriterCtx)
static void writeDICompileUnit(raw_ostream &Out, const DICompileUnit *N, AsmWriterContext &WriterCtx)
static void writeDIGenericSubrange(raw_ostream &Out, const DIGenericSubrange *N, AsmWriterContext &WriterCtx)
static void writeDISubrange(raw_ostream &Out, const DISubrange *N, AsmWriterContext &WriterCtx)
static void writeDILexicalBlockFile(raw_ostream &Out, const DILexicalBlockFile *N, AsmWriterContext &WriterCtx)
static void writeDIEnumerator(raw_ostream &Out, const DIEnumerator *N, AsmWriterContext &)
static void writeMDTuple(raw_ostream &Out, const MDTuple *Node, AsmWriterContext &WriterCtx)
static void writeDIExpression(raw_ostream &Out, const DIExpression *N, AsmWriterContext &WriterCtx)
static void writeDIAssignID(raw_ostream &Out, const DIAssignID *DL, AsmWriterContext &WriterCtx)
static void writeDILexicalBlock(raw_ostream &Out, const DILexicalBlock *N, AsmWriterContext &WriterCtx)
static void writeDIArgList(raw_ostream &Out, const DIArgList *N, AsmWriterContext &WriterCtx, bool FromValue=false)
static void writeDITemplateValueParameter(raw_ostream &Out, const DITemplateValueParameter *N, AsmWriterContext &WriterCtx)
static void writeDIMacroFile(raw_ostream &Out, const DIMacroFile *N, AsmWriterContext &WriterCtx)
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static void writeFunctionHeapProfileRecords(BitstreamWriter &Stream, FunctionSummary *FS, unsigned CallsiteAbbrev, unsigned AllocAbbrev, unsigned ContextIdAbbvId, bool PerModule, std::function< unsigned(const ValueInfo &VI)> GetValueID, std::function< unsigned(unsigned)> GetStackIndex, bool WriteContextSizeInfoIndex, DenseMap< CallStackId, LinearCallStackId > &CallStackPos, CallStackId &CallStackCount)
static unsigned serializeSanitizerMetadata(const GlobalValue::SanitizerMetadata &Meta)
static void writeTypeIdCompatibleVtableSummaryRecord(SmallVector< uint64_t, 64 > &NameVals, StringTableBuilder &StrtabBuilder, StringRef Id, const TypeIdCompatibleVtableInfo &Summary, ValueEnumerator &VE)
static void getReferencedTypeIds(FunctionSummary *FS, std::set< GlobalValue::GUID > &ReferencedTypeIds)
Collect type IDs from type tests used by function.
static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind)
static void collectMemProfCallStacks(FunctionSummary *FS, std::function< LinearFrameId(unsigned)> GetStackIndex, MapVector< CallStackId, llvm::SmallVector< LinearFrameId > > &CallStacks)
static unsigned getEncodedUnaryOpcode(unsigned Opcode)
static void emitSignedInt64(SmallVectorImpl< uint64_t > &Vals, uint64_t V)
StringEncoding
@ SE_Char6
@ SE_Fixed7
@ SE_Fixed8
static unsigned getEncodedVisibility(const GlobalValue &GV)
static uint64_t getOptimizationFlags(const Value *V)
static unsigned getEncodedLinkage(const GlobalValue::LinkageTypes Linkage)
static cl::opt< bool > PreserveBitcodeUseListOrder("preserve-bc-uselistorder", cl::Hidden, cl::init(true), cl::desc("Preserve use-list order when writing LLVM bitcode."))
static unsigned getEncodedRMWOperation(AtomicRMWInst::BinOp Op)
static unsigned getEncodedThreadLocalMode(const GlobalValue &GV)
static DenseMap< CallStackId, LinearCallStackId > writeMemoryProfileRadixTree(MapVector< CallStackId, llvm::SmallVector< LinearFrameId > > &&CallStacks, BitstreamWriter &Stream, unsigned RadixAbbrev)
static void writeIdentificationBlock(BitstreamWriter &Stream)
Create the "IDENTIFICATION_BLOCK_ID" containing a single string with the current llvm version,...
static unsigned getEncodedCastOpcode(unsigned Opcode)
static cl::opt< bool > WriteRelBFToSummary("write-relbf-to-summary", cl::Hidden, cl::init(false), cl::desc("Write relative block frequency to function summary "))
static cl::opt< uint32_t > FlushThreshold("bitcode-flush-threshold", cl::Hidden, cl::init(512), cl::desc("The threshold (unit M) for flushing LLVM bitcode."))
static unsigned getEncodedOrdering(AtomicOrdering Ordering)
static unsigned getEncodedUnnamedAddr(const GlobalValue &GV)
static unsigned getEncodedComdatSelectionKind(const Comdat &C)
static uint64_t getEncodedGVSummaryFlags(GlobalValueSummary::GVFlags Flags, bool ImportAsDecl=false)
static void emitDarwinBCHeaderAndTrailer(SmallVectorImpl< char > &Buffer, const Triple &TT)
If generating a bc file on darwin, we have to emit a header and trailer to make it compatible with th...
static void writeBitcodeHeader(BitstreamWriter &Stream)
Helper to write the header common to all bitcode files.
static uint64_t getEncodedRelBFCallEdgeInfo(const CalleeInfo &CI)
static void writeWholeProgramDevirtResolutionByArg(SmallVector< uint64_t, 64 > &NameVals, const std::vector< uint64_t > &args, const WholeProgramDevirtResolution::ByArg &ByArg)
static void emitConstantRange(SmallVectorImpl< uint64_t > &Record, const ConstantRange &CR, bool EmitBitWidth)
static StringEncoding getStringEncoding(StringRef Str)
Determine the encoding to use for the given string name and length.
static uint64_t getEncodedGVarFlags(GlobalVarSummary::GVarFlags Flags)
static const char * getSectionNameForCommandline(const Triple &T)
static cl::opt< unsigned > IndexThreshold("bitcode-mdindex-threshold", cl::Hidden, cl::init(25), cl::desc("Number of metadatas above which we emit an index " "to enable lazy-loading"))
static void writeTypeIdSummaryRecord(SmallVector< uint64_t, 64 > &NameVals, StringTableBuilder &StrtabBuilder, StringRef Id, const TypeIdSummary &Summary)
static void writeFunctionTypeMetadataRecords(BitstreamWriter &Stream, FunctionSummary *FS, Fn GetValueID)
Write the function type metadata related records that need to appear before a function summary entry ...
static uint64_t getEncodedHotnessCallEdgeInfo(const CalleeInfo &CI)
static void emitWideAPInt(SmallVectorImpl< uint64_t > &Vals, const APInt &A)
static void writeStringRecord(BitstreamWriter &Stream, unsigned Code, StringRef Str, unsigned AbbrevToUse)
static void writeWholeProgramDevirtResolution(SmallVector< uint64_t, 64 > &NameVals, StringTableBuilder &StrtabBuilder, uint64_t Id, const WholeProgramDevirtResolution &Wpd)
static unsigned getEncodedDLLStorageClass(const GlobalValue &GV)
static void writeInt32ToBuffer(uint32_t Value, SmallVectorImpl< char > &Buffer, uint32_t &Position)
MetadataAbbrev
@ LastPlusOne
static const char * getSectionNameForBitcode(const Triple &T)
static cl::opt< bool > CombinedIndexMemProfContext("combined-index-memprof-context", cl::Hidden, cl::init(true), cl::desc(""))
static unsigned getEncodedBinaryOpcode(unsigned Opcode)
static uint64_t getEncodedFFlags(FunctionSummary::FFlags Flags)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
DXIL Finalize Linkage
dxil translate DXIL Translate Metadata
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
Hexagon Common GEP
#define _
static MaybeAlign getAlign(Value *Ptr)
Module.h This file contains the declarations for the Module class.
static cl::opt< LTOBitcodeEmbedding > EmbedBitcode("lto-embed-bitcode", cl::init(LTOBitcodeEmbedding::DoNotEmbed), cl::values(clEnumValN(LTOBitcodeEmbedding::DoNotEmbed, "none", "Do not embed"), clEnumValN(LTOBitcodeEmbedding::EmbedOptimized, "optimized", "Embed after all optimization passes"), clEnumValN(LTOBitcodeEmbedding::EmbedPostMergePreOptimized, "post-merge-pre-opt", "Embed post merge, but before optimizations")), cl::desc("Embed LLVM bitcode in object files produced by LTO"))
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
#define G(x, y, z)
Definition MD5.cpp:55
#define H(x, y, z)
Definition MD5.cpp:56
Machine Check Debug Module
This file contains the declarations for metadata subclasses.
#define T
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
nvptx lower args
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
#define P(N)
if(PassOpts->AAPipeline)
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallString class.
This file defines the SmallVector class.
static unsigned getBitWidth(Type *Ty, const DataLayout &DL)
Returns the bitwidth of the given scalar or pointer type.
static const uint32_t IV[8]
Definition blake3_impl.h:83
Class for arbitrary precision integers.
Definition APInt.h:78
unsigned getActiveWords() const
Compute the number of active words in the value of this APInt.
Definition APInt.h:1519
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
Definition APInt.h:570
int64_t getSExtValue() const
Get sign extended value.
Definition APInt.h:1563
const GlobalValueSummary & getAliasee() const
bool isSwiftError() const
Return true if this alloca is used as a swifterror argument to a call.
Align getAlign() const
Return the alignment of the memory that is being allocated by the instruction.
Type * getAllocatedType() const
Return the type that is being allocated by the instruction.
bool isUsedWithInAlloca() const
Return true if this alloca is used as an inalloca argument to a call.
unsigned getAddressSpace() const
Return the address space for the allocation.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
size - Get the array size.
Definition ArrayRef.h:142
bool empty() const
empty - Check if the array is empty.
Definition ArrayRef.h:137
Class to represent array types.
static LLVM_ABI ArrayType * get(Type *ElementType, uint64_t NumElements)
This static method is the primary way to construct an ArrayType.
BinOp
This enumeration lists the possible modifications atomicrmw can make.
@ Add
*p = old + v
@ FAdd
*p = old + v
@ USubCond
Subtract only if no unsigned overflow.
@ FMinimum
*p = minimum(old, v) minimum matches the behavior of llvm.minimum.
@ Min
*p = old <signed v ? old : v
@ Sub
*p = old - v
@ And
*p = old & v
@ Xor
*p = old ^ v
@ USubSat
*p = usub.sat(old, v) usub.sat matches the behavior of llvm.usub.sat.
@ FMaximum
*p = maximum(old, v) maximum matches the behavior of llvm.maximum.
@ FSub
*p = old - v
@ UIncWrap
Increment one up to a maximum value.
@ Max
*p = old >signed v ? old : v
@ UMin
*p = old <unsigned v ? old : v
@ FMin
*p = minnum(old, v) minnum matches the behavior of llvm.minnum.
@ UMax
*p = old >unsigned v ? old : v
@ FMax
*p = maxnum(old, v) maxnum matches the behavior of llvm.maxnum.
@ UDecWrap
Decrement one until a minimum value or zero.
@ Nand
*p = ~(old & v)
bool hasAttributes() const
Return true if attributes exists in this set.
Definition Attributes.h:431
AttrKind
This enumeration lists the attributes that can be associated with parameters, function results,...
Definition Attributes.h:88
@ TombstoneKey
Use as Tombstone key for DenseMap of AttrKind.
Definition Attributes.h:95
@ None
No attributes have been set.
Definition Attributes.h:90
@ EmptyKey
Use as Empty key for DenseMap of AttrKind.
Definition Attributes.h:94
@ EndAttrKinds
Sentinel value useful for loops.
Definition Attributes.h:93
BitCodeAbbrevOp - This describes one or more operands in an abbreviation.
Definition BitCodes.h:34
static bool isChar6(char C)
isChar6 - Return true if this character is legal in the Char6 encoding.
Definition BitCodes.h:88
LLVM_ABI void writeThinLinkBitcode(const Module &M, const ModuleSummaryIndex &Index, const ModuleHash &ModHash)
Write the specified thin link bitcode file (i.e., the minimized bitcode file) to the buffer specified...
LLVM_ABI void writeIndex(const ModuleSummaryIndex *Index, const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex, const GVSummaryPtrSet *DecSummaries)
LLVM_ABI void copyStrtab(StringRef Strtab)
Copy the string table for another module into this bitcode file.
LLVM_ABI void writeStrtab()
Write the bitcode file's string table.
LLVM_ABI void writeSymtab()
Attempt to write a symbol table to the bitcode file.
LLVM_ABI void writeModule(const Module &M, bool ShouldPreserveUseListOrder=false, const ModuleSummaryIndex *Index=nullptr, bool GenerateHash=false, ModuleHash *ModHash=nullptr)
Write the specified module to the buffer specified at construction time.
LLVM_ABI BitcodeWriter(SmallVectorImpl< char > &Buffer)
Create a BitcodeWriter that writes to Buffer.
unsigned EmitAbbrev(std::shared_ptr< BitCodeAbbrev > Abbv)
Emits the abbreviation Abbv to the stream.
void markAndBlockFlushing()
For scenarios where the user wants to access a section of the stream to (for example) compute some ch...
StringRef getMarkedBufferAndResumeFlushing()
resumes flushing, but does not flush, and returns the section in the internal buffer starting from th...
void EmitRecord(unsigned Code, const Container &Vals, unsigned Abbrev=0)
EmitRecord - Emit the specified record to the stream, using an abbrev if we have one to compress the ...
void Emit(uint32_t Val, unsigned NumBits)
void EmitRecordWithBlob(unsigned Abbrev, const Container &Vals, StringRef Blob)
EmitRecordWithBlob - Emit the specified record to the stream, using an abbrev that includes a blob at...
unsigned EmitBlockInfoAbbrev(unsigned BlockID, std::shared_ptr< BitCodeAbbrev > Abbv)
EmitBlockInfoAbbrev - Emit a DEFINE_ABBREV record for the specified BlockID.
void EnterBlockInfoBlock()
EnterBlockInfoBlock - Start emitting the BLOCKINFO_BLOCK.
void BackpatchWord(uint64_t BitNo, unsigned Val)
void BackpatchWord64(uint64_t BitNo, uint64_t Val)
void EnterSubblock(unsigned BlockID, unsigned CodeLen)
uint64_t GetCurrentBitNo() const
Retrieve the current position in the stream, in bits.
void EmitRecordWithAbbrev(unsigned Abbrev, const Container &Vals)
EmitRecordWithAbbrev - Emit a record with the specified abbreviation.
static LLVM_ABI BlockAddress * lookup(const BasicBlock *BB)
Lookup an existing BlockAddress constant for the given BasicBlock.
OperandBundleUse getOperandBundleAt(unsigned Index) const
Return the operand bundle at a specific index.
unsigned getNumOperandBundles() const
Return the number of operand bundles associated with this User.
CallingConv::ID getCallingConv() const
Value * getCalledOperand() const
Value * getArgOperand(unsigned i) const
FunctionType * getFunctionType() const
unsigned arg_size() const
AttributeList getAttributes() const
Return the attributes for this call.
bool hasOperandBundles() const
Return true if this User has any operand bundles.
BasicBlock * getIndirectDest(unsigned i) const
BasicBlock * getDefaultDest() const
unsigned getNumIndirectDests() const
Return the number of callbr indirect dest labels.
bool isNoTailCall() const
bool isTailCall() const
bool isMustTailCall() const
iterator_range< NestedIterator > forGuid(GlobalValue::GUID GUID) const
@ Largest
The linker will choose the largest COMDAT.
Definition Comdat.h:39
@ SameSize
The data referenced by the COMDAT must be the same size.
Definition Comdat.h:41
@ Any
The linker may choose any COMDAT.
Definition Comdat.h:37
@ NoDeduplicate
No deduplication is performed.
Definition Comdat.h:40
@ ExactMatch
The data referenced by the COMDAT must be the same.
Definition Comdat.h:38
static LLVM_ABI Constant * get(ArrayType *T, ArrayRef< Constant * > V)
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
Definition Constants.h:720
static LLVM_ABI Constant * getPointerBitCastOrAddrSpaceCast(Constant *C, Type *Ty)
Create a BitCast or AddrSpaceCast for a pointer type depending on the address space.
This class represents a range of values.
const APInt & getLower() const
Return the lower value for this range.
const APInt & getUpper() const
Return the upper value for this range.
uint32_t getBitWidth() const
Get the bit width of this ConstantRange.
This is an important base class in LLVM.
Definition Constant.h:43
DebugLoc getDebugLoc() const
LLVM_ABI DIAssignID * getAssignID() const
DIExpression * getExpression() const
DILocalVariable * getVariable() const
Metadata * getRawLocation() const
Returns the metadata operand for the first location description.
DIExpression * getAddressExpression() const
unsigned size() const
Definition DenseMap.h:110
size_type count(const_arg_type_t< KeyT > Val) const
Return 1 if the specified key is in the map, 0 otherwise.
Definition DenseMap.h:174
bool contains(const_arg_type_t< KeyT > Val) const
Return true if the specified key is in the map, false otherwise.
Definition DenseMap.h:169
std::pair< iterator, bool > insert(const std::pair< KeyT, ValueT > &KV)
Definition DenseMap.h:241
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
idx_iterator idx_end() const
idx_iterator idx_begin() const
Function summary information to aid decisions and implementation of importing.
ForceSummaryHotnessType
Types for -force-summary-edges-cold debugging option.
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
LLVM_ABI void setSection(StringRef S)
Change the section for this global.
Definition Globals.cpp:275
GVFlags flags() const
Get the flags for this GlobalValue (see struct GVFlags).
StringRef modulePath() const
Get the path to the module containing this function.
ArrayRef< ValueInfo > refs() const
Return the list of values referenced by this global value definition.
VisibilityTypes getVisibility() const
static bool isLocalLinkage(LinkageTypes Linkage)
LinkageTypes getLinkage() const
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
ThreadLocalMode getThreadLocalMode() const
@ DLLExportStorageClass
Function to be accessible from DLL.
Definition GlobalValue.h:77
@ DLLImportStorageClass
Function to be imported from DLL.
Definition GlobalValue.h:76
@ DefaultVisibility
The GV is visible.
Definition GlobalValue.h:68
@ HiddenVisibility
The GV is hidden.
Definition GlobalValue.h:69
@ ProtectedVisibility
The GV is protected.
Definition GlobalValue.h:70
UnnamedAddr getUnnamedAddr() const
LinkageTypes
An enumeration for the kinds of linkage for global values.
Definition GlobalValue.h:52
@ PrivateLinkage
Like Internal, but omit from symbol table.
Definition GlobalValue.h:61
@ CommonLinkage
Tentative definitions.
Definition GlobalValue.h:63
@ InternalLinkage
Rename collisions when linking (static functions).
Definition GlobalValue.h:60
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
Definition GlobalValue.h:55
@ WeakODRLinkage
Same, but only replaced by something equivalent.
Definition GlobalValue.h:58
@ ExternalLinkage
Externally visible function.
Definition GlobalValue.h:53
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
Definition GlobalValue.h:57
@ AppendingLinkage
Special purpose, only applies to global arrays.
Definition GlobalValue.h:59
@ AvailableExternallyLinkage
Available for inspection, not emission.
Definition GlobalValue.h:54
@ ExternalWeakLinkage
ExternalWeak linkage description.
Definition GlobalValue.h:62
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Definition GlobalValue.h:56
DLLStorageClassTypes getDLLStorageClass() const
void setAlignment(Align Align)
Sets the alignment attribute of the GlobalVariable.
idx_iterator idx_end() const
idx_iterator idx_begin() const
bool isCast() const
bool isCleanup() const
Return 'true' if this landingpad instruction is a cleanup.
unsigned getNumClauses() const
Get the number of clauses for this landing pad.
bool isCatch(unsigned Idx) const
Return 'true' if the clause and index Idx is a catch clause.
Constant * getClause(unsigned Idx) const
Get the value of the clause at index Idx.
This class implements a map that also provides access to all stored values in a deterministic order.
Definition MapVector.h:36
bool empty() const
Definition MapVector.h:77
size_t getBufferSize() const
const char * getBufferStart() const
const char * getBufferEnd() const
Class to hold module path string table and global value map, and encapsulate methods for operating on...
static constexpr uint64_t BitcodeSummaryVersion
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
BasicBlock * getIncomingBlock(unsigned i) const
Return incoming basic block number i.
Value * getIncomingValue(unsigned i) const
Return incoming value number x.
unsigned getNumIncomingValues() const
Return the number of incoming edges.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
LLVM_ABI void update(ArrayRef< uint8_t > Data)
Digest more data.
Definition SHA1.cpp:208
LLVM_ABI std::array< uint8_t, 20 > result()
Return the current raw 160-bits SHA1 for the digested data since the last call to init().
Definition SHA1.cpp:288
size_type size() const
Determine the number of elements in the SetVector.
Definition SetVector.h:103
bool empty() const
Determine if the SetVector is empty or not.
Definition SetVector.h:100
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:151
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
void append(StringRef RHS)
Append from a StringRef.
Definition SmallString.h:68
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void assign(size_type NumElts, ValueParamT Elt)
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
iterator insert(iterator I, T &&Elt)
void resize(size_type N)
void push_back(const T &Elt)
pointer data()
Return a pointer to the vector's buffer, even if empty().
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
const ValueTy & getValue() const
StringRef getKey() const
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr bool empty() const
empty - Check if the string is empty.
Definition StringRef.h:143
iterator begin() const
Definition StringRef.h:112
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:146
iterator end() const
Definition StringRef.h:114
Utility for building string tables with deduplicated suffixes.
LLVM_ABI size_t add(CachedHashStringRef S, uint8_t Priority=0)
Add a string to the builder.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:47
@ UnknownObjectFormat
Definition Triple.h:320
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
bool isX86_FP80Ty() const
Return true if this is x86 long double.
Definition Type.h:159
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
Definition Type.h:153
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
Definition Type.h:145
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
Definition Type.h:165
bool isFP128Ty() const
Return true if this is 'fp128'.
Definition Type.h:162
Type * getScalarType() const
If this is a vector type, return the element type, otherwise return 'this'.
Definition Type.h:352
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
Definition Type.h:142
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
Definition Type.h:156
Value * getValue() const
Definition Metadata.h:498
std::vector< std::pair< const Value *, unsigned > > ValueList
unsigned getTypeID(Type *T) const
unsigned getMetadataID(const Metadata *MD) const
UseListOrderStack UseListOrders
ArrayRef< const Metadata * > getNonMDStrings() const
Get the non-MDString metadata for this block.
unsigned getInstructionID(const Instruction *I) const
unsigned getAttributeListID(AttributeList PAL) const
void incorporateFunction(const Function &F)
incorporateFunction/purgeFunction - If you'd like to deal with a function, use these two methods to g...
void getFunctionConstantRange(unsigned &Start, unsigned &End) const
getFunctionConstantRange - Return the range of values that corresponds to function-local constants.
unsigned getAttributeGroupID(IndexAndAttrSet Group) const
bool hasMDs() const
Check whether the current block has any metadata to emit.
unsigned getComdatID(const Comdat *C) const
uint64_t computeBitsRequiredForTypeIndices() const
unsigned getValueID(const Value *V) const
unsigned getMetadataOrNullID(const Metadata *MD) const
const std::vector< IndexAndAttrSet > & getAttributeGroups() const
const ValueList & getValues() const
unsigned getGlobalBasicBlockID(const BasicBlock *BB) const
getGlobalBasicBlockID - This returns the function-specific ID for the specified basic block.
void setInstructionID(const Instruction *I)
const std::vector< const BasicBlock * > & getBasicBlocks() const
const std::vector< AttributeList > & getAttributeLists() const
bool shouldPreserveUseListOrder() const
const ComdatSetType & getComdats() const
std::vector< Type * > TypeList
ArrayRef< const Metadata * > getMDStrings() const
Get the MDString metadata for this block.
std::pair< unsigned, AttributeSet > IndexAndAttrSet
Attribute groups as encoded in bitcode are almost AttributeSets, but they include the AttributeList i...
const TypeList & getTypes() const
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
LLVM_ABI void setName(const Twine &Name)
Change the name of the value.
Definition Value.cpp:390
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.cpp:1099
LLVM_ABI void takeName(Value *V)
Transfer the name from V to this value.
Definition Value.cpp:396
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:202
void build(llvm::MapVector< CallStackId, llvm::SmallVector< FrameIdTy > > &&MemProfCallStackData, const llvm::DenseMap< FrameIdTy, LinearFrameId > *MemProfFrameIndexes, llvm::DenseMap< FrameIdTy, FrameStat > &FrameHistogram)
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
raw_ostream & write(unsigned char C)
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
CallInst * Call
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
@ Entry
Definition COFF.h:862
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
Predicate getPredicate(unsigned Condition, unsigned Hint)
Return predicate consisting of specified condition and hint bits.
@ CE
Windows NT (Windows on ARM)
Definition MCAsmInfo.h:48
@ TYPE_CODE_TARGET_TYPE
@ TYPE_CODE_STRUCT_ANON
@ TYPE_CODE_STRUCT_NAME
@ TYPE_CODE_OPAQUE_POINTER
@ TYPE_CODE_STRUCT_NAMED
@ METADATA_COMMON_BLOCK
@ METADATA_TEMPLATE_VALUE
@ METADATA_LEXICAL_BLOCK_FILE
@ METADATA_INDEX_OFFSET
@ METADATA_LEXICAL_BLOCK
@ METADATA_SUBROUTINE_TYPE
@ METADATA_GLOBAL_DECL_ATTACHMENT
@ METADATA_OBJC_PROPERTY
@ METADATA_IMPORTED_ENTITY
@ METADATA_GENERIC_SUBRANGE
@ METADATA_COMPILE_UNIT
@ METADATA_COMPOSITE_TYPE
@ METADATA_FIXED_POINT_TYPE
@ METADATA_DERIVED_TYPE
@ METADATA_SUBRANGE_TYPE
@ METADATA_TEMPLATE_TYPE
@ METADATA_GLOBAL_VAR_EXPR
@ METADATA_DISTINCT_NODE
@ METADATA_GENERIC_DEBUG
GlobalValueSummarySymtabCodes
@ FS_CONTEXT_RADIX_TREE_ARRAY
@ FS_COMBINED_GLOBALVAR_INIT_REFS
@ FS_TYPE_CHECKED_LOAD_VCALLS
@ FS_COMBINED_ORIGINAL_NAME
@ FS_PERMODULE_VTABLE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_CONST_VCALL
@ FS_PERMODULE_GLOBALVAR_INIT_REFS
@ FS_TYPE_TEST_ASSUME_VCALLS
@ FS_COMBINED_ALLOC_INFO_NO_CONTEXT
@ FS_CFI_FUNCTION_DECLS
@ FS_COMBINED_CALLSITE_INFO
@ FS_COMBINED_ALLOC_INFO
@ FS_PERMODULE_CALLSITE_INFO
@ FS_PERMODULE_ALLOC_INFO
@ FS_TYPE_CHECKED_LOAD_CONST_VCALL
@ BITCODE_CURRENT_EPOCH
@ IDENTIFICATION_CODE_EPOCH
@ IDENTIFICATION_CODE_STRING
@ CST_CODE_BLOCKADDRESS
@ CST_CODE_NO_CFI_VALUE
@ CST_CODE_CE_SHUFVEC_EX
@ CST_CODE_CE_EXTRACTELT
@ CST_CODE_CE_SHUFFLEVEC
@ CST_CODE_WIDE_INTEGER
@ CST_CODE_DSO_LOCAL_EQUIVALENT
@ CST_CODE_CE_INSERTELT
@ CST_CODE_CE_GEP_WITH_INRANGE
@ COMDAT_SELECTION_KIND_LARGEST
@ COMDAT_SELECTION_KIND_ANY
@ COMDAT_SELECTION_KIND_SAME_SIZE
@ COMDAT_SELECTION_KIND_EXACT_MATCH
@ COMDAT_SELECTION_KIND_NO_DUPLICATES
@ ATTR_KIND_STACK_PROTECT
@ ATTR_KIND_STACK_PROTECT_STRONG
@ ATTR_KIND_SANITIZE_MEMORY
@ ATTR_KIND_OPTIMIZE_FOR_SIZE
@ ATTR_KIND_SWIFT_ERROR
@ ATTR_KIND_NO_CALLBACK
@ ATTR_KIND_FNRETTHUNK_EXTERN
@ ATTR_KIND_NO_DIVERGENCE_SOURCE
@ ATTR_KIND_SANITIZE_ADDRESS
@ ATTR_KIND_NO_IMPLICIT_FLOAT
@ ATTR_KIND_DEAD_ON_UNWIND
@ ATTR_KIND_STACK_ALIGNMENT
@ ATTR_KIND_STACK_PROTECT_REQ
@ ATTR_KIND_INLINE_HINT
@ ATTR_KIND_NULL_POINTER_IS_VALID
@ ATTR_KIND_SANITIZE_HWADDRESS
@ ATTR_KIND_MUSTPROGRESS
@ ATTR_KIND_RETURNS_TWICE
@ ATTR_KIND_SHADOWCALLSTACK
@ ATTR_KIND_OPT_FOR_FUZZING
@ ATTR_KIND_SANITIZE_NUMERICAL_STABILITY
@ ATTR_KIND_INITIALIZES
@ ATTR_KIND_ALLOCATED_POINTER
@ ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION
@ ATTR_KIND_SKIP_PROFILE
@ ATTR_KIND_ELEMENTTYPE
@ ATTR_KIND_CORO_ELIDE_SAFE
@ ATTR_KIND_NO_DUPLICATE
@ ATTR_KIND_ALLOC_ALIGN
@ ATTR_KIND_NON_LAZY_BIND
@ ATTR_KIND_DEREFERENCEABLE
@ ATTR_KIND_OPTIMIZE_NONE
@ ATTR_KIND_HYBRID_PATCHABLE
@ ATTR_KIND_NO_RED_ZONE
@ ATTR_KIND_DEREFERENCEABLE_OR_NULL
@ ATTR_KIND_SANITIZE_REALTIME
@ ATTR_KIND_SPECULATIVE_LOAD_HARDENING
@ ATTR_KIND_ALWAYS_INLINE
@ ATTR_KIND_SANITIZE_TYPE
@ ATTR_KIND_PRESPLIT_COROUTINE
@ ATTR_KIND_VSCALE_RANGE
@ ATTR_KIND_SANITIZE_ALLOC_TOKEN
@ ATTR_KIND_NO_SANITIZE_COVERAGE
@ ATTR_KIND_NO_CREATE_UNDEF_OR_POISON
@ ATTR_KIND_SPECULATABLE
@ ATTR_KIND_DEAD_ON_RETURN
@ ATTR_KIND_SANITIZE_REALTIME_BLOCKING
@ ATTR_KIND_NO_SANITIZE_BOUNDS
@ ATTR_KIND_SANITIZE_MEMTAG
@ ATTR_KIND_CORO_ONLY_DESTROY_WHEN_COMPLETE
@ ATTR_KIND_SANITIZE_THREAD
@ ATTR_KIND_OPTIMIZE_FOR_DEBUGGING
@ ATTR_KIND_PREALLOCATED
@ ATTR_KIND_SWIFT_ASYNC
@ SYNC_SCOPE_NAMES_BLOCK_ID
@ PARAMATTR_GROUP_BLOCK_ID
@ METADATA_KIND_BLOCK_ID
@ IDENTIFICATION_BLOCK_ID
@ GLOBALVAL_SUMMARY_BLOCK_ID
@ METADATA_ATTACHMENT_ID
@ FULL_LTO_GLOBALVAL_SUMMARY_BLOCK_ID
@ MODULE_STRTAB_BLOCK_ID
@ VALUE_SYMTAB_BLOCK_ID
@ OPERAND_BUNDLE_TAGS_BLOCK_ID
@ MODULE_CODE_VERSION
@ MODULE_CODE_SOURCE_FILENAME
@ MODULE_CODE_SECTIONNAME
@ MODULE_CODE_DATALAYOUT
@ MODULE_CODE_GLOBALVAR
@ MODULE_CODE_VSTOFFSET
@ FUNC_CODE_INST_CATCHRET
@ FUNC_CODE_INST_LANDINGPAD
@ FUNC_CODE_INST_EXTRACTVAL
@ FUNC_CODE_INST_CATCHPAD
@ FUNC_CODE_INST_RESUME
@ FUNC_CODE_INST_CALLBR
@ FUNC_CODE_INST_CATCHSWITCH
@ FUNC_CODE_INST_VSELECT
@ FUNC_CODE_INST_CLEANUPRET
@ FUNC_CODE_DEBUG_RECORD_VALUE
@ FUNC_CODE_INST_LOADATOMIC
@ FUNC_CODE_DEBUG_RECORD_ASSIGN
@ FUNC_CODE_INST_STOREATOMIC
@ FUNC_CODE_INST_ATOMICRMW
@ FUNC_CODE_DEBUG_RECORD_DECLARE_VALUE
@ FUNC_CODE_DEBUG_LOC_AGAIN
@ FUNC_CODE_INST_EXTRACTELT
@ FUNC_CODE_INST_INDIRECTBR
@ FUNC_CODE_INST_INVOKE
@ FUNC_CODE_DEBUG_RECORD_VALUE_SIMPLE
@ FUNC_CODE_INST_INSERTVAL
@ FUNC_CODE_DECLAREBLOCKS
@ FUNC_CODE_DEBUG_RECORD_LABEL
@ FUNC_CODE_INST_SWITCH
@ FUNC_CODE_INST_ALLOCA
@ FUNC_CODE_INST_INSERTELT
@ FUNC_CODE_BLOCKADDR_USERS
@ FUNC_CODE_INST_CLEANUPPAD
@ FUNC_CODE_INST_SHUFFLEVEC
@ FUNC_CODE_INST_FREEZE
@ FUNC_CODE_INST_CMPXCHG
@ FUNC_CODE_INST_UNREACHABLE
@ FUNC_CODE_DEBUG_RECORD_DECLARE
@ FUNC_CODE_OPERAND_BUNDLE
@ FIRST_APPLICATION_ABBREV
@ PARAMATTR_GRP_CODE_ENTRY
initializer< Ty > init(const Ty &Val)
@ DW_APPLE_ENUM_KIND_invalid
Enum kind for invalid results.
Definition Dwarf.h:51
LLVM_ABI Error build(ArrayRef< Module * > Mods, SmallVector< char, 0 > &Symtab, StringTableBuilder &StrtabBuilder, BumpPtrAllocator &Alloc)
Fills in Symtab and StrtabBuilder with a valid symbol and string table for Mods.
Definition IRSymtab.cpp:361
llvm::unique_function< void(llvm::Expected< T >)> Callback
A Callback<T> is a void function that accepts Expected<T>.
Definition Transport.h:139
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract_or_null(Y &&MD)
Extract a Value from Metadata, allowing null.
Definition Metadata.h:682
LLVM_ABI bool metadataIncludesAllContextSizeInfo()
Whether the alloc memeprof metadata will include context size info for all MIBs.
template LLVM_ABI llvm::DenseMap< LinearFrameId, FrameStat > computeFrameHistogram< LinearFrameId >(llvm::MapVector< CallStackId, llvm::SmallVector< LinearFrameId > > &MemProfCallStackData)
LLVM_ABI bool metadataMayIncludeContextSizeInfo()
Whether the alloc memprof metadata may include context size info for some MIBs (but possibly not all)...
uint32_t LinearFrameId
Definition MemProf.h:238
uint64_t CallStackId
Definition MemProf.h:352
NodeAddr< CodeNode * > Code
Definition RDFGraph.h:388
void write32le(void *P, uint32_t V)
Definition Endian.h:475
uint32_t read32be(const void *P)
Definition Endian.h:441
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
unsigned Log2_32_Ceil(uint32_t Value)
Return the ceil log base 2 of the specified value, 32 if the value is zero.
Definition MathExtras.h:344
FunctionAddr VTableAddr Value
Definition InstrProf.h:137
StringMapEntry< Value * > ValueName
Definition Value.h:56
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1655
std::unordered_set< GlobalValueSummary * > GVSummaryPtrSet
A set of global value summary pointers.
unsigned encode(MaybeAlign A)
Returns a representation of the alignment that encodes undefined as 0.
Definition Alignment.h:206
LLVM_ABI void WriteBitcodeToFile(const Module &M, raw_ostream &Out, bool ShouldPreserveUseListOrder=false, const ModuleSummaryIndex *Index=nullptr, bool GenerateHash=false, ModuleHash *ModHash=nullptr)
Write the specified module to the specified raw output stream.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2472
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
std::array< uint32_t, 5 > ModuleHash
160 bits SHA1
LLVM_ABI void writeThinLinkBitcodeToFile(const Module &M, raw_ostream &Out, const ModuleSummaryIndex &Index, const ModuleHash &ModHash)
Write the specified thin link bitcode file (i.e., the minimized bitcode file) to the given raw output...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
@ BWH_HeaderSize
FunctionSummary::ForceSummaryHotnessType ForceSummaryEdgesCold
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2136
LLVM_ABI void writeIndexToFile(const ModuleSummaryIndex &Index, raw_ostream &Out, const ModuleToSummariesForIndexTy *ModuleToSummariesForIndex=nullptr, const GVSummaryPtrSet *DecSummaries=nullptr)
Write the specified module summary index to the given raw output stream, where it will be written in ...
LLVM_ABI void embedBitcodeInModule(Module &M, MemoryBufferRef Buf, bool EmbedBitcode, bool EmbedCmdline, const std::vector< uint8_t > &CmdArgs)
If EmbedBitcode is set, save a copy of the llvm IR as data in the __LLVM,__bitcode section (....
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1732
FunctionAddr VTableAddr uintptr_t uintptr_t Version
Definition InstrProf.h:302
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1622
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
std::map< std::string, GVSummaryMapTy, std::less<> > ModuleToSummariesForIndexTy
Map of a module name to the GUIDs and summaries we will import from that module.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
AtomicOrdering
Atomic ordering for LLVM's memory model.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1835
constexpr unsigned BitWidth
LLVM_ABI Error write(MCStreamer &Out, ArrayRef< std::string > Inputs, OnCuIndexOverflow OverflowOptValue, Dwarf64StrOffsetsPromotion StrOffsetsOptValue)
Definition DWP.cpp:677
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
bool isBitcode(const unsigned char *BufPtr, const unsigned char *BufEnd)
isBitcode - Return true if the given bytes are the magic bytes for LLVM IR bitcode,...
void consumeError(Error Err)
Consume a Error without doing anything.
Definition Error.h:1083
LLVM_ABI GlobalVariable * collectUsedGlobalVariables(const Module &M, SmallVectorImpl< GlobalValue * > &Vec, bool CompilerUsed)
Given "llvm.used" or "llvm.compiler.used" as a global name, collect the initializer elements of that ...
Definition Module.cpp:870
#define N
#define NC
Definition regutils.h:42
#define NDEBUG
Definition regutils.h:48
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
static void set(StorageType &Packed, typename Bitfield::Type Value)
Sets the typed value in the provided Packed value.
Definition Bitfields.h:223
Class to accumulate and hold information about a callee.
static constexpr unsigned RelBlockFreqBits
The value stored in RelBlockFreq has to be interpreted as the digits of a scaled number with a scale ...
Flags specific to function summaries.
static constexpr uint32_t RangeWidth
Group flags (Linkage, NotEligibleToImport, etc.) as a bitfield.
static const Target * lookupTarget(StringRef TripleStr, std::string &Error)
lookupTarget - Lookup a target based on a target triple.
Struct that holds a reference to a particular GUID in a global value summary.
uint64_t Info
Additional information for the resolution:
enum llvm::WholeProgramDevirtResolution::ByArg::Kind TheKind
enum llvm::WholeProgramDevirtResolution::Kind TheKind
std::map< std::vector< uint64_t >, ByArg > ResByArg
Resolutions for calls with all constant integer arguments (excluding the first argument,...