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

@ -106,6 +106,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;

View File

@ -54,6 +54,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;

View File

@ -121,6 +121,9 @@ public:
/// such as library functions
error_code isGlobal(bool &Result) const;
/// Returns true for weak symbols.
error_code isWeak(bool &Result) const;
DataRefImpl getRawDataRefImpl() const;
};
typedef content_iterator<SymbolRef> symbol_iterator;
@ -234,7 +237,7 @@ protected:
virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const = 0;
virtual error_code isSymbolInternal(DataRefImpl Symb, bool &Res) const = 0;
virtual error_code isSymbolGlobal(DataRefImpl Symb, bool &Res) const = 0;
virtual error_code isSymbolWeak(DataRefImpl Symb, bool &Res) const = 0;
// Same as above for SectionRef.
friend class SectionRef;
@ -345,6 +348,10 @@ inline error_code SymbolRef::isGlobal(bool &Result) const {
return OwningObject->isSymbolGlobal(SymbolPimpl, Result);
}
inline error_code SymbolRef::isWeak(bool &Result) const {
return OwningObject->isSymbolWeak(SymbolPimpl, Result);
}
inline error_code SymbolRef::getType(SymbolRef::Type &Result) const {
return OwningObject->getSymbolType(SymbolPimpl, Result);
}

View File

@ -240,6 +240,9 @@ namespace llvm {
NListSectionNoSection = 0u, // NO_SECT
NListSectionMaxSection = 0xffu, // MAX_SECT
NListDescWeakRef = 0x40u,
NListDescWeakDef = 0x80u,
// Constant values for the "n_type" field in llvm::MachO::nlist and
// llvm::MachO::nlist_64 when "(n_type & NlistMaskStab) != 0"
StabGlobalSymbol = 0x20u, // N_GSYM

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;