|
9 | 9 | #include "llvm/Object/ELF.h"
|
10 | 10 | #include "llvm/ADT/StringExtras.h"
|
11 | 11 | #include "llvm/BinaryFormat/ELF.h"
|
| 12 | +#include "llvm/Object/Decompressor.h" |
12 | 13 | #include "llvm/Support/Compiler.h"
|
13 | 14 | #include "llvm/Support/DataExtractor.h"
|
14 | 15 |
|
@@ -782,6 +783,26 @@ decodeBBAddrMapImpl(const ELFFile<ELFT> &EF,
|
782 | 783 | if (!ContentsOrErr)
|
783 | 784 | return ContentsOrErr.takeError();
|
784 | 785 | ArrayRef<uint8_t> Content = *ContentsOrErr;
|
| 786 | + |
| 787 | + // Decompress the section if needed. |
| 788 | + std::unique_ptr<uint8_t[]> DecompressedContent; |
| 789 | + if (Sec.sh_flags & llvm::ELF::SHF_COMPRESSED) { |
| 790 | + Expected<StringRef> SectionNameOrErr = EF.getSectionName(Sec); |
| 791 | + if (!SectionNameOrErr) |
| 792 | + return SectionNameOrErr.takeError(); |
| 793 | + auto DecompressorOrErr = |
| 794 | + Decompressor::create(*SectionNameOrErr, toStringRef(*ContentsOrErr), |
| 795 | + EF.isLE(), ELFT::Is64Bits); |
| 796 | + if (!DecompressorOrErr) |
| 797 | + return DecompressorOrErr.takeError(); |
| 798 | + size_t DecompressedSize = DecompressorOrErr->getDecompressedSize(); |
| 799 | + DecompressedContent = std::make_unique<uint8_t[]>(DecompressedSize); |
| 800 | + if (Error Err = DecompressorOrErr->decompress( |
| 801 | + {DecompressedContent.get(), size_t(DecompressedSize)})) |
| 802 | + return std::move(Err); |
| 803 | + Content = {DecompressedContent.get(), DecompressedSize}; |
| 804 | + } |
| 805 | + |
785 | 806 | DataExtractor Data(Content, EF.isLE(), ELFT::Is64Bits ? 8 : 4);
|
786 | 807 | std::vector<BBAddrMap> FunctionEntries;
|
787 | 808 |
|
|
0 commit comments