diff --git a/0006-Propeller-Add-BB-Hash-in-cc-profile.patch b/0006-Propeller-Add-BB-Hash-in-cc-profile.patch new file mode 100644 index 0000000000000000000000000000000000000000..98c041143fc2e386208e5f38237d5011c4c1d201 --- /dev/null +++ b/0006-Propeller-Add-BB-Hash-in-cc-profile.patch @@ -0,0 +1,1754 @@ +From eb37a94f67a9894616970436f1b9a3d5b60cf5ac Mon Sep 17 00:00:00 2001 +From: xiajingze +Date: Wed, 4 Jun 2025 19:55:33 +0800 +Subject: [PATCH] [Propeller] Add BB Hash in cc profile + +--- + llvm_propeller_cfg.h | 10 +++++++--- + llvm_propeller_cfg.proto | 3 ++- + llvm_propeller_cfg_testutil.cc | 1 + + llvm_propeller_cfg_testutil.h | 1 + + llvm_propeller_mock_program_cfg_builder.cc | 1 + + llvm_propeller_profile_writer.cc | 5 +++-- + llvm_propeller_program_cfg_builder.cc | 2 +- + 7 files changed, 16 insertions(+), 7 deletions(-) + +diff --git a/llvm_propeller_cfg.h b/llvm_propeller_cfg.h +index c3408b8..760b5fc 100644 +--- a/llvm_propeller_cfg.h ++++ b/llvm_propeller_cfg.h +@@ -130,6 +130,7 @@ class CFGNode final { + // clone number) of the associated cfg node. + struct FullIntraCfgId { + int bb_id; ++ uint64_t bb_hash; + CFGNode::IntraCfgId intra_cfg_id; + + bool operator==(const FullIntraCfgId &other) const { +@@ -172,7 +173,7 @@ class CFGNode final { + + CFGNode(uint64_t addr, int bb_index, int bb_id, int size, + const llvm::object::BBAddrMap::BBEntry::Metadata &metadata, +- int function_index, int freq = 0, int clone_number = 0, ++ uint64_t bb_hash, int function_index, int freq = 0, int clone_number = 0, + int node_index = -1) + : inter_cfg_id_({function_index, {bb_index, clone_number}}), + bb_id_(bb_id), +@@ -180,13 +181,14 @@ class CFGNode final { + addr_(addr), + size_(size), + metadata_(metadata), ++ bb_hash_(bb_hash), + freq_(freq) {} + + // Returns a clone of `*this` with the given assigned `clone_number`, but with + // zero frequency and empty edges. + std::unique_ptr Clone(int clone_number, int node_index) const { + return std::make_unique(addr_, bb_index(), bb_id_, size_, +- metadata_, function_index(), /*freq=*/0, ++ metadata_, bb_hash_, function_index(), /*freq=*/0, + clone_number, node_index); + } + +@@ -195,7 +197,7 @@ class CFGNode final { + // Returns a cfg-wide unique id for this node. + const IntraCfgId &intra_cfg_id() const { return inter_cfg_id_.intra_cfg_id; } + FullIntraCfgId full_intra_cfg_id() const { +- return {.bb_id = bb_id_, .intra_cfg_id = intra_cfg_id()}; ++ return {.bb_id = bb_id_, .bb_hash = bb_hash_, .intra_cfg_id = intra_cfg_id()}; + } + uint64_t addr() const { return addr_; } + int bb_id() const { return bb_id_; } +@@ -212,6 +214,7 @@ class CFGNode final { + bool has_return() const { return metadata_.HasReturn; } + bool has_tail_call() const { return metadata_.HasTailCall; } + bool has_indirect_branch() const { return metadata_.HasIndirectBranch; } ++ uint64_t bb_hash() const { return bb_hash_; } + int function_index() const { return inter_cfg_id_.function_index; } + + const std::vector &intra_outs() const { return intra_outs_; } +@@ -267,6 +270,7 @@ class CFGNode final { + const int addr_; + int size_ = 0; + const llvm::object::BBAddrMap::BBEntry::Metadata metadata_; ++ uint64_t bb_hash_; + int freq_ = 0; + + std::vector intra_outs_ = {}; // Intra function edges. +diff --git a/llvm_propeller_cfg.proto b/llvm_propeller_cfg.proto +index 98c1d18..16363bd 100644 +--- a/llvm_propeller_cfg.proto ++++ b/llvm_propeller_cfg.proto +@@ -45,6 +45,7 @@ message CFGNodePb { + + optional uint32 bb_id = 3; + optional MetadataPb metadata = 4; ++ optional uint64 bb_hash = 5; + } + // + // Control flow graph where basic blocks are vertices and jumps are edges. +@@ -59,4 +60,4 @@ message ControlFlowGraphPb { + // Next Available: 2. + message ProgramCfgPb { + repeated ControlFlowGraphPb cfg = 1; +-} +\ No newline at end of file ++} +diff --git a/llvm_propeller_cfg_testutil.cc b/llvm_propeller_cfg_testutil.cc +index 20c7b9a..9434ee8 100644 +--- a/llvm_propeller_cfg_testutil.cc ++++ b/llvm_propeller_cfg_testutil.cc +@@ -24,6 +24,7 @@ std::vector> TestCfgBuilder::CreateNodesForCfg( + /*bb_index=*/node_arg.bb_index, + /*bb_id=*/node_arg.bb_index, + /*size=*/node_arg.size, /*metadata=*/node_arg.metadata, ++ /*bb_hash=*/node_arg.bb_hash, + /*function_index=*/function_index); + CHECK(nodes_by_function_and_bb_index_[node->function_index()] + .emplace(node->bb_index(), node.get()) +diff --git a/llvm_propeller_cfg_testutil.h b/llvm_propeller_cfg_testutil.h +index c5b12af..b8a1e0d 100644 +--- a/llvm_propeller_cfg_testutil.h ++++ b/llvm_propeller_cfg_testutil.h +@@ -19,6 +19,7 @@ struct NodeArg { + int bb_index; + uint64_t size; + llvm::object::BBAddrMap::BBEntry::Metadata metadata; ++ uint64_t bb_hash; + }; + + struct IntraEdgeArg { +diff --git a/llvm_propeller_mock_program_cfg_builder.cc b/llvm_propeller_mock_program_cfg_builder.cc +index 4559af7..da861b5 100644 +--- a/llvm_propeller_mock_program_cfg_builder.cc ++++ b/llvm_propeller_mock_program_cfg_builder.cc +@@ -60,6 +60,7 @@ std::unique_ptr CreateNodeFromNodePb(int function_index, + /*bb_index=*/nodepb.bb_id(), + /*bb_id=*/nodepb.bb_id(), /*size=*/nodepb.size(), + /*metadata=*/ConvertFromPb(nodepb.metadata()), ++ /*bb_hash=*/nodepb.bb_hash(), + /*function_index=*/function_index); + } + +diff --git a/llvm_propeller_profile_writer.cc b/llvm_propeller_profile_writer.cc +index 9a6512b..4c87fe9 100644 +--- a/llvm_propeller_profile_writer.cc ++++ b/llvm_propeller_profile_writer.cc +@@ -196,10 +196,11 @@ void PropellerProfileWriter::Write(const PropellerProfile &profile) const { + cluster.full_bb_ids.front().intra_cfg_id.bb_index == 0 + ? std::optional() + : cluster_id); ++ cc_profile_os << profile_encoding_.cluster_specifier; + for (int bbi = 0; bbi < cluster.full_bb_ids.size(); ++bbi) { + const auto &full_bb_id = cluster.full_bb_ids[bbi]; +- cc_profile_os << (bbi ? " " : profile_encoding_.cluster_specifier) +- << full_bb_id.bb_id; ++ cc_profile_os << " " << full_bb_id.bb_id << "-" ++ << std::hex << full_bb_id.bb_hash << std::dec; + if (full_bb_id.intra_cfg_id.clone_number != 0) + cc_profile_os << "." << full_bb_id.intra_cfg_id.clone_number; + } +diff --git a/llvm_propeller_program_cfg_builder.cc b/llvm_propeller_program_cfg_builder.cc +index 44fd0d5..869db4f 100644 +--- a/llvm_propeller_program_cfg_builder.cc ++++ b/llvm_propeller_program_cfg_builder.cc +@@ -37,7 +37,7 @@ std::vector> CreateCfgNodes( + const auto &bb_entry = func_bb_addr_map.getBBEntries()[bb_index]; + nodes.push_back(std::make_unique( + func_bb_addr_map.getFunctionAddress() + bb_entry.Offset, bb_index, +- bb_entry.ID, bb_entry.Size, bb_entry.MD, function_index)); ++ bb_entry.ID, bb_entry.Size, bb_entry.MD, bb_entry.Hash, function_index)); + } + return nodes; + } +-- +2.33.0 + +From dcdee60e7ce321ec2945cd7711a01503ccdb712a Mon Sep 17 00:00:00 2001 +From: xiajingze +Date: Wed, 4 Jun 2025 11:24:43 +0800 +Subject: [PATCH] [Propeller] Match the hash value of BB to adapt to source + drift + +Add the BB Hash to the generated `.llvm_bb_addr_map` section. The +Propeller tool reads it and write to the output file. When building +updated code, llvm matches the file with the current BB Hash and +generates BBCluster basedon the Hash matching results. This feature is +controlled by the `bbsections-match-hash` option and is disabled by +default. +--- + .../CodeGen/BasicBlockSectionsProfileReader.h | 14 +- + llvm/include/llvm/CodeGen/MachineBasicBlock.h | 5 + + llvm/include/llvm/Object/ELFTypes.h | 6 +- + llvm/include/llvm/ObjectYAML/ELFYAML.h | 1 + + llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 2 + + llvm/lib/CodeGen/BasicBlockPathCloning.cpp | 3 +- + llvm/lib/CodeGen/BasicBlockSections.cpp | 34 ++++ + .../BasicBlockSectionsProfileReader.cpp | 26 ++- + llvm/lib/Object/ELF.cpp | 3 +- + llvm/lib/ObjectYAML/ELFEmitter.cpp | 1 + + llvm/lib/ObjectYAML/ELFYAML.cpp | 1 + + ...k-address-map-with-basic-block-sections.ll | 4 + + .../X86/basic-block-address-map-with-mfs.ll | 3 + + .../CodeGen/X86/basic-block-address-map.ll | 6 + + .../basic-block-sections-clusters-error.ll | 2 +- + ...asic-block-sections-labels-pgo-features.ll | 6 + + ...ddrmap-disassemble-symbolize-operands.yaml | 18 ++ + .../elf-bbaddrmap-symbolize-relocatable.yaml | 10 +- + .../llvm-objdump/X86/elf-pgoanalysismap.yaml | 9 + + .../ELF/bb-addr-map-pgo-analysis-map.test | 14 +- + .../ELF/bb-addr-map-relocatable.test | 9 +- + .../tools/llvm-readobj/ELF/bb-addr-map.test | 12 +- + .../ELF/bb-addr-map-pgo-analysis-map.yaml | 10 ++ + llvm/test/tools/obj2yaml/ELF/bb-addr-map.yaml | 10 ++ + .../ELF/bb-addr-map-pgo-analysis-map.yaml | 9 +- + llvm/test/tools/yaml2obj/ELF/bb-addr-map.yaml | 3 + + llvm/tools/llvm-readobj/ELFDumper.cpp | 1 + + llvm/tools/obj2yaml/elf2yaml.cpp | 3 +- + llvm/unittests/Object/ELFObjectFileTest.cpp | 157 +++++++++++++----- + 29 files changed, 323 insertions(+), 59 deletions(-) + +diff --git a/third_party/llvm-project/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h b/third_party/llvm-project/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h +index bba675f1d3eb..1083c1483f8f 100644 +--- a/third_party/llvm-project/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h ++++ b/third_party/llvm-project/llvm/include/llvm/CodeGen/BasicBlockSectionsProfileReader.h +@@ -28,11 +28,14 @@ + #include "llvm/Support/LineIterator.h" + #include "llvm/Support/MemoryBuffer.h" + #include "llvm/Target/TargetMachine.h" ++#include "llvm/Support/CommandLine.h" + + using namespace llvm; + + namespace llvm { + ++extern cl::opt BBSectionsMatchHash; ++ + // This struct represents the cluster information for a machine basic block, + // which is specifed by a unique ID (`MachineBasicBlock::BBID`). + struct BBClusterInfo { +@@ -65,13 +68,22 @@ template <> struct DenseMapInfo { + return UniqueBBID{TombstoneKey, TombstoneKey}; + } + static unsigned getHashValue(const UniqueBBID &Val) { ++ if (BBSectionsMatchHash) { ++ std::pair PairVal = ++ std::make_pair(Val.Hash, Val.CloneID); ++ return DenseMapInfo>::getHashValue(PairVal); ++ } + std::pair PairVal = + std::make_pair(Val.BaseID, Val.CloneID); + return DenseMapInfo>::getHashValue(PairVal); + } + static bool isEqual(const UniqueBBID &LHS, const UniqueBBID &RHS) { ++ if (BBSectionsMatchHash) { ++ return DenseMapInfo::isEqual(LHS.Hash, RHS.Hash) && ++ DenseMapInfo::isEqual(LHS.CloneID, RHS.CloneID); ++ } + return DenseMapInfo::isEqual(LHS.BaseID, RHS.BaseID) && +- DenseMapInfo::isEqual(LHS.CloneID, RHS.CloneID); ++ DenseMapInfo::isEqual(LHS.CloneID, RHS.CloneID); + } + }; + +diff --git a/third_party/llvm-project/llvm/include/llvm/CodeGen/MachineBasicBlock.h b/third_party/llvm-project/llvm/include/llvm/CodeGen/MachineBasicBlock.h +index dc2035fa598c..9f46265c6baa 100644 +--- a/third_party/llvm-project/llvm/include/llvm/CodeGen/MachineBasicBlock.h ++++ b/third_party/llvm-project/llvm/include/llvm/CodeGen/MachineBasicBlock.h +@@ -78,6 +78,7 @@ private: + // the basic block sections profile. + struct UniqueBBID { + unsigned BaseID; ++ uint64_t Hash; + unsigned CloneID; + }; + +@@ -648,6 +649,8 @@ public: + + std::optional getBBID() const { return BBID; } + ++ uint64_t getHash() const { return BBID->Hash; } ++ + /// Returns the section ID of this basic block. + MBBSectionID getSectionID() const { return SectionID; } + +@@ -657,6 +660,8 @@ public: + ((unsigned)SectionID.Type) + SectionID.Number; + } + ++ void setHash(uint64_t Hash) { BBID->Hash = Hash; } ++ + /// Sets the fixed BBID of this basic block. + void setBBID(const UniqueBBID &V) { + assert(!BBID.has_value() && "Cannot change BBID."); +diff --git a/third_party/llvm-project/llvm/include/llvm/Object/ELFTypes.h b/third_party/llvm-project/llvm/include/llvm/Object/ELFTypes.h +index 4986ecf8323d..1cedc5e41119 100644 +--- a/third_party/llvm-project/llvm/include/llvm/Object/ELFTypes.h ++++ b/third_party/llvm-project/llvm/include/llvm/Object/ELFTypes.h +@@ -884,9 +884,11 @@ struct BBAddrMap { + uint32_t Size = 0; // Size of the basic block. + Metadata MD = {false, false, false, false, + false}; // Metdata for this basic block. ++ uint64_t Hash = 0; // Hash value of the basic block. + +- BBEntry(uint32_t ID, uint32_t Offset, uint32_t Size, Metadata MD) +- : ID(ID), Offset(Offset), Size(Size), MD(MD){}; ++ BBEntry(uint32_t ID, uint32_t Offset, uint32_t Size, Metadata MD, ++ uint64_t Hash) ++ : ID(ID), Offset(Offset), Size(Size), MD(MD), Hash(Hash){}; + + bool operator==(const BBEntry &Other) const { + return ID == Other.ID && Offset == Other.Offset && Size == Other.Size && +diff --git a/third_party/llvm-project/llvm/include/llvm/ObjectYAML/ELFYAML.h b/third_party/llvm-project/llvm/include/llvm/ObjectYAML/ELFYAML.h +index 8f045d638362..b0456248d05e 100644 +--- a/third_party/llvm-project/llvm/include/llvm/ObjectYAML/ELFYAML.h ++++ b/third_party/llvm-project/llvm/include/llvm/ObjectYAML/ELFYAML.h +@@ -162,6 +162,7 @@ struct BBAddrMapEntry { + llvm::yaml::Hex64 AddressOffset; + llvm::yaml::Hex64 Size; + llvm::yaml::Hex64 Metadata; ++ llvm::yaml::Hex64 Hash; + }; + uint8_t Version; + llvm::yaml::Hex8 Feature; +diff --git a/third_party/llvm-project/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/third_party/llvm-project/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +index a15538755d73..9afc07b9e3bb 100644 +--- a/third_party/llvm-project/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp ++++ b/third_party/llvm-project/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +@@ -1451,6 +1451,8 @@ void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) { + emitLabelDifferenceAsULEB128(MBB.getEndSymbol(), MBBSymbol); + // Emit the Metadata. + OutStreamer->emitULEB128IntValue(getBBAddrMapMetadata(MBB)); ++ OutStreamer->AddComment("hash value"); ++ OutStreamer->emitULEB128IntValue(MBB.getHash()); + PrevMBBEndSymbol = MBB.getEndSymbol(); + } + +diff --git a/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockPathCloning.cpp b/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockPathCloning.cpp +index 901542e8507b..a4f5a8ff4023 100644 +--- a/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockPathCloning.cpp ++++ b/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockPathCloning.cpp +@@ -56,7 +56,8 @@ MachineBasicBlock *CloneMachineBasicBlock(MachineBasicBlock &OrigBB, + auto TII = MF.getSubtarget().getInstrInfo(); + // Create the clone block and set its BBID based on the original block. + MachineBasicBlock *CloneBB = MF.CreateMachineBasicBlock( +- OrigBB.getBasicBlock(), UniqueBBID{OrigBB.getBBID()->BaseID, CloneID}); ++ OrigBB.getBasicBlock(), UniqueBBID{OrigBB.getBBID()->BaseID, ++ OrigBB.getBBID()->Hash, CloneID}); + MF.push_back(CloneBB); + + // Copy the instructions. +diff --git a/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockSections.cpp b/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockSections.cpp +index 09e45ea5794b..6824b71f02d9 100644 +--- a/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockSections.cpp ++++ b/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockSections.cpp +@@ -70,6 +70,7 @@ + + #include "llvm/ADT/SmallVector.h" + #include "llvm/ADT/StringRef.h" ++#include "llvm/ADT/Hashing.h" + #include "llvm/CodeGen/BasicBlockSectionUtils.h" + #include "llvm/CodeGen/BasicBlockSectionsProfileReader.h" + #include "llvm/CodeGen/MachineFunction.h" +@@ -77,6 +78,7 @@ + #include "llvm/CodeGen/Passes.h" + #include "llvm/CodeGen/TargetInstrInfo.h" + #include "llvm/InitializePasses.h" ++#include "llvm/IR/Constants.h" + #include "llvm/Target/TargetMachine.h" + #include + +@@ -289,12 +291,43 @@ bool llvm::hasInstrProfHashMismatch(MachineFunction &MF) { + return false; + } + ++void computeBBHash(MachineFunction &MF) { ++ for (auto &MBB : MF) { ++ llvm::hash_code Hash = llvm::hash_value(0); ++ for (const MachineInstr &MI : MBB) { ++ if (MI.isPseudo() || MI.isDebugOrPseudoInstr()) ++ continue; ++ if (MI.isUnconditionalBranch()) ++ continue; ++ Hash = llvm::hash_combine(Hash, MI.getOpcode()); ++ ++ for (const MachineOperand &MO : MI.operands()) { ++ if (MO.isReg()) { ++ Hash = llvm::hash_combine(Hash, MO.getReg()); ++ } else if (MO.isImm()) { ++ Hash = llvm::hash_combine(Hash, MO.getImm()); ++ } else if (MO.isCImm()) { ++ Hash = llvm::hash_combine(Hash, MO.getCImm()->getZExtValue()); ++ } else if (MO.isFPImm()) { ++ Hash = llvm::hash_combine(Hash, MO.getFPImm()->getValueAPF().bitcastToAPInt().getZExtValue()); ++ } else if (MO.isGlobal()) { ++ Hash = llvm::hash_combine(Hash, MO.getGlobal()->getName()); ++ } else if (MO.isSymbol()) { ++ Hash = llvm::hash_combine(Hash, MO.getSymbolName()); ++ } ++ } ++ } ++ MBB.setHash(Hash); ++ } ++} ++ + // Identify, arrange, and modify basic blocks which need separate sections + // according to the specification provided by the -fbasic-block-sections flag. + bool BasicBlockSections::handleBBSections(MachineFunction &MF) { + auto BBSectionsType = MF.getTarget().getBBSectionsType(); + if (BBSectionsType == BasicBlockSection::None) + return false; ++ computeBBHash(MF); + + // Check for source drift. If the source has changed since the profiles + // were obtained, optimizing basic blocks might be sub-optimal. +@@ -384,6 +417,7 @@ bool BasicBlockSections::handleBBAddrMap(MachineFunction &MF) { + return false; + if (!MF.getTarget().Options.BBAddrMap) + return false; ++ computeBBHash(MF); + MF.RenumberBlocks(); + return true; + } +diff --git a/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp b/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp +index 6eef5d2c50a2..94b2c069e059 100644 +--- a/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp ++++ b/third_party/llvm-project/llvm/lib/CodeGen/BasicBlockSectionsProfileReader.cpp +@@ -30,6 +30,13 @@ + + using namespace llvm; + ++namespace llvm { ++cl::opt BBSectionsMatchHash( ++ "bbsections-match-hash", ++ cl::desc("This matches basic blocks by hash to fit source drift"), ++ cl::init(false), cl::Hidden); ++} ++ + char BasicBlockSectionsProfileReaderWrapperPass::ID = 0; + INITIALIZE_PASS(BasicBlockSectionsProfileReaderWrapperPass, + "bbsections-profile-reader", +@@ -41,18 +48,29 @@ BasicBlockSectionsProfileReader::parseUniqueBBID(StringRef S) const { + SmallVector Parts; + S.split(Parts, '.'); + if (Parts.size() > 2) +- return createProfileParseError(Twine("unable to parse basic block id: '") + ++ return createProfileParseError(Twine("unable to parse unique basic block id: '") + + S + "'"); +- unsigned long long BaseBBID; +- if (getAsUnsignedInteger(Parts[0], 10, BaseBBID)) ++ SmallVector IdAndHash; ++ Parts[0].split(IdAndHash, '-'); ++ if (IdAndHash.size() > 2) ++ return createProfileParseError(Twine("unable to parse basic block id and hash: '") + ++ Parts[0] + "'"); ++ unsigned long long BaseBBID = 0; ++ if (getAsUnsignedInteger(IdAndHash[0], 10, BaseBBID)) + return createProfileParseError( +- Twine("unable to parse BB id: '" + Parts[0]) + ++ Twine("unable to parse BB id: '" + IdAndHash[0]) + + "': unsigned integer expected"); ++ unsigned long long BBHash = 0; ++ if (IdAndHash.size() > 1 && getAsUnsignedInteger(IdAndHash[1], 16, BBHash)) ++ return createProfileParseError( ++ Twine("unable to parse BB hash: '" + IdAndHash[1]) + ++ "': hex unsigned integer expected"); + unsigned long long CloneID = 0; + if (Parts.size() > 1 && getAsUnsignedInteger(Parts[1], 10, CloneID)) + return createProfileParseError(Twine("unable to parse clone id: '") + + Parts[1] + "': unsigned integer expected"); + return UniqueBBID{static_cast(BaseBBID), ++ static_cast(BBHash), + static_cast(CloneID)}; + } + +diff --git a/third_party/llvm-project/llvm/lib/Object/ELF.cpp b/third_party/llvm-project/llvm/lib/Object/ELF.cpp +index 137f606dd2d4..f4a6448321dc 100644 +--- a/third_party/llvm-project/llvm/lib/Object/ELF.cpp ++++ b/third_party/llvm-project/llvm/lib/Object/ELF.cpp +@@ -798,6 +798,7 @@ decodeBBAddrMapImpl(const ELFFile &EF, + uint32_t Offset = readULEB128As(Data, Cur, ULEBSizeErr); + uint32_t Size = readULEB128As(Data, Cur, ULEBSizeErr); + uint32_t MD = readULEB128As(Data, Cur, ULEBSizeErr); ++ uint64_t Hash = readULEB128As(Data, Cur, ULEBSizeErr); + if (Version >= 1) { + // Offset is calculated relative to the end of the previous BB. + Offset += PrevBBEndOffset; +@@ -809,7 +810,7 @@ decodeBBAddrMapImpl(const ELFFile &EF, + MetadataDecodeErr = MetadataOrErr.takeError(); + break; + } +- BBEntries.push_back({ID, Offset, Size, *MetadataOrErr}); ++ BBEntries.push_back({ID, Offset, Size, *MetadataOrErr, Hash}); + } + TotalNumBlocks += BBEntries.size(); + BBRangeEntries.push_back({RangeBaseAddress, std::move(BBEntries)}); +diff --git a/third_party/llvm-project/llvm/lib/ObjectYAML/ELFEmitter.cpp b/third_party/llvm-project/llvm/lib/ObjectYAML/ELFEmitter.cpp +index 58a725f8d877..191f97ab04a2 100644 +--- a/third_party/llvm-project/llvm/lib/ObjectYAML/ELFEmitter.cpp ++++ b/third_party/llvm-project/llvm/lib/ObjectYAML/ELFEmitter.cpp +@@ -1461,6 +1461,7 @@ void ELFState::writeSectionContent( + SHeader.sh_size += CBA.writeULEB128(BBE.AddressOffset); + SHeader.sh_size += CBA.writeULEB128(BBE.Size); + SHeader.sh_size += CBA.writeULEB128(BBE.Metadata); ++ SHeader.sh_size += CBA.writeULEB128(BBE.Hash); + } + } + if (!PGOAnalyses) +diff --git a/third_party/llvm-project/llvm/lib/ObjectYAML/ELFYAML.cpp b/third_party/llvm-project/llvm/lib/ObjectYAML/ELFYAML.cpp +index 9c1a28db592a..da8c0662950c 100644 +--- a/third_party/llvm-project/llvm/lib/ObjectYAML/ELFYAML.cpp ++++ b/third_party/llvm-project/llvm/lib/ObjectYAML/ELFYAML.cpp +@@ -1843,6 +1843,7 @@ void MappingTraits::mapping( + IO.mapRequired("AddressOffset", E.AddressOffset); + IO.mapRequired("Size", E.Size); + IO.mapRequired("Metadata", E.Metadata); ++ IO.mapRequired("Hash", E.Hash); + } + + void MappingTraits::mapping( +diff --git a/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map-with-basic-block-sections.ll b/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map-with-basic-block-sections.ll +index b897cf4853ca..49547665fb5b 100644 +--- a/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map-with-basic-block-sections.ll ++++ b/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map-with-basic-block-sections.ll +@@ -54,18 +54,22 @@ declare i32 @__gxx_personality_v0(...) + ; CHECK-NEXT: .uleb128 .Lfunc_begin0-.Lfunc_begin0 + ; CHECK-NEXT: .uleb128 .LBB_END0_0-.Lfunc_begin0 + ; CHECK-NEXT: .byte 0 ++; CHECK-NEXT: .ascii "\312\300\332\235\320\372\201\363/" # hash value + ; CHECK-NEXT: .byte 2 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_1-.LBB_END0_0 + ; CHECK-NEXT: .uleb128 .LBB_END0_1-.LBB0_1 + ; CHECK-NEXT: .byte 5 ++; CHECK-NEXT: .ascii "\265\322\266\331\306\235\247\356:" # hash value + ; CHECK-NEXT: .quad _Z3bazb.cold # base address + ; CHECK-NEXT: .byte 2 # number of basic blocks + ; CHECK-NEXT: .byte 1 # BB id + ; CHECK-NEXT: .uleb128 _Z3bazb.cold-_Z3bazb.cold + ; CHECK-NEXT: .uleb128 .LBB_END0_2-_Z3bazb.cold + ; CHECK-NEXT: .byte 8 ++; CHECK-NEXT: .ascii "\313\356\237\376\343\213\207\324\244\001" # hash value + ; CHECK-NEXT: .byte 3 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_3-.LBB_END0_2 + ; CHECK-NEXT: .uleb128 .LBB_END0_3-.LBB0_3 + ; CHECK-NEXT: .byte 1 ++; CHECK-NEXT: .ascii "\337\302\267\244\245\354\240\223\013" # hash value + +diff --git a/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map-with-mfs.ll b/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map-with-mfs.ll +index 2565db23c024..d920455f992a 100644 +--- a/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map-with-mfs.ll ++++ b/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map-with-mfs.ll +@@ -64,16 +64,19 @@ declare i32 @qux() + ; CHECK-NEXT: .uleb128 .Lfunc_begin0-.Lfunc_begin0 + ; CHECK-NEXT: .uleb128 .LBB_END0_0-.Lfunc_begin0 + ; CHECK-NEXT: .byte 8 ++; CHECK-NEXT: .ascii "\312\300\332\235\320\372\201\363/" # hash value + ; CHECK-NEXT: .byte 1 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_1-.LBB_END0_0 + ; CHECK-NEXT: .uleb128 .LBB_END0_1-.LBB0_1 + ; CHECK-NEXT: .byte 3 ++; CHECK-NEXT: .ascii "\244\344\201\240\303\310\316\250\244\001" # hash value + ; CHECK-NEXT: .quad foo.cold # base address + ; CHECK-NEXT: .byte 1 # number of basic blocks + ; CHECK-NEXT: .byte 2 # BB id + ; CHECK-NEXT: .uleb128 foo.cold-foo.cold + ; CHECK-NEXT: .uleb128 .LBB_END0_2-foo.cold + ; CHECK-NEXT: .byte 3 ++; CHECK-NEXT: .ascii "\372\300\221\221\230\311\264\312\305\001" # hash value + + ;; PGO Analysis Map + ; PGO: .ascii "\3306" # function entry count +diff --git a/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map.ll b/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map.ll +index 6ab24b494936..4ad462a08062 100644 +--- a/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map.ll ++++ b/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-address-map.ll +@@ -60,23 +60,29 @@ declare i32 @__gxx_personality_v0(...) + ; CHECK-NEXT: .uleb128 .Lfunc_begin0-.Lfunc_begin0 + ; CHECK-NEXT: .uleb128 .LBB_END0_0-.Lfunc_begin0 + ; CHECK-NEXT: .byte 8 ++; CHECK-NEXT: .ascii "\274\344\375\305\336\330\374\2768" # hash value + ; CHECK-NEXT: .byte 1 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_1-.LBB_END0_0 + ; CHECK-NEXT: .uleb128 .LBB_END0_1-.LBB0_1 + ; CHECK-NEXT: .byte 8 ++; CHECK-NEXT: .ascii "\313\356\237\376\343\213\207\324\244\001" # hash value + ; CHECK-NEXT: .byte 3 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_2-.LBB_END0_1 + ; CHECK-NEXT: .uleb128 .LBB_END0_2-.LBB0_2 + ; CHECK-NEXT: .byte 8 ++; CHECK-NEXT: .ascii "\307\265\207\365\206\376\260\360\t" # hash value + ; CHECK-NEXT: .byte 4 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_3-.LBB_END0_2 + ; CHECK-NEXT: .uleb128 .LBB_END0_3-.LBB0_3 + ; CHECK-NEXT: .byte 16 ++; CHECK-NEXT: .ascii "\210\307\276\260\235\345\260\254e" # hash value + ; CHECK-NEXT: .byte 5 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_4-.LBB_END0_3 + ; CHECK-NEXT: .uleb128 .LBB_END0_4-.LBB0_4 + ; CHECK-NEXT: .byte 1 ++; CHECK-NEXT: .ascii "\225\205\303\352\253\356\366\373\302\001" # hash value + ; CHECK-NEXT: .byte 2 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_5-.LBB_END0_4 + ; CHECK-NEXT: .uleb128 .LBB_END0_5-.LBB0_5 + ; CHECK-NEXT: .byte 5 ++; CHECK-NEXT: .ascii "\225\205\303\352\253\356\366\373\302\001" # hash value +diff --git a/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-sections-clusters-error.ll b/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-sections-clusters-error.ll +index d6f3d5010b55..15a4862ca55d 100644 +--- a/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-sections-clusters-error.ll ++++ b/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-sections-clusters-error.ll +@@ -39,7 +39,7 @@ + ; RUN: echo 'f dummy1' >> %t10 + ; RUN: echo 'c 0 1.1.1' >> %t10 + ; RUN: not --crash llc < %s -O0 -mtriple=x86_64 -function-sections -basic-block-sections=%t10 2>&1 | FileCheck %s --check-prefix=CHECK-ERROR10 +-; CHECK-ERROR10: LLVM ERROR: invalid profile {{.*}} at line 3: unable to parse basic block id: '1.1.1' ++; CHECK-ERROR10: LLVM ERROR: invalid profile {{.*}} at line 3: unable to parse unique basic block id: '1.1.1' + ; RUN: echo 'v1' > %t11 + ; RUN: echo 'f dummy1' >> %t11 + ; RUN: echo 'c 0 1.a' >> %t11 +diff --git a/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-sections-labels-pgo-features.ll b/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-sections-labels-pgo-features.ll +index 92d3c88b4f60..fa8213b73d37 100644 +--- a/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-sections-labels-pgo-features.ll ++++ b/third_party/llvm-project/llvm/test/CodeGen/X86/basic-block-sections-labels-pgo-features.ll +@@ -71,26 +71,32 @@ declare i32 @__gxx_personality_v0(...) + ; CHECK-NEXT: .uleb128 .Lfunc_begin0-.Lfunc_begin0 + ; CHECK-NEXT: .uleb128 .LBB_END0_0-.Lfunc_begin0 + ; CHECK-NEXT: .byte 8 ++; CHECK-NEXT: .ascii "\274\344\375\305\336\330\374\2768" # hash value + ; CHECK-NEXT: .byte 1 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_1-.LBB_END0_0 + ; CHECK-NEXT: .uleb128 .LBB_END0_1-.LBB0_1 + ; CHECK-NEXT: .byte 8 ++; CHECK-NEXT: .ascii "\313\356\237\376\343\213\207\324\244\001" # hash value + ; CHECK-NEXT: .byte 3 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_2-.LBB_END0_1 + ; CHECK-NEXT: .uleb128 .LBB_END0_2-.LBB0_2 + ; CHECK-NEXT: .byte 8 ++; CHECK-NEXT: .ascii "\305\274\361\253\307\255\244\204D" # hash value + ; CHECK-NEXT: .byte 5 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_3-.LBB_END0_2 + ; CHECK-NEXT: .uleb128 .LBB_END0_3-.LBB0_3 + ; CHECK-NEXT: .byte 1 ++; CHECK-NEXT: .ascii "\225\205\303\352\253\356\366\373\302\001" # hash value + ; CHECK-NEXT: .byte 4 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_4-.LBB_END0_3 + ; CHECK-NEXT: .uleb128 .LBB_END0_4-.LBB0_4 + ; CHECK-NEXT: .byte 16 ++; CHECK-NEXT: .ascii "\210\307\276\260\235\345\260\254e" # hash value + ; CHECK-NEXT: .byte 2 # BB id + ; CHECK-NEXT: .uleb128 .LBB0_5-.LBB_END0_4 + ; CHECK-NEXT: .uleb128 .LBB_END0_5-.LBB0_5 + ; CHECK-NEXT: .byte 4 ++; CHECK-NEXT: .ascii "\315\254\220\356\210\355\223\331\262\001" # hash value + + ;; PGO Analysis Map + ; PGO-FEC-NEXT: .byte 100 # function entry count +diff --git a/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-disassemble-symbolize-operands.yaml b/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-disassemble-symbolize-operands.yaml +index cc7faea67bed..0b6b6c79d268 100644 +--- a/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-disassemble-symbolize-operands.yaml ++++ b/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-disassemble-symbolize-operands.yaml +@@ -113,28 +113,34 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x1 ++ Hash: 0x1 + - ID: 1 + AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x0 ++ Hash: 0x1 + - ID: 2 + AddressOffset: 0x1 + Size: 0x4 + Metadata: 0x0 ++ Hash: 0x1 + - ID: 4 + AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x1 ++ Hash: 0x1 + - ID: 5 + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1 + - BaseAddress: 0x6000 + BBEntries: + - ID: 6 + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1 + - Name: .llvm_bb_addr_map.bar + Type: SHT_LLVM_BB_ADDR_MAP + Link: .text.bar +@@ -146,12 +152,15 @@ Sections: + - AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x1 ++ Hash: 0x1 + - AddressOffset: 0x4 + Size: 0x2 + Metadata: 0x0 ++ Hash: 0x1 + - AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x0 ++ Hash: 0x1 + + Symbols: + - Name: foo +@@ -208,28 +217,34 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x1 ++ Hash: 0x1 + - ID: 1 + AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x0 ++ Hash: 0x1 + - ID: 2 + AddressOffset: 0x1 + Size: 0x4 + Metadata: 0x0 ++ Hash: 0x1 + - ID: 4 + AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x1 ++ Hash: 0x1 + - ID: 5 + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1 + - BaseAddress: 0x6000 + BBEntries: + - ID: 6 + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1 + - Version: 1 + BBRanges: + - BaseAddress: 0x5000 +@@ -237,12 +252,15 @@ Sections: + - AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x1 ++ Hash: 0x1 + - AddressOffset: 0x4 + Size: 0x2 + Metadata: 0x0 ++ Hash: 0x1 + - AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x0 ++ Hash: 0x1 + + Symbols: + - Name: foo +diff --git a/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-symbolize-relocatable.yaml b/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-symbolize-relocatable.yaml +index 706d386e467e..f582ac73ce29 100644 +--- a/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-symbolize-relocatable.yaml ++++ b/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-bbaddrmap-symbolize-relocatable.yaml +@@ -30,6 +30,7 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0xa ++ Hash: 0x10 + - Version: 2 + BBRanges: + - BBEntries: +@@ -37,6 +38,7 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0xb ++ Hash: 0x11 + - Version: 2 + Feature: 0x8 + BBRanges: +@@ -45,11 +47,13 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0xc ++ Hash: 0x12 + - BBEntries: + - ID: 1 + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0xd ++ Hash: 0x13 + - Name: .rela.llvm_bb_addr_map + Type: SHT_RELA + Flags: [ SHF_INFO_LINK ] +@@ -59,15 +63,15 @@ Sections: + - Offset: 0x2 + Symbol: .text + Type: R_X86_64_64 +- - Offset: 0x11 ++ - Offset: 0x12 + Symbol: .text + Type: R_X86_64_64 + Addend: 1 +- - Offset: 0x21 ++ - Offset: 0x23 + Symbol: .text + Type: R_X86_64_64 + Addend: 0x2 +- - Offset: 0x2e ++ - Offset: 0x31 + Symbol: .text + Type: R_X86_64_64 + Addend: 0x3 +diff --git a/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml b/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml +index 4d1e5408d86d..34ce924796d9 100644 +--- a/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml ++++ b/third_party/llvm-project/llvm/test/tools/llvm-objdump/X86/elf-pgoanalysismap.yaml +@@ -33,6 +33,7 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x1 ++ Hash: 0x1 + PGOAnalyses: + - FuncEntryCount: 1000 + Symbols: +@@ -76,18 +77,22 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x1 ++ Hash: 0x1 + - ID: 1 + AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x0 ++ Hash: 0x1 + - ID: 2 + AddressOffset: 0x1 + Size: 0x4 + Metadata: 0x0 ++ Hash: 0x1 + - ID: 5 + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1 + PGOAnalyses: + - FuncEntryCount: 1000 + PGOBBEntries: +@@ -148,18 +153,22 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x1 ++ Hash: 0x1 + - ID: 1 + AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x0 ++ Hash: 0x1 + - ID: 2 + AddressOffset: 0x1 + Size: 0x4 + Metadata: 0x0 ++ Hash: 0x1 + - ID: 5 + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1 + PGOAnalyses: + - FuncEntryCount: 1000 + PGOBBEntries: +diff --git a/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test b/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test +index 5faafd4d83b2..6f95b760f89a 100644 +--- a/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test ++++ b/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-pgo-analysis-map.test +@@ -15,7 +15,7 @@ + + ## Check that a malformed section can be handled. + # RUN: yaml2obj %s -DBITS=32 -DSIZE=24 -o %t2.o +-# RUN: llvm-readobj %t2.o --bb-addr-map 2>&1 | FileCheck --match-full-lines %s -DOFFSET=0x00000018 -DFILE=%t2.o --check-prefix=TRUNCATED ++# RUN: llvm-readobj %t2.o --bb-addr-map 2>&1 | FileCheck --match-full-lines %s -DOFFSET=0x00000015 -DFILE=%t2.o --check-prefix=TRUNCATED + + ## Check that missing features can be handled. + # RUN: yaml2obj %s -DBITS=32 -DFEATURE=0x2 -o %t3.o +@@ -39,6 +39,7 @@ + # CHECK-NEXT: IsEHPad: No + # CHECK-NEXT: CanFallThrough: No + # CHECK-NEXT: HasIndirectBranch: No ++# CHECK-NEXT: Hash: 0x1 + # CHECK-NEXT: } + # CHECK-NEXT: { + # CHECK-NEXT: ID: 2 +@@ -49,6 +50,7 @@ + # CHECK-NEXT: IsEHPad: Yes + # CHECK-NEXT: CanFallThrough: No + # CHECK-NEXT: HasIndirectBranch: Yes ++# CHECK-NEXT: Hash: 0x1 + # CHECK-NEXT: } + # CHECK-NEXT: ] + # CHECK-NEXT: } +@@ -92,6 +94,7 @@ + # CHECK-NEXT: IsEHPad: No + # CHECK-NEXT: CanFallThrough: Yes + # CHECK-NEXT: HasIndirectBranch: No ++# CHECK-NEXT: Hash: 0x1 + # CHECK-NEXT: } + # CHECK-NEXT: ] + # CHECK-NEXT: } +@@ -133,6 +136,7 @@ + # TRUNCATED-NEXT: IsEHPad: No + # TRUNCATED-NEXT: CanFallThrough: Yes + # TRUNCATED-NEXT: HasIndirectBranch: Yes ++# TRUNCATED-NEXT: Hash: 0x1 + # TRUNCATED-NEXT: } + # TRUNCATED-NEXT: { + # TRUNCATED-NEXT: ID: 7 +@@ -143,6 +147,7 @@ + # TRUNCATED-NEXT: IsEHPad: Yes + # TRUNCATED-NEXT: CanFallThrough: Yes + # TRUNCATED-NEXT: HasIndirectBranch: No ++# TRUNCATED-NEXT: Hash: 0x1 + # TRUNCATED-NEXT: } + # TRUNCATED-NEXT: ] + # TRUNCATED-NEXT: } +@@ -153,7 +158,7 @@ + # TRUNCATED-NEXT: } + # TRUNCATED-NEXT: ] + +-# INVALIDFT: warning: '[[FILE]]': unable to dump SHT_LLVM_BB_ADDR_MAP section with index 5: unable to decode LEB128 at offset 0x00000010: malformed uleb128, extends past end ++# INVALIDFT: warning: '[[FILE]]': unable to dump SHT_LLVM_BB_ADDR_MAP section with index 5: unable to decode LEB128 at offset 0x00000012: malformed uleb128, extends past end + + --- !ELF + FileHeader: +@@ -181,10 +186,12 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1 + - ID: 2 + AddressOffset: 0x3 + Size: 0x4 + Metadata: 0x15 ++ Hash: 0x1 + - Version: 2 + Feature: 0x3 + BBRanges: +@@ -194,6 +201,7 @@ Sections: + AddressOffset: 0x6 + Size: 0x7 + Metadata: 0x8 ++ Hash: 0x1 + PGOAnalyses: + - FuncEntryCount: 100 + PGOBBEntries: +@@ -222,10 +230,12 @@ Sections: + AddressOffset: 0x9 + Size: 0xa + Metadata: 0x1b ++ Hash: 0x1 + - ID: 7 + AddressOffset: 0xc + Size: 0xd + Metadata: 0xe ++ Hash: 0x1 + PGOAnalyses: + - FuncEntryCount: 89 + Symbols: +diff --git a/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-relocatable.test b/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-relocatable.test +index e7f78491a947..2abe47f69c9c 100644 +--- a/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-relocatable.test ++++ b/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map-relocatable.test +@@ -21,6 +21,7 @@ + # CHECK-NEXT: IsEHPad: No + # CHECK-NEXT: CanFallThrough: No + # CHECK-NEXT: HasIndirectBranch: No ++# CHECK-NEXT: Hash: 0x1 + # CHECK-NEXT: } + # CHECK-NEXT: ] + # CHECK-NEXT: } +@@ -42,6 +43,7 @@ + # CHECK-NEXT: IsEHPad: No + # CHECK-NEXT: CanFallThrough: Yes + # CHECK-NEXT: HasIndirectBranch: No ++# CHECK-NEXT: Hash: 0x1 + # CHECK-NEXT: } + # CHECK-NEXT: ] + # CHECK-NEXT: } +@@ -70,6 +72,7 @@ Sections: + AddressOffset: 0x0 + Size: 0xF + Metadata: 0x1 ++ Hash: 0x1 + - Version: 2 + BBRanges: + - BBEntries: +@@ -77,6 +80,7 @@ Sections: + AddressOffset: 0x0 + Size: 0x11 + Metadata: 0x8 ++ Hash: 0x1 + - Name: .rela.llvm_bb_addr_map + Type: SHT_RELA + Flags: [ SHF_INFO_LINK ] +@@ -86,7 +90,7 @@ Sections: + - Offset: 0x2 + Symbol: .text + Type: R_X86_64_64 +- - Offset: 0x11 ++ - Offset: 0x12 + Symbol: .text + Type: R_X86_64_64 + Addend: 16 +@@ -146,6 +150,7 @@ Sections: + AddressOffset: 0x0 + Size: 0xF + Metadata: 0x1 ++ Hash: 0x1 + - Name: .rela.llvm_bb_addr_map + Type: SHT_RELA + Flags: [ SHF_INFO_LINK ] +@@ -201,6 +206,7 @@ Sections: + AddressOffset: 0x0 + Size: 0xF + Metadata: 0x1 ++ Hash: 0x1 + + # RUN: yaml2obj %s --docnum=5 -o %t5.o + # RUN: llvm-readobj %t5.o --bb-addr-map 2>&1 | FileCheck %s --check-prefix=ET-DYN-NO-WARNING -DFILE=%t5.o +@@ -222,6 +228,7 @@ Sections: + # ET-DYN-NO-WARNING: IsEHPad: No + # ET-DYN-NO-WARNING: CanFallThrough: No + # ET-DYN-NO-WARNING: HasIndirectBranch: No ++# ET-DYN-NO-WARNING: Hash: 0x1 + # ET-DYN-NO-WARNING: } + # ET-DYN-NO-WARNING: ] + # ET-DYN-NO-WARNING: } +diff --git a/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map.test b/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map.test +index c5d071c11d1d..447f3d3d4a0b 100644 +--- a/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map.test ++++ b/third_party/llvm-project/llvm/test/tools/llvm-readobj/ELF/bb-addr-map.test +@@ -40,6 +40,7 @@ + # CHECK-NEXT: IsEHPad: No + # CHECK-NEXT: CanFallThrough: No + # CHECK-NEXT: HasIndirectBranch: No ++# CHECK-NEXT: Hash: 0x1 + # CHECK-NEXT: } + # CHECK-NEXT: ] + # CHECK-NEXT: } +@@ -55,6 +56,7 @@ + # CHECK-NEXT: IsEHPad: Yes + # CHECK-NEXT: CanFallThrough: No + # CHECK-NEXT: HasIndirectBranch: Yes ++# CHECK-NEXT: Hash: 0x1 + # CHECK-NEXT: } + # CHECK-NEXT: ] + # CHECK-NEXT: } +@@ -75,7 +77,8 @@ + # CHECK-NEXT: HasTailCall: No + # CHECK-NEXT: IsEHPad: No + # CHECK-NEXT: CanFallThrough: Yes +-# CHECK-NEXT: HasIndirectBranch: No ++# CHECK-NEXT: HasIndirectBranch: No ++# CHECK-NEXT: Hash: 0x1 + # CHECK-NEXT: } + # CHECK-NEXT: ] + # CHECK-NEXT: } +@@ -106,6 +109,7 @@ + # TRUNCATED-NEXT: IsEHPad: No + # TRUNCATED-NEXT: CanFallThrough: Yes + # TRUNCATED-NEXT: HasIndirectBranch: Yes ++# TRUNCATED-NEXT: Hash: 0x1 + # TRUNCATED-NEXT: } + # TRUNCATED-NEXT: { + # TRUNCATED-NEXT: ID: 7 +@@ -116,6 +120,7 @@ + # TRUNCATED-NEXT: IsEHPad: Yes + # TRUNCATED-NEXT: CanFallThrough: Yes + # TRUNCATED-NEXT: HasIndirectBranch: No ++# TRUNCATED-NEXT: Hash: 0x1 + # TRUNCATED-NEXT: } + # TRUNCATED-NEXT: ] + # TRUNCATED-NEXT: } +@@ -152,12 +157,14 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: [[METADATA=0x2]] ++ Hash: 0x1 + - BaseAddress: 0x44444 + BBEntries: + - ID: 2 + AddressOffset: 0x3 + Size: 0x4 + Metadata: 0x15 ++ Hash: 0x1 + - Version: 2 + BBRanges: + - BaseAddress: 0x22222 +@@ -166,6 +173,7 @@ Sections: + AddressOffset: 0x6 + Size: 0x7 + Metadata: 0x8 ++ Hash: 0x1 + - Name: dummy_section + Type: SHT_PROGBITS + Size: 16 +@@ -181,10 +189,12 @@ Sections: + AddressOffset: 0x9 + Size: 0xa + Metadata: 0x1b ++ Hash: 0x1 + - ID: 7 + AddressOffset: 0xc + Size: 0xd + Metadata: 0xe ++ Hash: 0x1 + Symbols: + - Name: foo + Section: .text +diff --git a/third_party/llvm-project/llvm/test/tools/obj2yaml/ELF/bb-addr-map-pgo-analysis-map.yaml b/third_party/llvm-project/llvm/test/tools/obj2yaml/ELF/bb-addr-map-pgo-analysis-map.yaml +index 299bf463cf4b..7e2c8d49726c 100644 +--- a/third_party/llvm-project/llvm/test/tools/obj2yaml/ELF/bb-addr-map-pgo-analysis-map.yaml ++++ b/third_party/llvm-project/llvm/test/tools/obj2yaml/ELF/bb-addr-map-pgo-analysis-map.yaml +@@ -23,14 +23,17 @@ + # VALID-NEXT: AddressOffset: 0x1 + # VALID-NEXT: Size: 0x2 + # VALID-NEXT: Metadata: 0x3 ++# VALID-NEXT: Hash: 0x4 + # VALID-NEXT: - ID: 2 + # VALID-NEXT: AddressOffset: 0x4 + # VALID-NEXT: Size: 0x5 + # VALID-NEXT: Metadata: 0x6 ++# VALID-NEXT: Hash: 0x7 + # VALID-NEXT: - ID: 4 + # VALID-NEXT: AddressOffset: 0xFFFFFFFFFFFFFFF7 + # VALID-NEXT: Size: 0xFFFFFFFFFFFFFFF8 + # VALID-NEXT: Metadata: 0xFFFFFFFFFFFFFFF9 ++# VALID-NEXT: Hash: 0xFFFFFFFFFFFFFFFA + # VALID-NEXT: - Version: 2 + # VALID-NEXT: Feature: 0xA + # VALID-NEXT: BBRanges: +@@ -40,6 +43,7 @@ + # VALID-NEXT: AddressOffset: 0xA + # VALID-NEXT: Size: 0xB + # VALID-NEXT: Metadata: 0xC ++# VALID-NEXT: Hash: 0xD + # VALID-NEXT: PGOAnalyses: + # VALID-NEXT: - FuncEntryCount: 100 + # VALID-NEXT: PGOBBEntries: +@@ -77,14 +81,17 @@ Sections: + AddressOffset: 0x1 + Size: 0x2 + Metadata: 0x3 ++ Hash: 0x4 + - ID: 2 + AddressOffset: 0x4 + Size: 0x5 + Metadata: 0x6 ++ Hash: 0x7 + - ID: 4 + AddressOffset: 0xFFFFFFFFFFFFFFF7 + Size: 0xFFFFFFFFFFFFFFF8 + Metadata: 0xFFFFFFFFFFFFFFF9 ++ Hash: 0xFFFFFFFFFFFFFFFA + - Version: 2 + Feature: 0xA + BBRanges: +@@ -94,6 +101,7 @@ Sections: + AddressOffset: 0xA + Size: 0xB + Metadata: 0xC ++ Hash: 0xD + PGOAnalyses: + - FuncEntryCount: 100 + PGOBBEntries: +@@ -135,6 +143,7 @@ Sections: + # MULTI-NEXT: AddressOffset: 0x1 + # MULTI-NEXT: Size: 0x2 + # MULTI-NEXT: Metadata: 0x3 ++# MULTI-NEXT: Hash: 0x4 + # MULTI-NEXT: PGOAnalyses: + # MULTI-NEXT: - FuncEntryCount: 0 + # MULTI-NEXT: PGOBBEntries: +@@ -169,6 +178,7 @@ Sections: + - AddressOffset: 0x1 + Size: 0x2 + Metadata: 0x3 ++ Hash: 0x4 + PGOAnalyses: + - FuncEntryCount: 0 + PGOBBEntries: +diff --git a/third_party/llvm-project/llvm/test/tools/obj2yaml/ELF/bb-addr-map.yaml b/third_party/llvm-project/llvm/test/tools/obj2yaml/ELF/bb-addr-map.yaml +index 8dbf97ef2bc1..215e727949d1 100644 +--- a/third_party/llvm-project/llvm/test/tools/obj2yaml/ELF/bb-addr-map.yaml ++++ b/third_party/llvm-project/llvm/test/tools/obj2yaml/ELF/bb-addr-map.yaml +@@ -22,14 +22,17 @@ + # VALID-NEXT: AddressOffset: 0x1 + # VALID-NEXT: Size: 0x2 + # VALID-NEXT: Metadata: 0x3 ++# VALID-NEXT: Hash: 0x4 + # VALID-NEXT: - ID: 2 + # VALID-NEXT: AddressOffset: 0x4 + # VALID-NEXT: Size: 0x5 + # VALID-NEXT: Metadata: 0x6 ++# VALID-NEXT: Hash: 0x7 + # VALID-NEXT: - ID: 4 + # VALID-NEXT: AddressOffset: 0xFFFFFFFFFFFFFFF7 + # VALID-NEXT: Size: 0xFFFFFFFFFFFFFFF8 + # VALID-NEXT: Metadata: 0xFFFFFFFFFFFFFFF9 ++# VALID-NEXT: Hash: 0xFFFFFFFFFFFFFFFA + # VALID-NEXT: - Version: 2 + # VALID-NEXT: Feature: 0x8 + # VALID-NEXT: BBRanges: +@@ -39,6 +42,7 @@ + # VALID-NEXT: AddressOffset: 0xA + # VALID-NEXT: Size: 0xB + # VALID-NEXT: Metadata: 0xC ++# VALID-NEXT: Hash: 0xD + + --- !ELF + FileHeader: +@@ -59,14 +63,17 @@ Sections: + AddressOffset: 0x1 + Size: 0x2 + Metadata: 0x3 ++ Hash: 0x4 + - ID: 2 + AddressOffset: 0x4 + Size: 0x5 + Metadata: 0x6 ++ Hash: 0x7 + - ID: 4 + AddressOffset: 0xFFFFFFFFFFFFFFF7 + Size: 0xFFFFFFFFFFFFFFF8 + Metadata: 0xFFFFFFFFFFFFFFF9 ++ Hash: 0xFFFFFFFFFFFFFFFA + - Version: 2 + Feature: 0x8 + NumBBRanges: [[NUMBBRANGES=]] +@@ -78,6 +85,7 @@ Sections: + AddressOffset: 0xA + Size: 0xB + Metadata: 0xC ++ Hash: 0xD + + ## Check obj2yaml can dump empty .llvm_bb_addr_map sections. + +@@ -126,6 +134,7 @@ Sections: + # MULTI-NEXT: AddressOffset: 0x1 + # MULTI-NEXT: Size: 0x2 + # MULTI-NEXT: Metadata: 0x3 ++# MULTI-NEXT: Hash: 0x4 + # MULTI-NEXT: - Name: '.llvm_bb_addr_map (1)' + # MULTI-NEXT: Type: SHT_LLVM_BB_ADDR_MAP + # MULTI-NEXT: Entries: +@@ -153,6 +162,7 @@ Sections: + - AddressOffset: 0x1 + Size: 0x2 + Metadata: 0x3 ++ Hash: 0x4 + - Name: '.llvm_bb_addr_map (1)' + Type: SHT_LLVM_BB_ADDR_MAP + Entries: +diff --git a/third_party/llvm-project/llvm/test/tools/yaml2obj/ELF/bb-addr-map-pgo-analysis-map.yaml b/third_party/llvm-project/llvm/test/tools/yaml2obj/ELF/bb-addr-map-pgo-analysis-map.yaml +index 4dfaf60be3c0..1def238301dd 100644 +--- a/third_party/llvm-project/llvm/test/tools/yaml2obj/ELF/bb-addr-map-pgo-analysis-map.yaml ++++ b/third_party/llvm-project/llvm/test/tools/yaml2obj/ELF/bb-addr-map-pgo-analysis-map.yaml +@@ -6,14 +6,15 @@ + # Case 4: Specify Entries. + # CHECK: Name: .llvm_bb_addr_map (1) + # CHECK: SectionData ( +-# CHECK-NEXT: 0000: 02072000 00000000 0000010B 010203E8 +-# CHECK-NEXT: 0010: 07E80702 0CEEDDBB F70E0D91 A2C48801 ++# CHECK-NEXT: 0000: 02072000 00000000 0000010B 01020304 ++# CHECK-NEXT: 0010: E807E807 020CEEDD BBF70E0D 91A2C488 ++# CHECK-NEXT: 0020: 01 + # CHECK-NEXT: ) + + # Case 7: Not including a field which is enabled in feature doesn't emit value + # CHECK: Name: .llvm_bb_addr_map (1) + # CHECK: SectionData ( +-# CHECK-NEXT: 0000: 02012000 00000000 0000020D 010203 | ++# CHECK-NEXT: 0000: 02012000 00000000 0000020D 01020304 | + # CHECK-NEXT: ) + + --- !ELF +@@ -39,6 +40,7 @@ Sections: + AddressOffset: 0x00000001 + Size: 0x00000002 + Metadata: 0x00000003 ++ Hash: 0x00000004 + PGOAnalyses: + - FuncEntryCount: 1000 + PGOBBEntries: +@@ -63,6 +65,7 @@ Sections: + AddressOffset: 0x00000001 + Size: 0x00000002 + Metadata: 0x00000003 ++ Hash: 0x00000004 + + ## Check that yaml2obj generates a warning when we use unsupported feature. + # RUN: yaml2obj --docnum=2 %s 2>&1 | FileCheck %s --check-prefix=INVALID-FEATURE +diff --git a/third_party/llvm-project/llvm/test/tools/yaml2obj/ELF/bb-addr-map.yaml b/third_party/llvm-project/llvm/test/tools/yaml2obj/ELF/bb-addr-map.yaml +index 709938babffb..432f91953a14 100644 +--- a/third_party/llvm-project/llvm/test/tools/yaml2obj/ELF/bb-addr-map.yaml ++++ b/third_party/llvm-project/llvm/test/tools/yaml2obj/ELF/bb-addr-map.yaml +@@ -108,6 +108,7 @@ Sections: + AddressOffset: 0x00000001 + Size: 0x00000002 + Metadata: 0x00000003 ++ Hash: 0x00000004 + + ## 5) When specifying the description with Entries, the 'Address' field will be + ## zero when omitted. +@@ -121,6 +122,7 @@ Sections: + AddressOffset: 0x00000001 + Size: 0x00000002 + Metadata: 0x00000003 ++ Hash: 0x00000004 + + ## 6) We can override the NumBlocks field with a value different from the + ## actual number of BB Entries. +@@ -136,6 +138,7 @@ Sections: + AddressOffset: 0x00000001 + Size: 0x00000002 + Metadata: 0x00000003 ++ Hash: 0x00000004 + + ## 7) We can produce a SHT_LLVM_BB_ADDR_MAP section from a description + ## with one entry with empty BBRanges. +diff --git a/third_party/llvm-project/llvm/tools/llvm-readobj/ELFDumper.cpp b/third_party/llvm-project/llvm/tools/llvm-readobj/ELFDumper.cpp +index e78732353cc8..37e9720a929a 100644 +--- a/third_party/llvm-project/llvm/tools/llvm-readobj/ELFDumper.cpp ++++ b/third_party/llvm-project/llvm/tools/llvm-readobj/ELFDumper.cpp +@@ -7592,6 +7592,7 @@ void LLVMELFDumper::printBBAddrMaps(bool PrettyPGOAnalysis) { + W.printBoolean("IsEHPad", BBE.isEHPad()); + W.printBoolean("CanFallThrough", BBE.canFallThrough()); + W.printBoolean("HasIndirectBranch", BBE.hasIndirectBranch()); ++ W.printHex("Hash", BBE.Hash); + } + } + } +diff --git a/third_party/llvm-project/llvm/tools/obj2yaml/elf2yaml.cpp b/third_party/llvm-project/llvm/tools/obj2yaml/elf2yaml.cpp +index 6b9af906736c..54e8b20464fa 100644 +--- a/third_party/llvm-project/llvm/tools/obj2yaml/elf2yaml.cpp ++++ b/third_party/llvm-project/llvm/tools/obj2yaml/elf2yaml.cpp +@@ -935,7 +935,8 @@ ELFDumper::dumpBBAddrMapSection(const Elf_Shdr *Shdr) { + uint64_t Offset = Data.getULEB128(Cur); + uint64_t Size = Data.getULEB128(Cur); + uint64_t Metadata = Data.getULEB128(Cur); +- BBEntries.push_back({ID, Offset, Size, Metadata}); ++ uint64_t Hash = Data.getULEB128(Cur); ++ BBEntries.push_back({ID, Offset, Size, Metadata, Hash}); + } + TotalNumBlocks += BBEntries.size(); + BBRanges.push_back({BaseAddress, /*NumBlocks=*/{}, BBEntries}); +diff --git a/third_party/llvm-project/llvm/unittests/Object/ELFObjectFileTest.cpp b/third_party/llvm-project/llvm/unittests/Object/ELFObjectFileTest.cpp +index c4d2b4ae8b9a..cb674b1f37bb 100644 +--- a/third_party/llvm-project/llvm/unittests/Object/ELFObjectFileTest.cpp ++++ b/third_party/llvm-project/llvm/unittests/Object/ELFObjectFileTest.cpp +@@ -537,6 +537,7 @@ Sections: + - AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1234567812345678 + )"; + + { +@@ -567,6 +568,7 @@ Sections: + - AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1234567812345678 + )"; + + // Check that we can detect the malformed encoding when the section is +@@ -591,6 +593,7 @@ Sections: + AddressOffset: 0x100000000 + Size: 0xFFFFFFFF + Metadata: 0xFFFFFFFF ++ Hash: 0x1234567812345678 + )"; + + OverInt32LimitYamlStrings[1] += R"( +@@ -598,6 +601,7 @@ Sections: + AddressOffset: 0xFFFFFFFF + Size: 0x100000000 + Metadata: 0xFFFFFFFF ++ Hash: 0x1234567812345678 + )"; + + OverInt32LimitYamlStrings[2] += R"( +@@ -605,16 +609,17 @@ Sections: + AddressOffset: 0xFFFFFFFF + Size: 0xFFFFFFFF + Metadata: 0x100000000 ++ Hash: 0x1234567812345678 + )"; + + { + SCOPED_TRACE("overlimit fields"); + DoCheck(OverInt32LimitYamlStrings[0], +- "ULEB128 value at offset 0x10 exceeds UINT32_MAX (0x100000000)"); ++ "ULEB128 value at offset 0x19 exceeds UINT32_MAX (0x100000000)"); + DoCheck(OverInt32LimitYamlStrings[1], +- "ULEB128 value at offset 0x15 exceeds UINT32_MAX (0x100000000)"); ++ "ULEB128 value at offset 0x1e exceeds UINT32_MAX (0x100000000)"); + DoCheck(OverInt32LimitYamlStrings[2], +- "ULEB128 value at offset 0x1a exceeds UINT32_MAX (0x100000000)"); ++ "ULEB128 value at offset 0x23 exceeds UINT32_MAX (0x100000000)"); + } + + // Check the proper error handling when the section has fields exceeding +@@ -624,26 +629,26 @@ Sections: + 3, OverInt32LimitYamlStrings[1]); + // Truncate before the end of the 5-byte field. + OverInt32LimitAndTruncated[0] += R"( +- ShSize: 0x19 ++ ShSize: 0x22 + )"; + // Truncate at the end of the 5-byte field. + OverInt32LimitAndTruncated[1] += R"( +- ShSize: 0x1a ++ ShSize: 0x23 + )"; + // Truncate after the end of the 5-byte field. + OverInt32LimitAndTruncated[2] += R"( +- ShSize: 0x1b ++ ShSize: 0x24 + )"; + + { + SCOPED_TRACE("overlimit fields, truncated section"); + DoCheck(OverInt32LimitAndTruncated[0], +- "unable to decode LEB128 at offset 0x00000015: malformed uleb128, " ++ "unable to decode LEB128 at offset 0x0000001e: malformed uleb128, " + "extends past end"); + DoCheck(OverInt32LimitAndTruncated[1], +- "ULEB128 value at offset 0x15 exceeds UINT32_MAX (0x100000000)"); ++ "ULEB128 value at offset 0x1e exceeds UINT32_MAX (0x100000000)"); + DoCheck(OverInt32LimitAndTruncated[2], +- "ULEB128 value at offset 0x15 exceeds UINT32_MAX (0x100000000)"); ++ "ULEB128 value at offset 0x1e exceeds UINT32_MAX (0x100000000)"); + } + + // Check for proper error handling when the 'NumBlocks' field is overridden +@@ -691,6 +696,7 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1234567812345678 + - Name: .llvm_bb_addr_map_2 + Type: SHT_LLVM_BB_ADDR_MAP + Link: 1 +@@ -704,12 +710,14 @@ Sections: + AddressOffset: 0x0 + Size: 0x2 + Metadata: 0x4 ++ Hash: 0x1234567812345678 + - BaseAddress: 0xFFFFF + BBEntries: + - ID: 15 + AddressOffset: 0xF0 + Size: 0xF1 + Metadata: 0x1F ++ Hash: 0x1234567812345678 + - Name: .llvm_bb_addr_map_3 + Type: SHT_LLVM_BB_ADDR_MAP + Link: 2 +@@ -722,6 +730,7 @@ Sections: + AddressOffset: 0x0 + Size: 0x3 + Metadata: 0x6 ++ Hash: 0x1234567812345678 + - Name: .llvm_bb_addr_map_4 + Type: SHT_LLVM_BB_ADDR_MAP + # Link: 0 (by default, can be overriden) +@@ -734,17 +743,39 @@ Sections: + AddressOffset: 0x0 + Size: 0x4 + Metadata: 0x18 ++ Hash: 0x1234567812345678 + )"); + +- BBAddrMap E1 = { +- {{0x11111, {{1, 0x0, 0x1, {false, true, false, false, false}}}}}}; +- BBAddrMap E2 = { +- {{0x22222, {{2, 0x0, 0x2, {false, false, true, false, false}}}}, +- {0xFFFFF, {{15, 0xF0, 0xF1, {true, true, true, true, true}}}}}}; +- BBAddrMap E3 = { +- {{0x33333, {{0, 0x0, 0x3, {false, true, true, false, false}}}}}}; +- BBAddrMap E4 = { +- {{0x44444, {{0, 0x0, 0x4, {false, false, false, true, true}}}}}}; ++ BBAddrMap E1 = {{{0x11111, ++ {{1, ++ 0x0, ++ 0x1, ++ {false, true, false, false, false}, ++ 0x1234567812345678}}}}}; ++ BBAddrMap E2 = {{{0x22222, ++ {{2, ++ 0x0, ++ 0x2, ++ {false, false, true, false, false}, ++ 0x1234567812345678}}}, ++ {0xFFFFF, ++ {{15, ++ 0xF0, ++ 0xF1, ++ {true, true, true, true, true}, ++ 0x1234567812345678}}}}}; ++ BBAddrMap E3 = {{{0x33333, ++ {{0, ++ 0x0, ++ 0x3, ++ {false, true, true, false, false}, ++ 0x1234567812345678}}}}}; ++ BBAddrMap E4 = {{{0x44444, ++ {{0, ++ 0x0, ++ 0x4, ++ {false, false, false, true, true}, ++ 0x1234567812345678}}}}}; + + std::vector Section0BBAddrMaps = {E4}; + std::vector Section1BBAddrMaps = {E3}; +@@ -886,6 +917,7 @@ Sections: + - AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1234567812345678 + )"; + + { +@@ -904,6 +936,7 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1234567812345678 + )"; + + // Check that we fail when function entry count is enabled but not provided. +@@ -930,11 +963,12 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1234567812345678 + )"; + + { + SCOPED_TRACE("missing bb frequency"); +- DoCheck(MissingBBFreq, "unable to decode LEB128 at offset 0x0000000f: " ++ DoCheck(MissingBBFreq, "unable to decode LEB128 at offset 0x00000018: " + "malformed uleb128, extends past end"); + } + +@@ -949,14 +983,17 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x6 ++ Hash: 0x1234567812345678 + - ID: 2 + AddressOffset: 0x1 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1234567812345678 + - ID: 3 + AddressOffset: 0x2 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1234567812345678 + PGOAnalyses: + - PGOBBEntries: + - Successors: +@@ -971,7 +1008,7 @@ Sections: + + { + SCOPED_TRACE("missing branch probability"); +- DoCheck(MissingBrProb, "unable to decode LEB128 at offset 0x00000017: " ++ DoCheck(MissingBrProb, "unable to decode LEB128 at offset 0x00000032: " + "malformed uleb128, extends past end"); + } + } +@@ -998,6 +1035,7 @@ Sections: + AddressOffset: 0x0 + Size: 0x1 + Metadata: 0x2 ++ Hash: 0x1234567812345678 + PGOAnalyses: + - FuncEntryCount: 892 + - Name: .llvm_bb_addr_map_2 +@@ -1013,6 +1051,7 @@ Sections: + AddressOffset: 0x0 + Size: 0x2 + Metadata: 0x4 ++ Hash: 0x1234567812345678 + PGOAnalyses: + - PGOBBEntries: + - BBFreq: 343 +@@ -1029,14 +1068,17 @@ Sections: + AddressOffset: 0x0 + Size: 0x3 + Metadata: 0x6 ++ Hash: 0x1234567812345678 + - ID: 1 + AddressOffset: 0x0 + Size: 0x3 + Metadata: 0x4 ++ Hash: 0x1234567812345678 + - ID: 2 + AddressOffset: 0x0 + Size: 0x3 + Metadata: 0x0 ++ Hash: 0x1234567812345678 + PGOAnalyses: + - PGOBBEntries: + - Successors: +@@ -1061,18 +1103,22 @@ Sections: + AddressOffset: 0x0 + Size: 0x4 + Metadata: 0x18 ++ Hash: 0x1234567812345678 + - ID: 1 + AddressOffset: 0x0 + Size: 0x4 + Metadata: 0x0 ++ Hash: 0x1234567812345678 + - ID: 2 + AddressOffset: 0x0 + Size: 0x4 + Metadata: 0x0 ++ Hash: 0x1234567812345678 + - ID: 3 + AddressOffset: 0x0 + Size: 0x4 + Metadata: 0x0 ++ Hash: 0x1234567812345678 + PGOAnalyses: + - FuncEntryCount: 1000 + PGOBBEntries: +@@ -1109,6 +1155,7 @@ Sections: + AddressOffset: 0x0 + Size: 0x2 + Metadata: 0x4 ++ Hash: 0x1234567812345678 + PGOAnalyses: [{}] + - Name: .llvm_bb_addr_map_6 + Type: SHT_LLVM_BB_ADDR_MAP +@@ -1123,16 +1170,19 @@ Sections: + AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x6 ++ Hash: 0x1234567812345678 + - ID: 1 + AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x4 ++ Hash: 0x1234567812345678 + - BaseAddress: 0x666661 + BBEntries: + - ID: 2 + AddressOffset: 0x0 + Size: 0x6 + Metadata: 0x0 ++ Hash: 0x1234567812345678 + PGOAnalyses: + - PGOBBEntries: + - Successors: +@@ -1146,17 +1196,30 @@ Sections: + - Successors: [] + )"); + +- BBAddrMap E1 = { +- {{0x11111, {{1, 0x0, 0x1, {false, true, false, false, false}}}}}}; ++ BBAddrMap E1 = {{{0x11111, ++ {{1, ++ 0x0, ++ 0x1, ++ {false, true, false, false, false}, ++ 0x1234567812345678}}}}}; + PGOAnalysisMap P1 = {892, {}, {true, false, false, false}}; +- BBAddrMap E2 = { +- {{0x22222, {{2, 0x0, 0x2, {false, false, true, false, false}}}}}}; ++ BBAddrMap E2 = {{{0x22222, ++ {{2, ++ 0x0, ++ 0x2, ++ {false, false, true, false, false}, ++ 0x1234567812345678}}}}}; + PGOAnalysisMap P2 = { + {}, {{BlockFrequency(343), {}}}, {false, true, false, false}}; +- BBAddrMap E3 = {{{0x33333, +- {{0, 0x0, 0x3, {false, true, true, false, false}}, +- {1, 0x3, 0x3, {false, false, true, false, false}}, +- {2, 0x6, 0x3, {false, false, false, false, false}}}}}}; ++ BBAddrMap E3 = { ++ {{0x33333, ++ {{0, 0x0, 0x3, {false, true, true, false, false}, 0x1234567812345678}, ++ {1, 0x3, 0x3, {false, false, true, false, false}, 0x1234567812345678}, ++ {2, ++ 0x6, ++ 0x3, ++ {false, false, false, false, false}, ++ 0x1234567812345678}}}}}; + PGOAnalysisMap P3 = {{}, + {{{}, + {{1, BranchProbability::getRaw(0x1111'1111)}, +@@ -1164,11 +1227,16 @@ Sections: + {{}, {{2, BranchProbability::getRaw(0xffff'ffff)}}}, + {{}, {}}}, + {false, false, true, false}}; +- BBAddrMap E4 = {{{0x44444, +- {{0, 0x0, 0x4, {false, false, false, true, true}}, +- {1, 0x4, 0x4, {false, false, false, false, false}}, +- {2, 0x8, 0x4, {false, false, false, false, false}}, +- {3, 0xc, 0x4, {false, false, false, false, false}}}}}}; ++ BBAddrMap E4 = { ++ {{0x44444, ++ {{0, 0x0, 0x4, {false, false, false, true, true}, 0x1234567812345678}, ++ {1, 0x4, 0x4, {false, false, false, false, false}, 0x1234567812345678}, ++ {2, 0x8, 0x4, {false, false, false, false, false}, 0x1234567812345678}, ++ {3, ++ 0xc, ++ 0x4, ++ {false, false, false, false, false}, ++ 0x1234567812345678}}}}}; + PGOAnalysisMap P4 = { + 1000, + {{BlockFrequency(1000), +@@ -1181,14 +1249,27 @@ Sections: + {BlockFrequency(18), {{3, BranchProbability::getRaw(0xffff'ffff)}}}, + {BlockFrequency(1000), {}}}, + {true, true, true, false}}; +- BBAddrMap E5 = { +- {{0x55555, {{2, 0x0, 0x2, {false, false, true, false, false}}}}}}; ++ BBAddrMap E5 = {{{0x55555, ++ {{2, ++ 0x0, ++ 0x2, ++ {false, false, true, false, false}, ++ 0x1234567812345678}}}}}; + PGOAnalysisMap P5 = {{}, {}, {false, false, false, false}}; + BBAddrMap E6 = { + {{0x66666, +- {{0, 0x0, 0x6, {false, true, true, false, false}}, +- {1, 0x6, 0x6, {false, false, true, false, false}}}}, +- {0x666661, {{2, 0x0, 0x6, {false, false, false, false, false}}}}}}; ++ {{0, 0x0, 0x6, {false, true, true, false, false}, 0x1234567812345678}, ++ {1, ++ 0x6, ++ 0x6, ++ {false, false, true, false, false}, ++ 0x1234567812345678}}}, ++ {0x666661, ++ {{2, ++ 0x0, ++ 0x6, ++ {false, false, false, false, false}, ++ 0x1234567812345678}}}}}; + PGOAnalysisMap P6 = {{}, + {{{}, + {{1, BranchProbability::getRaw(0x2222'2222)}, +-- +2.33.0 + diff --git a/autofdo.spec b/autofdo.spec index eee1e89d96e253b1f668d75ebf973cae8bd07fda..0b2fd3a9f762a53dffa59257d27b7739482e6cf3 100644 --- a/autofdo.spec +++ b/autofdo.spec @@ -3,7 +3,7 @@ Name: autofdo Version: 0.30.1 -Release: 4 +Release: 5 Summary: A tool to convert perf.data profile to AutoFDO profile License: Apache-2.0 URL: https://github.com/google/autofdo @@ -18,6 +18,7 @@ Patch2: 0002-unscaledcycleclock-remove-RISC-V-support.patch Patch3: 0003-Backport-Added-DBUILD_SHARED-On-Off-to-control-whether-to-bui.patch Patch4: 0004-Rename-LLVM-tools-to-distinguish-them-from-GCOV-tool.patch Patch5: 0005-Build-protobuf-from-source-directly.patch +Patch6: 0006-Propeller-Add-BB-Hash-in-cc-profile.patch BuildRequires: gcc gcc-c++ libtool git cmake elfutils-libelf-devel openssl-devel pkg-config ninja-build gtest libunwind-devel chrpath Requires: glibc openssl-libs elfutils libgcc libstdc++ zlib @@ -66,6 +67,12 @@ export QA_CHECK_RAPTH=0 %{_bindir}/create_llvm_prof %changelog +* Wed Jun 4 2025 xiajingze - 0.30.1-5 +- Type:enhancement +- ID:NA +- SUG:NA +- DESC: [Propeller] Add BB Hash in cc profile + * Tue Apr 29 2025 xiajingze - 0.30.1-4 - Type:enhancement - ID:NA