From f92c1726deb729d96b9e527e2f4f329f1da09fdf Mon Sep 17 00:00:00 2001 From: Paul Robinson Date: Wed, 7 Sep 2022 12:45:35 -0700 Subject: [PATCH] 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 --- .../test/tools/llvm-tli-checker/ps4-tli-check.yaml | 8 +++--- llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp | 30 ++++++++++++++-------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml b/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml index d21c2c0..06e3794 100644 --- a/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml +++ b/llvm/test/tools/llvm-tli-checker/ps4-tli-check.yaml @@ -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=">>" diff --git a/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp b/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp index a9ff5a2..17a4000 100644 --- a/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp +++ b/llvm/tools/llvm-tli-checker/llvm-tli-checker.cpp @@ -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 { + 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(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); } } -- 2.7.4