diff options
Diffstat (limited to 'llvm/lib/Object/ELF.cpp')
| -rw-r--r-- | llvm/lib/Object/ELF.cpp | 26 | 
1 files changed, 21 insertions, 5 deletions
| diff --git a/llvm/lib/Object/ELF.cpp b/llvm/lib/Object/ELF.cpp index 6da97f9..354c51d 100644 --- a/llvm/lib/Object/ELF.cpp +++ b/llvm/lib/Object/ELF.cpp @@ -831,17 +831,17 @@ decodeBBAddrMapImpl(const ELFFile<ELFT> &EF,    };    uint8_t Version = 0; -  uint8_t Feature = 0; +  uint16_t Feature = 0;    BBAddrMap::Features FeatEnable{};    while (!ULEBSizeErr && !MetadataDecodeErr && Cur &&           Cur.tell() < Content.size()) {      Version = Data.getU8(Cur);      if (!Cur)        break; -    if (Version < 2 || Version > 4) +    if (Version < 2 || Version > 5)        return createError("unsupported SHT_LLVM_BB_ADDR_MAP version: " +                           Twine(static_cast<int>(Version))); -    Feature = Data.getU8(Cur); // Feature byte +    Feature = Version < 5 ? Data.getU8(Cur) : Data.getU16(Cur);      if (!Cur)        break;      auto FeatEnableOrErr = BBAddrMap::Features::decode(Feature); @@ -858,6 +858,11 @@ decodeBBAddrMapImpl(const ELFFile<ELFT> &EF,                           "basic block hash feature is enabled: version = " +                           Twine(static_cast<int>(Version)) +                           " feature = " + Twine(static_cast<int>(Feature))); +    if (FeatEnable.PostLinkCfg && Version < 5) +      return createError("version should be >= 5 for SHT_LLVM_BB_ADDR_MAP when " +                         "post link cfg feature is enabled: version = " + +                         Twine(static_cast<int>(Version)) + +                         " feature = " + Twine(static_cast<int>(Feature)));      uint32_t NumBlocksInBBRange = 0;      uint32_t NumBBRanges = 1;      typename ELFFile<ELFT>::uintX_t RangeBaseAddress = 0; @@ -946,6 +951,10 @@ decodeBBAddrMapImpl(const ELFFile<ELFT> &EF,          uint64_t BBF = FeatEnable.BBFreq                             ? readULEB128As<uint64_t>(Data, Cur, ULEBSizeErr)                             : 0; +        uint32_t PostLinkBBFreq = +            FeatEnable.PostLinkCfg +                ? readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr) +                : 0;          // Branch probability          llvm::SmallVector<PGOAnalysisMap::PGOBBEntry::SuccessorEntry, 2> @@ -955,13 +964,20 @@ decodeBBAddrMapImpl(const ELFFile<ELFT> &EF,            for (uint64_t I = 0; I < SuccCount; ++I) {              uint32_t BBID = readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr);              uint32_t BrProb = readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr); +            uint32_t PostLinkFreq = +                FeatEnable.PostLinkCfg +                    ? readULEB128As<uint32_t>(Data, Cur, ULEBSizeErr) +                    : 0; +              if (PGOAnalyses) -              Successors.push_back({BBID, BranchProbability::getRaw(BrProb)}); +              Successors.push_back( +                  {BBID, BranchProbability::getRaw(BrProb), PostLinkFreq});            }          }          if (PGOAnalyses) -          PGOBBEntries.push_back({BlockFrequency(BBF), std::move(Successors)}); +          PGOBBEntries.push_back( +              {BlockFrequency(BBF), PostLinkBBFreq, std::move(Successors)});        }        if (PGOAnalyses) | 
