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<T>> getSectionContentsAsArray(const Elf_Shdr &Sec) const;
|
||||||
Expected<ArrayRef<uint8_t>> getSectionContents(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<ArrayRef<uint8_t>> getSegmentContents(const Elf_Phdr &Phdr) const;
|
||||||
Expected<std::vector<Elf_BBAddrMap>>
|
Expected<std::vector<BBAddrMap>> decodeBBAddrMap(const Elf_Shdr &Sec) const;
|
||||||
decodeBBAddrMap(const Elf_Shdr &Sec) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
using ELF32LEFile = ELFFile<ELF32LE>;
|
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_Impl;
|
||||||
template <class ELFT> class Elf_Note_Iterator_Impl;
|
template <class ELFT> class Elf_Note_Iterator_Impl;
|
||||||
template <class ELFT> struct Elf_CGProfile_Impl;
|
template <class ELFT> struct Elf_CGProfile_Impl;
|
||||||
template <class ELFT> struct Elf_BBAddrMap_Impl;
|
|
||||||
|
|
||||||
template <endianness E, bool Is64> struct ELFType {
|
template <endianness E, bool Is64> struct ELFType {
|
||||||
private:
|
private:
|
||||||
|
@ -76,7 +75,6 @@ public:
|
||||||
using Note = Elf_Note_Impl<ELFType<E, Is64>>;
|
using Note = Elf_Note_Impl<ELFType<E, Is64>>;
|
||||||
using NoteIterator = Elf_Note_Iterator_Impl<ELFType<E, Is64>>;
|
using NoteIterator = Elf_Note_Iterator_Impl<ELFType<E, Is64>>;
|
||||||
using CGProfile = Elf_CGProfile_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 DynRange = ArrayRef<Dyn>;
|
||||||
using ShdrRange = ArrayRef<Shdr>;
|
using ShdrRange = ArrayRef<Shdr>;
|
||||||
using SymRange = ArrayRef<Sym>;
|
using SymRange = ArrayRef<Sym>;
|
||||||
|
@ -131,7 +129,6 @@ using ELF64BE = ELFType<support::big, true>;
|
||||||
using Elf_Note = typename ELFT::Note; \
|
using Elf_Note = typename ELFT::Note; \
|
||||||
using Elf_Note_Iterator = typename ELFT::NoteIterator; \
|
using Elf_Note_Iterator = typename ELFT::NoteIterator; \
|
||||||
using Elf_CGProfile = typename ELFT::CGProfile; \
|
using Elf_CGProfile = typename ELFT::CGProfile; \
|
||||||
using Elf_BBAddrMap = typename ELFT::BBAddrMap; \
|
|
||||||
using Elf_Dyn_Range = typename ELFT::DynRange; \
|
using Elf_Dyn_Range = typename ELFT::DynRange; \
|
||||||
using Elf_Shdr_Range = typename ELFT::ShdrRange; \
|
using Elf_Shdr_Range = typename ELFT::ShdrRange; \
|
||||||
using Elf_Sym_Range = typename ELFT::SymRange; \
|
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.
|
// Struct representing the BBAddrMap for one function.
|
||||||
template <class ELFT> struct Elf_BBAddrMap_Impl {
|
struct BBAddrMap {
|
||||||
LLVM_ELF_IMPORT_TYPES_ELFT(ELFT)
|
uint64_t Addr; // Function address
|
||||||
uintX_t Addr; // Function address
|
|
||||||
// Struct representing the BBAddrMap information for one basic block.
|
// Struct representing the BBAddrMap information for one basic block.
|
||||||
struct BBEntry {
|
struct BBEntry {
|
||||||
uint32_t Offset; // Offset of basic block relative to function start.
|
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>
|
template <class ELFT>
|
||||||
Expected<std::vector<typename ELFT::BBAddrMap>>
|
Expected<std::vector<BBAddrMap>>
|
||||||
ELFFile<ELFT>::decodeBBAddrMap(const Elf_Shdr &Sec) const {
|
ELFFile<ELFT>::decodeBBAddrMap(const Elf_Shdr &Sec) const {
|
||||||
Expected<ArrayRef<uint8_t>> ContentsOrErr = getSectionContents(Sec);
|
Expected<ArrayRef<uint8_t>> ContentsOrErr = getSectionContents(Sec);
|
||||||
if (!ContentsOrErr)
|
if (!ContentsOrErr)
|
||||||
return ContentsOrErr.takeError();
|
return ContentsOrErr.takeError();
|
||||||
ArrayRef<uint8_t> Content = *ContentsOrErr;
|
ArrayRef<uint8_t> Content = *ContentsOrErr;
|
||||||
DataExtractor Data(Content, isLE(), ELFT::Is64Bits ? 8 : 4);
|
DataExtractor Data(Content, isLE(), ELFT::Is64Bits ? 8 : 4);
|
||||||
std::vector<Elf_BBAddrMap> FunctionEntries;
|
std::vector<BBAddrMap> FunctionEntries;
|
||||||
|
|
||||||
DataExtractor::Cursor Cur(0);
|
DataExtractor::Cursor Cur(0);
|
||||||
Error ULEBSizeErr = Error::success();
|
Error ULEBSizeErr = Error::success();
|
||||||
|
@ -656,7 +656,7 @@ ELFFile<ELFT>::decodeBBAddrMap(const Elf_Shdr &Sec) const {
|
||||||
while (!ULEBSizeErr && Cur && Cur.tell() < Content.size()) {
|
while (!ULEBSizeErr && Cur && Cur.tell() < Content.size()) {
|
||||||
uintX_t Address = static_cast<uintX_t>(Data.getAddress(Cur));
|
uintX_t Address = static_cast<uintX_t>(Data.getAddress(Cur));
|
||||||
uint32_t NumBlocks = ReadULEB128AsUInt32();
|
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);
|
for (uint32_t BlockID = 0; !ULEBSizeErr && Cur && (BlockID < NumBlocks);
|
||||||
++BlockID) {
|
++BlockID) {
|
||||||
uint32_t Offset = ReadULEB128AsUInt32();
|
uint32_t Offset = ReadULEB128AsUInt32();
|
||||||
|
|
|
@ -6894,14 +6894,14 @@ template <class ELFT> void LLVMELFDumper<ELFT>::printBBAddrMaps() {
|
||||||
FunctionSec =
|
FunctionSec =
|
||||||
unwrapOrError(this->FileName, this->Obj.getSection(Sec.sh_link));
|
unwrapOrError(this->FileName, this->Obj.getSection(Sec.sh_link));
|
||||||
ListScope L(W, "BBAddrMap");
|
ListScope L(W, "BBAddrMap");
|
||||||
Expected<std::vector<Elf_BBAddrMap>> BBAddrMapOrErr =
|
Expected<std::vector<BBAddrMap>> BBAddrMapOrErr =
|
||||||
this->Obj.decodeBBAddrMap(Sec);
|
this->Obj.decodeBBAddrMap(Sec);
|
||||||
if (!BBAddrMapOrErr) {
|
if (!BBAddrMapOrErr) {
|
||||||
this->reportUniqueWarning("unable to dump " + this->describe(Sec) + ": " +
|
this->reportUniqueWarning("unable to dump " + this->describe(Sec) + ": " +
|
||||||
toString(BBAddrMapOrErr.takeError()));
|
toString(BBAddrMapOrErr.takeError()));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
for (const Elf_BBAddrMap &AM : *BBAddrMapOrErr) {
|
for (const BBAddrMap &AM : *BBAddrMapOrErr) {
|
||||||
DictScope D(W, "Function");
|
DictScope D(W, "Function");
|
||||||
W.printHex("At", AM.Addr);
|
W.printHex("At", AM.Addr);
|
||||||
SmallVector<uint32_t> FuncSymIndex =
|
SmallVector<uint32_t> FuncSymIndex =
|
||||||
|
@ -6916,7 +6916,7 @@ template <class ELFT> void LLVMELFDumper<ELFT>::printBBAddrMaps() {
|
||||||
W.printString("Name", FuncName);
|
W.printString("Name", FuncName);
|
||||||
|
|
||||||
ListScope L(W, "BB entries");
|
ListScope L(W, "BB entries");
|
||||||
for (const typename Elf_BBAddrMap::BBEntry &BBE : AM.BBEntries) {
|
for (const BBAddrMap::BBEntry &BBE : AM.BBEntries) {
|
||||||
DictScope L(W);
|
DictScope L(W);
|
||||||
W.printHex("Offset", BBE.Offset);
|
W.printHex("Offset", BBE.Offset);
|
||||||
W.printHex("Size", BBE.Size);
|
W.printHex("Size", BBE.Size);
|
||||||
|
|
Loading…
Reference in New Issue