Object: Add isSymbolWeak.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142316 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael J. Spencer
2011-10-17 23:54:22 +00:00
parent 0e752cb4b4
commit c38c36a8c4
7 changed files with 46 additions and 1 deletions

View File

@@ -168,6 +168,13 @@ error_code COFFObjectFile::isSymbolGlobal(DataRefImpl Symb,
return object_error::success;
}
error_code COFFObjectFile::isSymbolWeak(DataRefImpl Symb,
bool &Result) const {
const coff_symbol *symb = toSymb(Symb);
Result = (symb->StorageClass == COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL);
return object_error::success;
}
error_code COFFObjectFile::getSymbolSize(DataRefImpl Symb,
uint64_t &Result) const {
// FIXME: Return the correct size. This requires looking at all the symbols

View File

@@ -331,6 +331,7 @@ protected:
virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const;
virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const;
virtual error_code isSymbolGlobal(DataRefImpl Symb, bool &Res) const;
virtual error_code isSymbolWeak(DataRefImpl Symb, bool &Res) const;
virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const;
virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const;
@@ -641,6 +642,17 @@ error_code ELFObjectFile<target_endianness, is64Bits>
return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
error_code ELFObjectFile<target_endianness, is64Bits>
::isSymbolWeak(DataRefImpl Symb,
bool &Result) const {
validateSymbol(Symb);
const Elf_Sym *symb = getSymbol(Symb);
Result = symb->getBinding() == ELF::STB_WEAK;
return object_error::success;
}
template<support::endianness target_endianness, bool is64Bits>
error_code ELFObjectFile<target_endianness, is64Bits>
::isSymbolInternal(DataRefImpl Symb,

View File

@@ -228,6 +228,20 @@ error_code MachOObjectFile::isSymbolGlobal(DataRefImpl Symb, bool &Res) const {
return object_error::success;
}
error_code MachOObjectFile::isSymbolWeak(DataRefImpl Symb, bool &Res) const {
if (MachOObj->is64Bit()) {
InMemoryStruct<macho::Symbol64TableEntry> Entry;
getSymbol64TableEntry(Symb, Entry);
Res = Entry->Flags & (MachO::NListDescWeakRef | MachO::NListDescWeakDef);
} else {
InMemoryStruct<macho::SymbolTableEntry> Entry;
getSymbolTableEntry(Symb, Entry);
Res = Entry->Flags & (MachO::NListDescWeakRef | MachO::NListDescWeakDef);
}
return object_error::success;
}
error_code MachOObjectFile::getSymbolType(DataRefImpl Symb,
SymbolRef::Type &Res) const {
uint8_t n_type;