mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-14 09:56:23 +00:00
Implement containsSymbol with other lower level methods.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241112 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ce772898d6
commit
d231306ba8
@ -669,7 +669,6 @@ protected:
|
||||
bool isSectionData(DataRefImpl Sec) const override;
|
||||
bool isSectionBSS(DataRefImpl Sec) const override;
|
||||
bool isSectionVirtual(DataRefImpl Sec) const override;
|
||||
bool sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb) const override;
|
||||
relocation_iterator section_rel_begin(DataRefImpl Sec) const override;
|
||||
relocation_iterator section_rel_end(DataRefImpl Sec) const override;
|
||||
|
||||
|
@ -222,7 +222,6 @@ protected:
|
||||
bool isSectionData(DataRefImpl Sec) const override;
|
||||
bool isSectionBSS(DataRefImpl Sec) const override;
|
||||
bool isSectionVirtual(DataRefImpl Sec) const override;
|
||||
bool sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb) const override;
|
||||
relocation_iterator section_rel_begin(DataRefImpl Sec) const override;
|
||||
relocation_iterator section_rel_end(DataRefImpl Sec) const override;
|
||||
section_iterator getRelocatedSection(DataRefImpl Sec) const override;
|
||||
@ -595,17 +594,6 @@ bool ELFObjectFile<ELFT>::isSectionVirtual(DataRefImpl Sec) const {
|
||||
return toELFShdrIter(Sec)->sh_type == ELF::SHT_NOBITS;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
bool ELFObjectFile<ELFT>::sectionContainsSymbol(DataRefImpl Sec,
|
||||
DataRefImpl Symb) const {
|
||||
const Elf_Sym *ESym = toELFSymIter(Symb);
|
||||
|
||||
uintX_t Index = ESym->st_shndx;
|
||||
bool Reserved = Index >= ELF::SHN_LORESERVE && Index <= ELF::SHN_HIRESERVE;
|
||||
|
||||
return !Reserved && (&*toELFShdrIter(Sec) == EF.getSection(ESym->st_shndx));
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
relocation_iterator
|
||||
ELFObjectFile<ELFT>::section_rel_begin(DataRefImpl Sec) const {
|
||||
|
@ -230,7 +230,6 @@ public:
|
||||
bool isSectionData(DataRefImpl Sec) const override;
|
||||
bool isSectionBSS(DataRefImpl Sec) const override;
|
||||
bool isSectionVirtual(DataRefImpl Sec) const override;
|
||||
bool sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb) const override;
|
||||
relocation_iterator section_rel_begin(DataRefImpl Sec) const override;
|
||||
relocation_iterator section_rel_end(DataRefImpl Sec) const override;
|
||||
|
||||
|
@ -223,8 +223,6 @@ protected:
|
||||
virtual bool isSectionBSS(DataRefImpl Sec) const = 0;
|
||||
// A section is 'virtual' if its contents aren't present in the object image.
|
||||
virtual bool isSectionVirtual(DataRefImpl Sec) const = 0;
|
||||
virtual bool sectionContainsSymbol(DataRefImpl Sec,
|
||||
DataRefImpl Symb) const = 0;
|
||||
virtual relocation_iterator section_rel_begin(DataRefImpl Sec) const = 0;
|
||||
virtual relocation_iterator section_rel_end(DataRefImpl Sec) const = 0;
|
||||
virtual section_iterator getRelocatedSection(DataRefImpl Sec) const;
|
||||
@ -400,11 +398,6 @@ inline bool SectionRef::isVirtual() const {
|
||||
return OwningObject->isSectionVirtual(SectionPimpl);
|
||||
}
|
||||
|
||||
inline bool SectionRef::containsSymbol(SymbolRef S) const {
|
||||
return OwningObject->sectionContainsSymbol(SectionPimpl,
|
||||
S.getRawDataRefImpl());
|
||||
}
|
||||
|
||||
inline relocation_iterator SectionRef::relocation_begin() const {
|
||||
return OwningObject->section_rel_begin(SectionPimpl);
|
||||
}
|
||||
|
@ -322,14 +322,6 @@ bool COFFObjectFile::isSectionVirtual(DataRefImpl Ref) const {
|
||||
return Sec->PointerToRawData == 0;
|
||||
}
|
||||
|
||||
bool COFFObjectFile::sectionContainsSymbol(DataRefImpl SecRef,
|
||||
DataRefImpl SymbRef) const {
|
||||
const coff_section *Sec = toSec(SecRef);
|
||||
COFFSymbolRef Symb = getCOFFSymbol(SymbRef);
|
||||
int32_t SecNumber = (Sec - SectionTable) + 1;
|
||||
return SecNumber == Symb.getSectionNumber();
|
||||
}
|
||||
|
||||
static uint32_t getNumberOfRelocations(const coff_section *Sec,
|
||||
MemoryBufferRef M, const uint8_t *base) {
|
||||
// The field for the number of relocations in COFF section table is only
|
||||
|
@ -567,21 +567,6 @@ bool MachOObjectFile::isSectionVirtual(DataRefImpl Sec) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MachOObjectFile::sectionContainsSymbol(DataRefImpl Sec,
|
||||
DataRefImpl Symb) const {
|
||||
SymbolRef::Type ST = getSymbolType(Symb);
|
||||
if (ST == SymbolRef::ST_Unknown)
|
||||
return false;
|
||||
|
||||
uint64_t SectBegin = getSectionAddress(Sec);
|
||||
uint64_t SectEnd = getSectionSize(Sec);
|
||||
SectEnd += SectBegin;
|
||||
|
||||
uint64_t SymAddr;
|
||||
getSymbolAddress(Symb, SymAddr);
|
||||
return (SymAddr >= SectBegin) && (SymAddr < SectEnd);
|
||||
}
|
||||
|
||||
relocation_iterator MachOObjectFile::section_rel_begin(DataRefImpl Sec) const {
|
||||
DataRefImpl Ret;
|
||||
Ret.d.a = Sec.d.a;
|
||||
|
@ -28,6 +28,13 @@ void ObjectFile::anchor() { }
|
||||
ObjectFile::ObjectFile(unsigned int Type, MemoryBufferRef Source)
|
||||
: SymbolicFile(Type, Source) {}
|
||||
|
||||
bool SectionRef::containsSymbol(SymbolRef S) const {
|
||||
section_iterator SymSec = getObject()->section_end();
|
||||
if (S.getSection(SymSec))
|
||||
return false;
|
||||
return *this == *SymSec;
|
||||
}
|
||||
|
||||
std::error_code ObjectFile::printSymbolName(raw_ostream &OS,
|
||||
DataRefImpl Symb) const {
|
||||
StringRef Name;
|
||||
|
Loading…
x
Reference in New Issue
Block a user