Make llvm-tli-checker support static libraries
The original implementation assumed dynamic libraries and so looked only at the dynamic symbol table. Use the regular symbol table for ET_REL files. Differential Revision: https://reviews.llvm.org/D133448
This commit is contained in:
parent
fa8eb27088
commit
f92c1726de
|
@ -1,12 +1,12 @@
|
|||
# REQUIRES: x86-registered-target
|
||||
#
|
||||
## This produces the object that matches expectations for PS4/PS5.
|
||||
# RUN: yaml2obj %s -DZDAPV=_ZdaPv -o=%t1
|
||||
## This produces a static object that matches expectations for PS4/PS5.
|
||||
# RUN: yaml2obj %s -DTYPE=ET_REL -DLABEL=Symbols -DZDAPV=_ZdaPv -o=%t1
|
||||
# RUN: llvm-tli-checker --triple=x86_64-scei-ps4 %t1 | FileCheck %s
|
||||
# RUN: llvm-tli-checker --triple=x86_64-sie-ps5 %t1 | FileCheck %s
|
||||
#
|
||||
## This produces an object that has _ZdaPvj instead of _ZdaPv.
|
||||
# RUN: yaml2obj %s -DZDAPV=_ZdaPvj -o=%t2
|
||||
## This produces a dynamic object that has _ZdaPvj instead of _ZdaPv.
|
||||
# RUN: yaml2obj %s -DTYPE=ET_DYN -DLABEL=DynamicSymbols -DZDAPV=_ZdaPvj -o=%t2
|
||||
# RUN: llvm-tli-checker --triple x86_64-scei-ps4 %t2 | \
|
||||
# RUN: FileCheck %s --check-prefixes=WRONG_SUMMARY,WRONG_DETAIL \
|
||||
# RUN: --implicit-check-not="==" --implicit-check-not="<<" --implicit-check-not=">>"
|
||||
|
|
|
@ -155,6 +155,7 @@ void TLINameList::dump() {
|
|||
// Store all the exported symbol names we found in the input libraries.
|
||||
// We use a map to get hashed lookup speed; the bool is meaningless.
|
||||
class SDKNameMap : public StringMap<bool> {
|
||||
void maybeInsertSymbol(const SymbolRef &S, const ObjectFile &O);
|
||||
void populateFromObject(ObjectFile *O);
|
||||
void populateFromArchive(Archive *A);
|
||||
|
||||
|
@ -163,6 +164,19 @@ public:
|
|||
};
|
||||
static SDKNameMap SDKNames;
|
||||
|
||||
// Insert defined global function symbols into the map if valid.
|
||||
void SDKNameMap::maybeInsertSymbol(const SymbolRef &S, const ObjectFile &O) {
|
||||
SymbolRef::Type Type = unwrapIgnoreError(S.getType());
|
||||
uint32_t Flags = unwrapIgnoreError(S.getFlags());
|
||||
section_iterator Section = unwrapIgnoreError(S.getSection(),
|
||||
/*Default=*/O.section_end());
|
||||
if (Type == SymbolRef::ST_Function && (Flags & SymbolRef::SF_Global) &&
|
||||
Section != O.section_end()) {
|
||||
StringRef Name = unwrapIgnoreError(S.getName());
|
||||
insert({ Name, true });
|
||||
}
|
||||
}
|
||||
|
||||
// Given an ObjectFile, extract the global function symbols.
|
||||
void SDKNameMap::populateFromObject(ObjectFile *O) {
|
||||
// FIXME: Support other formats.
|
||||
|
@ -173,16 +187,12 @@ void SDKNameMap::populateFromObject(ObjectFile *O) {
|
|||
}
|
||||
const auto *ELF = cast<ELFObjectFileBase>(O);
|
||||
|
||||
for (const auto &S : ELF->getDynamicSymbolIterators()) {
|
||||
// We want only defined global function symbols.
|
||||
SymbolRef::Type Type = unwrapIgnoreError(S.getType());
|
||||
uint32_t Flags = unwrapIgnoreError(S.getFlags());
|
||||
section_iterator Section = unwrapIgnoreError(S.getSection(),
|
||||
/*Default=*/O->section_end());
|
||||
StringRef Name = unwrapIgnoreError(S.getName());
|
||||
if (Type == SymbolRef::ST_Function && (Flags & SymbolRef::SF_Global) &&
|
||||
Section != O->section_end())
|
||||
insert({Name, true});
|
||||
if (ELF->getEType() == ELF::ET_REL) {
|
||||
for (const auto &S : ELF->symbols())
|
||||
maybeInsertSymbol(S, *O);
|
||||
} else {
|
||||
for (const auto &S : ELF->getDynamicSymbolIterators())
|
||||
maybeInsertSymbol(S, *O);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue