diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2022-03-20 11:40:34 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2022-05-14 11:43:05 +0000 |
commit | 349cc55c9796c4596a5b9904cd3281af295f878f (patch) | |
tree | 410c5a785075730a35f1272ca6a7adf72222ad03 /contrib/llvm-project/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | |
parent | cb2ae6163174b90e999326ecec3699ee093a5d43 (diff) | |
parent | c0981da47d5696fe36474fcf86b4ce03ae3ff818 (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 77 |
1 files changed, 34 insertions, 43 deletions
diff --git a/contrib/llvm-project/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/contrib/llvm-project/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 0a202c376981..1e9a9197aed7 100644 --- a/contrib/llvm-project/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/contrib/llvm-project/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -58,6 +58,7 @@ #include "llvm/IR/Value.h" #include "llvm/IR/ValueSymbolTable.h" #include "llvm/MC/StringTableBuilder.h" +#include "llvm/MC/TargetRegistry.h" #include "llvm/Object/IRSymtab.h" #include "llvm/Support/AtomicOrdering.h" #include "llvm/Support/Casting.h" @@ -67,7 +68,6 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/SHA1.h" -#include "llvm/Support/TargetRegistry.h" #include "llvm/Support/raw_ostream.h" #include <algorithm> #include <cassert> @@ -142,7 +142,6 @@ public: : Stream(Stream), StrtabBuilder(StrtabBuilder) {} protected: - void writeBitcodeHeader(); void writeModuleVersion(); }; @@ -374,7 +373,6 @@ private: void writeModuleMetadata(); void writeFunctionMetadata(const Function &F); void writeFunctionMetadataAttachment(const Function &F); - void writeGlobalVariableMetadataAttachment(const GlobalVariable &GV); void pushGlobalMetadataAttachment(SmallVectorImpl<uint64_t> &Record, const GlobalObject &GO); void writeModuleMetadataKinds(); @@ -628,6 +626,8 @@ static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind) { return bitc::ATTR_KIND_IN_ALLOCA; case Attribute::Cold: return bitc::ATTR_KIND_COLD; + case Attribute::DisableSanitizerInstrumentation: + return bitc::ATTR_KIND_DISABLE_SANITIZER_INSTRUMENTATION; case Attribute::Hot: return bitc::ATTR_KIND_HOT; case Attribute::ElementType: @@ -835,7 +835,7 @@ void ModuleBitcodeWriter::writeAttributeTable() { SmallVector<uint64_t, 64> Record; for (unsigned i = 0, e = Attrs.size(); i != e; ++i) { AttributeList AL = Attrs[i]; - for (unsigned i = AL.index_begin(), e = AL.index_end(); i != e; ++i) { + for (unsigned i : AL.indexes()) { AttributeSet AS = AL.getAttributes(i); if (AS.hasAttributes()) Record.push_back(VE.getAttributeGroupID({i, AS})); @@ -973,9 +973,8 @@ void ModuleBitcodeWriter::writeTypeTable() { // STRUCT: [ispacked, eltty x N] TypeVals.push_back(ST->isPacked()); // Output all of the element types. - for (StructType::element_iterator I = ST->element_begin(), - E = ST->element_end(); I != E; ++I) - TypeVals.push_back(VE.getTypeID(*I)); + for (Type *ET : ST->elements()) + TypeVals.push_back(VE.getTypeID(ET)); if (ST->isLiteral()) { Code = bitc::TYPE_CODE_STRUCT_ANON; @@ -1066,6 +1065,9 @@ static uint64_t getEncodedFFlags(FunctionSummary::FFlags Flags) { RawFlags |= (Flags.ReturnDoesNotAlias << 3); RawFlags |= (Flags.NoInline << 4); RawFlags |= (Flags.AlwaysInline << 5); + RawFlags |= (Flags.NoUnwind << 6); + RawFlags |= (Flags.MayThrow << 7); + RawFlags |= (Flags.HasUnknownCall << 8); return RawFlags; } @@ -1687,6 +1689,8 @@ void ModuleBitcodeWriter::writeDIDerivedType(const DIDerivedType *N, else Record.push_back(0); + Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get())); + Stream.EmitRecord(bitc::METADATA_DERIVED_TYPE, Record, Abbrev); Record.clear(); } @@ -1716,6 +1720,7 @@ void ModuleBitcodeWriter::writeDICompositeType( Record.push_back(VE.getMetadataOrNullID(N->getRawAssociated())); Record.push_back(VE.getMetadataOrNullID(N->getRawAllocated())); Record.push_back(VE.getMetadataOrNullID(N->getRawRank())); + Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get())); Stream.EmitRecord(bitc::METADATA_COMPOSITE_TYPE, Record, Abbrev); Record.clear(); @@ -1811,6 +1816,7 @@ void ModuleBitcodeWriter::writeDISubprogram(const DISubprogram *N, Record.push_back(VE.getMetadataOrNullID(N->getRetainedNodes().get())); Record.push_back(N->getThisAdjustment()); Record.push_back(VE.getMetadataOrNullID(N->getThrownTypes().get())); + Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get())); Stream.EmitRecord(bitc::METADATA_SUBPROGRAM, Record, Abbrev); Record.clear(); @@ -1958,6 +1964,7 @@ void ModuleBitcodeWriter::writeDIGlobalVariable( Record.push_back(VE.getMetadataOrNullID(N->getStaticDataMemberDeclaration())); Record.push_back(VE.getMetadataOrNullID(N->getTemplateParams())); Record.push_back(N->getAlignInBits()); + Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get())); Stream.EmitRecord(bitc::METADATA_GLOBAL_VAR, Record, Abbrev); Record.clear(); @@ -1989,6 +1996,7 @@ void ModuleBitcodeWriter::writeDILocalVariable( Record.push_back(N->getArg()); Record.push_back(N->getFlags()); Record.push_back(N->getAlignInBits()); + Record.push_back(VE.getMetadataOrNullID(N->getAnnotations().get())); Stream.EmitRecord(bitc::METADATA_LOCAL_VAR, Record, Abbrev); Record.clear(); @@ -2056,6 +2064,7 @@ void ModuleBitcodeWriter::writeDIImportedEntity( Record.push_back(N->getLine()); Record.push_back(VE.getMetadataOrNullID(N->getRawName())); Record.push_back(VE.getMetadataOrNullID(N->getRawFile())); + Record.push_back(VE.getMetadataOrNullID(N->getElements().get())); Stream.EmitRecord(bitc::METADATA_IMPORTED_ENTITY, Record, Abbrev); Record.clear(); @@ -2907,8 +2916,7 @@ void ModuleBitcodeWriter::writeInstruction(const Instruction &I, // Emit type/value pairs for varargs params. if (FTy->isVarArg()) { - for (unsigned i = FTy->getNumParams(), e = II->getNumArgOperands(); - i != e; ++i) + for (unsigned i = FTy->getNumParams(), e = II->arg_size(); i != e; ++i) pushValueAndType(I.getOperand(i), InstID, Vals); // vararg } break; @@ -2989,8 +2997,7 @@ void ModuleBitcodeWriter::writeInstruction(const Instruction &I, // Emit type/value pairs for varargs params. if (FTy->isVarArg()) { - for (unsigned i = FTy->getNumParams(), e = CBI->getNumArgOperands(); - i != e; ++i) + for (unsigned i = FTy->getNumParams(), e = CBI->arg_size(); i != e; ++i) pushValueAndType(I.getOperand(i), InstID, Vals); // vararg } break; @@ -3047,7 +3054,11 @@ void ModuleBitcodeWriter::writeInstruction(const Instruction &I, Vals.push_back(VE.getValueID(I.getOperand(0))); // size. using APV = AllocaPackedValues; unsigned Record = 0; - Bitfield::set<APV::Align>(Record, getEncodedAlign(AI.getAlign())); + unsigned EncodedAlign = getEncodedAlign(AI.getAlign()); + Bitfield::set<APV::AlignLower>( + Record, EncodedAlign & ((1 << APV::AlignLower::Bits) - 1)); + Bitfield::set<APV::AlignUpper>(Record, + EncodedAlign >> APV::AlignLower::Bits); Bitfield::set<APV::UsedWithInAlloca>(Record, AI.isUsedWithInAlloca()); Bitfield::set<APV::ExplicitType>(Record, true); Bitfield::set<APV::SwiftError>(Record, AI.isSwiftError()); @@ -3154,8 +3165,7 @@ void ModuleBitcodeWriter::writeInstruction(const Instruction &I, // Emit type/value pairs for varargs params. if (FTy->isVarArg()) { - for (unsigned i = FTy->getNumParams(), e = CI.getNumArgOperands(); - i != e; ++i) + for (unsigned i = FTy->getNumParams(), e = CI.arg_size(); i != e; ++i) pushValueAndType(CI.getArgOperand(i), InstID, Vals); // varargs } break; @@ -4028,7 +4038,7 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() { FSModVTableRefsAbbrev); for (const GlobalAlias &A : M.aliases()) { - auto *Aliasee = A.getBaseObject(); + auto *Aliasee = A.getAliaseeObject(); if (!Aliasee->hasName()) // Nameless function don't have an entry in the summary, skip it. continue; @@ -4141,7 +4151,14 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() { // For local linkage, we also emit the original name separately // immediately after the record. auto MaybeEmitOriginalName = [&](GlobalValueSummary &S) { - if (!GlobalValue::isLocalLinkage(S.linkage())) + // We don't need to emit the original name if we are writing the index for + // distributed backends (in which case ModuleToSummariesForIndex is + // non-null). The original name is only needed during the thin link, since + // for SamplePGO the indirect call targets for local functions have + // have the original name annotated in profile. + // Continue to emit it when writing out the entire combined index, which is + // used in testing the thin link via llvm-lto. + if (ModuleToSummariesForIndex || !GlobalValue::isLocalLinkage(S.linkage())) return; NameVals.push_back(S.getOriginalName()); Stream.EmitRecord(bitc::FS_COMBINED_ORIGINAL_NAME, NameVals); @@ -4194,33 +4211,7 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() { } auto GetValueId = [&](const ValueInfo &VI) -> Optional<unsigned> { - GlobalValue::GUID GUID = VI.getGUID(); - Optional<unsigned> CallValueId = getValueId(GUID); - if (CallValueId) - return CallValueId; - // For SamplePGO, the indirect call targets for local functions will - // have its original name annotated in profile. We try to find the - // corresponding PGOFuncName as the GUID. - GUID = Index.getGUIDFromOriginalID(GUID); - if (!GUID) - return None; - CallValueId = getValueId(GUID); - if (!CallValueId) - return None; - // The mapping from OriginalId to GUID may return a GUID - // that corresponds to a static variable. Filter it out here. - // This can happen when - // 1) There is a call to a library function which does not have - // a CallValidId; - // 2) There is a static variable with the OriginalGUID identical - // to the GUID of the library function in 1); - // When this happens, the logic for SamplePGO kicks in and - // the static variable in 2) will be found, which needs to be - // filtered out. - auto *GVSum = Index.getGlobalValueSummary(GUID, false); - if (GVSum && GVSum->getSummaryKind() == GlobalValueSummary::GlobalVarKind) - return None; - return CallValueId; + return getValueId(VI.getGUID()); }; auto *FS = cast<FunctionSummary>(S); |