forked from OSchip/llvm-project
Make the BBAddrMap struct binary-format-agnostic.
The only binary-format-related field in the BBAddrMap structure is the function address (`Addr`), which will use uint64_t in 64B format and uint32_t in 32B format. This patch changes it to use uint64_t in both formats. This allows non-templated use of the struct, at the expense of a marginal additional size overhead for the 32-bit format. The size of the BB address map section does not change. Differential Revision: https://reviews.llvm.org/D112679
This commit is contained in:
parent
0649dfebba
commit
f533ec37eb
|
@ -388,8 +388,7 @@ public:
|
|||
Expected<ArrayRef<T>> getSectionContentsAsArray(const Elf_Shdr &Sec) const;
|
||||
Expected<ArrayRef<uint8_t>> getSectionContents(const Elf_Shdr &Sec) const;
|
||||
Expected<ArrayRef<uint8_t>> getSegmentContents(const Elf_Phdr &Phdr) const;
|
||||
Expected<std::vector<Elf_BBAddrMap>>
|
||||
decodeBBAddrMap(const Elf_Shdr &Sec) const;
|
||||
Expected<std::vector<BBAddrMap>> decodeBBAddrMap(const Elf_Shdr &Sec) const;
|
||||
};
|
||||
|
||||
using ELF32LEFile = ELFFile<ELF32LE>;
|
||||
|
|
|
@ -44,7 +44,6 @@ template <class ELFT> struct Elf_Nhdr_Impl;
|
|||
template <class ELFT> class Elf_Note_Impl;
|
||||
template <class ELFT> class Elf_Note_Iterator_Impl;
|
||||
template <class ELFT> struct Elf_CGProfile_Impl;
|
||||
template <class ELFT> struct Elf_BBAddrMap_Impl;
|
||||
|
||||
template <endianness E, bool Is64> struct ELFType {
|
||||
private:
|
||||
|
@ -76,7 +75,6 @@ public:
|
|||
using Note = Elf_Note_Impl<ELFType<E, Is64>>;
|
||||
using NoteIterator = Elf_Note_Iterator_Impl<ELFType<E, Is64>>;
|
||||
using CGProfile = Elf_CGProfile_Impl<ELFType<E, Is64>>;
|
||||
using BBAddrMap = Elf_BBAddrMap_Impl<ELFType<E, Is64>>;
|
||||
using DynRange = ArrayRef<Dyn>;
|
||||
using ShdrRange = ArrayRef<Shdr>;
|
||||
using SymRange = ArrayRef<Sym>;
|
||||
|
@ -131,7 +129,6 @@ using ELF64BE = ELFType<support::big, true>;
|
|||
using Elf_Note = typename ELFT::Note; \
|
||||
using Elf_Note_Iterator = typename ELFT::NoteIterator; \
|
||||
using Elf_CGProfile = typename ELFT::CGProfile; \
|
||||
using Elf_BBAddrMap = typename ELFT::BBAddrMap; \
|
||||
using Elf_Dyn_Range = typename ELFT::DynRange; \
|
||||
using Elf_Shdr_Range = typename ELFT::ShdrRange; \
|
||||
using Elf_Sym_Range = typename ELFT::SymRange; \
|
||||
|
@ -797,9 +794,8 @@ template <class ELFT> struct Elf_Mips_ABIFlags {
|
|||
};
|
||||
|
||||
// Struct representing the BBAddrMap for one function.
|
||||
template <class ELFT> struct Elf_BBAddrMap_Impl {
|
||||
LLVM_ELF_IMPORT_TYPES_ELFT(ELFT)
|
||||
uintX_t Addr; // Function address
|
||||
struct BBAddrMap {
|
||||
uint64_t Addr; // Function address
|
||||
// Struct representing the BBAddrMap information for one basic block.
|
||||
struct BBEntry {
|
||||
uint32_t Offset; // Offset of basic block relative to function start.
|
||||
|
|
|
@ -622,14 +622,14 @@ ELFFile<ELFT>::toMappedAddr(uint64_t VAddr, WarningHandler WarnHandler) const {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
Expected<std::vector<typename ELFT::BBAddrMap>>
|
||||
Expected<std::vector<BBAddrMap>>
|
||||
ELFFile<ELFT>::decodeBBAddrMap(const Elf_Shdr &Sec) const {
|
||||
Expected<ArrayRef<uint8_t>> ContentsOrErr = getSectionContents(Sec);
|
||||
if (!ContentsOrErr)
|
||||
return ContentsOrErr.takeError();
|
||||
ArrayRef<uint8_t> Content = *ContentsOrErr;
|
||||
DataExtractor Data(Content, isLE(), ELFT::Is64Bits ? 8 : 4);
|
||||
std::vector<Elf_BBAddrMap> FunctionEntries;
|
||||
std::vector<BBAddrMap> FunctionEntries;
|
||||
|
||||
DataExtractor::Cursor Cur(0);
|
||||
Error ULEBSizeErr = Error::success();
|
||||
|
@ -656,7 +656,7 @@ ELFFile<ELFT>::decodeBBAddrMap(const Elf_Shdr &Sec) const {
|
|||
while (!ULEBSizeErr && Cur && Cur.tell() < Content.size()) {
|
||||
uintX_t Address = static_cast<uintX_t>(Data.getAddress(Cur));
|
||||
uint32_t NumBlocks = ReadULEB128AsUInt32();
|
||||
std::vector<typename Elf_BBAddrMap::BBEntry> BBEntries;
|
||||
std::vector<BBAddrMap::BBEntry> BBEntries;
|
||||
for (uint32_t BlockID = 0; !ULEBSizeErr && Cur && (BlockID < NumBlocks);
|
||||
++BlockID) {
|
||||
uint32_t Offset = ReadULEB128AsUInt32();
|
||||
|
|
|
@ -6894,14 +6894,14 @@ template <class ELFT> void LLVMELFDumper<ELFT>::printBBAddrMaps() {
|
|||
FunctionSec =
|
||||
unwrapOrError(this->FileName, this->Obj.getSection(Sec.sh_link));
|
||||
ListScope L(W, "BBAddrMap");
|
||||
Expected<std::vector<Elf_BBAddrMap>> BBAddrMapOrErr =
|
||||
Expected<std::vector<BBAddrMap>> BBAddrMapOrErr =
|
||||
this->Obj.decodeBBAddrMap(Sec);
|
||||
if (!BBAddrMapOrErr) {
|
||||
this->reportUniqueWarning("unable to dump " + this->describe(Sec) + ": " +
|
||||
toString(BBAddrMapOrErr.takeError()));
|
||||
continue;
|
||||
}
|
||||
for (const Elf_BBAddrMap &AM : *BBAddrMapOrErr) {
|
||||
for (const BBAddrMap &AM : *BBAddrMapOrErr) {
|
||||
DictScope D(W, "Function");
|
||||
W.printHex("At", AM.Addr);
|
||||
SmallVector<uint32_t> FuncSymIndex =
|
||||
|
@ -6916,7 +6916,7 @@ template <class ELFT> void LLVMELFDumper<ELFT>::printBBAddrMaps() {
|
|||
W.printString("Name", FuncName);
|
||||
|
||||
ListScope L(W, "BB entries");
|
||||
for (const typename Elf_BBAddrMap::BBEntry &BBE : AM.BBEntries) {
|
||||
for (const BBAddrMap::BBEntry &BBE : AM.BBEntries) {
|
||||
DictScope L(W);
|
||||
W.printHex("Offset", BBE.Offset);
|
||||
W.printHex("Size", BBE.Size);
|
||||
|
|
Loading…
Reference in New Issue