diff --git a/llvm/include/llvm/ProfileData/SampleProfReader.h b/llvm/include/llvm/ProfileData/SampleProfReader.h --- a/llvm/include/llvm/ProfileData/SampleProfReader.h +++ b/llvm/include/llvm/ProfileData/SampleProfReader.h @@ -481,6 +481,8 @@ std::error_code readSecHdrTable(); virtual std::error_code readHeader() override; virtual std::error_code verifySPMagic(uint64_t Magic) override = 0; + virtual std::error_code readOneSection(const uint8_t *Start, uint64_t Size, + SecType Type) = 0; public: SampleProfileReaderExtBinaryBase(std::unique_ptr B, @@ -494,6 +496,8 @@ class SampleProfileReaderExtBinary : public SampleProfileReaderExtBinaryBase { private: virtual std::error_code verifySPMagic(uint64_t Magic) override; + virtual std::error_code readOneSection(const uint8_t *Start, uint64_t Size, + SecType Type) override; public: SampleProfileReaderExtBinary(std::unique_ptr B, LLVMContext &C, diff --git a/llvm/lib/ProfileData/SampleProfReader.cpp b/llvm/lib/ProfileData/SampleProfReader.cpp --- a/llvm/lib/ProfileData/SampleProfReader.cpp +++ b/llvm/lib/ProfileData/SampleProfReader.cpp @@ -467,6 +467,31 @@ return sampleprof_error::success; } +std::error_code +SampleProfileReaderExtBinary::readOneSection(const uint8_t *Start, + uint64_t Size, SecType Type) { + Data = Start; + switch (Type) { + case SecProfSummary: + if (std::error_code EC = readSummary()) + return EC; + break; + case SecNameTable: + if (std::error_code EC = readNameTable()) + return EC; + break; + case SecLBRProfile: + while (Data < Start + Size) { + if (std::error_code EC = readFuncProfile()) + return EC; + } + break; + default: + break; + } + return sampleprof_error::success; +} + std::error_code SampleProfileReaderExtBinaryBase::read() { const uint8_t *BufStart = reinterpret_cast(Buffer->getBufferStart()); @@ -475,26 +500,10 @@ // Skip empty section. if (!Entry.Size) continue; - Data = BufStart + Entry.Offset; - switch (Entry.Type) { - case SecProfSummary: - if (std::error_code EC = readSummary()) - return EC; - break; - case SecNameTable: - if (std::error_code EC = readNameTable()) - return EC; - break; - case SecLBRProfile: - while (Data < BufStart + Entry.Offset + Entry.Size) { - if (std::error_code EC = readFuncProfile()) - return EC; - } - break; - default: - continue; - } - if (Data != BufStart + Entry.Offset + Entry.Size) + const uint8_t *SecStart = BufStart + Entry.Offset; + if (std::error_code EC = readOneSection(SecStart, Entry.Size, Entry.Type)) + return EC; + if (Data != SecStart + Entry.Size) return sampleprof_error::malformed; }