forked from OSchip/llvm-project
Add a SymbolRef::getValue.
This returns either the symbol offset or address. Since it is not defined which one, it never has to lookup the section and so never fails. I will add users in the next commit. llvm-svn: 240569
This commit is contained in:
parent
5815b1fd56
commit
991af666f1
|
@ -636,6 +636,7 @@ protected:
|
|||
StringRef &Res) const override;
|
||||
std::error_code getSymbolAddress(DataRefImpl Symb,
|
||||
uint64_t &Res) const override;
|
||||
uint64_t getSymbolValue(DataRefImpl Symb) const override;
|
||||
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;
|
||||
uint32_t getSymbolFlags(DataRefImpl Symb) const override;
|
||||
std::error_code getSymbolType(DataRefImpl Symb,
|
||||
|
|
|
@ -84,6 +84,7 @@ protected:
|
|||
StringRef &Res) const override;
|
||||
std::error_code getSymbolAddress(DataRefImpl Symb,
|
||||
uint64_t &Res) const override;
|
||||
uint64_t getSymbolValue(DataRefImpl Symb) const override;
|
||||
uint32_t getSymbolAlignment(DataRefImpl Symb) const override;
|
||||
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;
|
||||
uint32_t getSymbolFlags(DataRefImpl Symb) const override;
|
||||
|
@ -275,28 +276,40 @@ uint32_t ELFObjectFile<ELFT>::getSectionType(SectionRef Sec) const {
|
|||
}
|
||||
|
||||
template <class ELFT>
|
||||
std::error_code ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb,
|
||||
uint64_t &Result) const {
|
||||
uint64_t ELFObjectFile<ELFT>::getSymbolValue(DataRefImpl Symb) const {
|
||||
const Elf_Sym *ESym = getSymbol(Symb);
|
||||
switch (ESym->st_shndx) {
|
||||
case ELF::SHN_COMMON:
|
||||
case ELF::SHN_UNDEF:
|
||||
Result = UnknownAddress;
|
||||
return std::error_code();
|
||||
return UnknownAddress;
|
||||
case ELF::SHN_ABS:
|
||||
Result = ESym->st_value;
|
||||
return std::error_code();
|
||||
default:
|
||||
break;
|
||||
return ESym->st_value;
|
||||
}
|
||||
|
||||
const Elf_Ehdr *Header = EF.getHeader();
|
||||
Result = ESym->st_value;
|
||||
uint64_t Ret = ESym->st_value;
|
||||
|
||||
// Clear the ARM/Thumb or microMIPS indicator flag.
|
||||
if ((Header->e_machine == ELF::EM_ARM || Header->e_machine == ELF::EM_MIPS) &&
|
||||
ESym->getType() == ELF::STT_FUNC)
|
||||
Result &= ~1;
|
||||
Ret &= ~1;
|
||||
|
||||
return Ret;
|
||||
}
|
||||
|
||||
template <class ELFT>
|
||||
std::error_code ELFObjectFile<ELFT>::getSymbolAddress(DataRefImpl Symb,
|
||||
uint64_t &Result) const {
|
||||
Result = getSymbolValue(Symb);
|
||||
const Elf_Sym *ESym = getSymbol(Symb);
|
||||
switch (ESym->st_shndx) {
|
||||
case ELF::SHN_COMMON:
|
||||
case ELF::SHN_UNDEF:
|
||||
case ELF::SHN_ABS:
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
const Elf_Ehdr *Header = EF.getHeader();
|
||||
|
||||
if (Header->e_type == ELF::ET_REL) {
|
||||
const typename ELFFile<ELFT>::Elf_Shdr * Section = EF.getSection(ESym);
|
||||
|
|
|
@ -208,6 +208,7 @@ public:
|
|||
|
||||
std::error_code getSymbolAddress(DataRefImpl Symb,
|
||||
uint64_t &Res) const override;
|
||||
uint64_t getSymbolValue(DataRefImpl Symb) const override;
|
||||
uint32_t getSymbolAlignment(DataRefImpl Symb) const override;
|
||||
uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const override;
|
||||
std::error_code getSymbolType(DataRefImpl Symb,
|
||||
|
|
|
@ -139,6 +139,11 @@ public:
|
|||
/// Returns the symbol virtual address (i.e. address at which it will be
|
||||
/// mapped).
|
||||
std::error_code getAddress(uint64_t &Result) const;
|
||||
|
||||
/// Return the value of the symbol depending on the object this can be an
|
||||
/// offset or a virtual address.
|
||||
uint64_t getValue() const;
|
||||
|
||||
/// @brief Get the alignment of this symbol as the actual value (not log 2).
|
||||
uint32_t getAlignment() const;
|
||||
uint64_t getCommonSize() const;
|
||||
|
@ -200,6 +205,7 @@ protected:
|
|||
DataRefImpl Symb) const override;
|
||||
virtual std::error_code getSymbolAddress(DataRefImpl Symb,
|
||||
uint64_t &Res) const = 0;
|
||||
virtual uint64_t getSymbolValue(DataRefImpl Symb) const = 0;
|
||||
virtual uint32_t getSymbolAlignment(DataRefImpl Symb) const;
|
||||
virtual uint64_t getCommonSymbolSizeImpl(DataRefImpl Symb) const = 0;
|
||||
virtual std::error_code getSymbolType(DataRefImpl Symb,
|
||||
|
@ -327,6 +333,10 @@ inline std::error_code SymbolRef::getAddress(uint64_t &Result) const {
|
|||
return getObject()->getSymbolAddress(getRawDataRefImpl(), Result);
|
||||
}
|
||||
|
||||
inline uint64_t SymbolRef::getValue() const {
|
||||
return getObject()->getSymbolValue(getRawDataRefImpl());
|
||||
}
|
||||
|
||||
inline uint32_t SymbolRef::getAlignment() const {
|
||||
return getObject()->getSymbolAlignment(getRawDataRefImpl());
|
||||
}
|
||||
|
|
|
@ -150,25 +150,29 @@ std::error_code COFFObjectFile::getSymbolName(DataRefImpl Ref,
|
|||
return getSymbolName(Symb, Result);
|
||||
}
|
||||
|
||||
uint64_t COFFObjectFile::getSymbolValue(DataRefImpl Ref) const {
|
||||
COFFSymbolRef Sym = getCOFFSymbol(Ref);
|
||||
|
||||
if (Sym.isAnyUndefined() || Sym.isCommon())
|
||||
return UnknownAddress;
|
||||
|
||||
return Sym.getValue();
|
||||
}
|
||||
|
||||
std::error_code COFFObjectFile::getSymbolAddress(DataRefImpl Ref,
|
||||
uint64_t &Result) const {
|
||||
Result = getSymbolValue(Ref);
|
||||
COFFSymbolRef Symb = getCOFFSymbol(Ref);
|
||||
|
||||
if (Symb.isAnyUndefined() || Symb.isCommon()) {
|
||||
Result = UnknownAddress;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
int32_t SectionNumber = Symb.getSectionNumber();
|
||||
if (COFF::isReservedSectionNumber(SectionNumber)) {
|
||||
Result = Symb.getValue();
|
||||
|
||||
if (Symb.isAnyUndefined() || Symb.isCommon() ||
|
||||
COFF::isReservedSectionNumber(SectionNumber))
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
const coff_section *Section = nullptr;
|
||||
if (std::error_code EC = getSection(SectionNumber, Section))
|
||||
return EC;
|
||||
Result = Section->VirtualAddress + Symb.getValue();
|
||||
Result += Section->VirtualAddress;
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
|
|
|
@ -370,14 +370,17 @@ std::error_code MachOObjectFile::getIndirectName(DataRefImpl Symb,
|
|||
return std::error_code();
|
||||
}
|
||||
|
||||
std::error_code MachOObjectFile::getSymbolAddress(DataRefImpl Symb,
|
||||
uint64_t &Res) const {
|
||||
uint64_t NValue = getNValue(Symb);
|
||||
MachO::nlist_base Entry = getSymbolTableEntryBase(this, Symb);
|
||||
uint64_t MachOObjectFile::getSymbolValue(DataRefImpl Sym) const {
|
||||
uint64_t NValue = getNValue(Sym);
|
||||
MachO::nlist_base Entry = getSymbolTableEntryBase(this, Sym);
|
||||
if ((Entry.n_type & MachO::N_TYPE) == MachO::N_UNDF && NValue == 0)
|
||||
Res = UnknownAddress;
|
||||
else
|
||||
Res = NValue;
|
||||
return UnknownAddress;
|
||||
return NValue;
|
||||
}
|
||||
|
||||
std::error_code MachOObjectFile::getSymbolAddress(DataRefImpl Sym,
|
||||
uint64_t &Res) const {
|
||||
Res = getSymbolValue(Sym);
|
||||
return std::error_code();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue