From c46255a32ec92c427e621b6d7eabd887962ce4a4 Mon Sep 17 00:00:00 2001 From: David Meyer Date: Tue, 28 Feb 2012 23:47:53 +0000 Subject: [PATCH] In the ObjectFile interface, replace isInternal(), isAbsolute(), isGlobal(), and isWeak(), with a bitset of flags. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151670 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/COFF.h | 5 +-- include/llvm/Object/ELF.h | 53 +++++++--------------- include/llvm/Object/MachO.h | 5 +-- include/llvm/Object/ObjectFile.h | 46 +++++++------------ lib/Object/COFFObjectFile.cpp | 37 +++++++--------- lib/Object/MachOObjectFile.cpp | 68 +++++++++-------------------- test/MC/ELF/many-section.s | 2 +- tools/llvm-nm/llvm-nm.cpp | 6 +-- tools/llvm-objdump/llvm-objdump.cpp | 12 ++--- 9 files changed, 78 insertions(+), 156 deletions(-) diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index 71403406909..732141219e6 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -109,11 +109,8 @@ protected: virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const; virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const; 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 getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const; virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const; - virtual error_code isSymbolAbsolute(DataRefImpl Symb, bool &Res) const; virtual error_code getSymbolSection(DataRefImpl Symb, section_iterator &Res) const; diff --git a/include/llvm/Object/ELF.h b/include/llvm/Object/ELF.h index 2fd10ef6710..e6442f14be4 100644 --- a/include/llvm/Object/ELF.h +++ b/include/llvm/Object/ELF.h @@ -336,11 +336,8 @@ protected: virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const; virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const; 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 getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const; virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const; - virtual error_code isSymbolAbsolute(DataRefImpl Symb, bool &Res) const; virtual error_code getSymbolSection(DataRefImpl Symb, section_iterator &Res) const; @@ -655,32 +652,26 @@ error_code ELFObjectFile template error_code ELFObjectFile - ::isSymbolGlobal(DataRefImpl Symb, - bool &Result) const { + ::getSymbolFlags(DataRefImpl Symb, + uint32_t &Result) const { validateSymbol(Symb); const Elf_Sym *symb = getSymbol(Symb); - Result = symb->getBinding() == ELF::STB_GLOBAL; - return object_error::success; -} + Result = SymbolRef::SF_None; -template -error_code ELFObjectFile - ::isSymbolWeak(DataRefImpl Symb, - bool &Result) const { - validateSymbol(Symb); - const Elf_Sym *symb = getSymbol(Symb); + if (symb->getBinding() != ELF::STB_LOCAL) + Result |= SymbolRef::SF_Global; - Result = symb->getBinding() == ELF::STB_WEAK; - return object_error::success; -} + if (symb->getBinding() == ELF::STB_WEAK) + Result |= SymbolRef::SF_Weak; + + if (symb->st_shndx == ELF::SHN_ABS) + Result |= SymbolRef::SF_Absolute; + + if (symb->getType() == ELF::STT_FILE || + symb->getType() == ELF::STT_SECTION) + Result |= SymbolRef::SF_FormatSpecific; -template -error_code ELFObjectFile - ::isSymbolAbsolute(DataRefImpl Symb, bool &Res) const { - validateSymbol(Symb); - const Elf_Sym *symb = getSymbol(Symb); - Res = symb->st_shndx == ELF::SHN_ABS; return object_error::success; } @@ -701,20 +692,6 @@ error_code ELFObjectFile return object_error::success; } -template -error_code ELFObjectFile - ::isSymbolInternal(DataRefImpl Symb, - bool &Result) const { - validateSymbol(Symb); - const Elf_Sym *symb = getSymbol(Symb); - - if ( symb->getType() == ELF::STT_FILE - || symb->getType() == ELF::STT_SECTION) - Result = true; - Result = false; - return object_error::success; -} - template error_code ELFObjectFile ::getSectionNext(DataRefImpl Sec, SectionRef &Result) const { diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index b6e583f6f37..3edbe08f637 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -55,11 +55,8 @@ protected: virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const; virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const; 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 getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const; virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const; - virtual error_code isSymbolAbsolute(DataRefImpl Symb, bool &Res) const; virtual error_code getSymbolSection(DataRefImpl Symb, section_iterator &Res) const; diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index 4aa05e234fe..284577c9450 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -188,6 +188,15 @@ public: ST_Other }; + enum Flags { + SF_None = 0, + SF_Global = 1 << 0, // Global symbol + SF_Weak = 1 << 1, // Weak symbol + SF_Absolute = 1 << 2, // Absolute symbol + SF_FormatSpecific = 1 << 3 // Specific to the object file format + // (e.g. section symbols) + }; + SymbolRef(DataRefImpl SymbolP, const ObjectFile *Owner); bool operator==(const SymbolRef &Other) const; @@ -205,19 +214,8 @@ public: /// nm for this symbol. error_code getNMTypeChar(char &Result) const; - /// Returns true for symbols that are internal to the object file format such - /// as section symbols. - error_code isInternal(bool &Result) const; - - /// Returns true for symbols that can be used in another objects, - /// such as library functions - error_code isGlobal(bool &Result) const; - - /// Returns true for weak symbols. - error_code isWeak(bool &Result) const; - - /// @brief Return true for absolute symbols. - error_code isAbsolute(bool &Result) const; + /// Get symbol flags (bitwise OR of SymbolRef::Flags) + error_code getFlags(uint32_t &Result) const; /// @brief Get section this symbol is defined in reference to. Result is /// end_sections() if it is undefined or is an absolute symbol. @@ -261,10 +259,8 @@ protected: virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const = 0; 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; - virtual error_code isSymbolAbsolute(DataRefImpl Symb, bool &Res) const = 0; + virtual error_code getSymbolFlags(DataRefImpl Symb, + uint32_t &Res) const = 0; virtual error_code getSymbolSection(DataRefImpl Symb, section_iterator &Res) const = 0; @@ -382,20 +378,8 @@ inline error_code SymbolRef::getNMTypeChar(char &Result) const { return OwningObject->getSymbolNMTypeChar(SymbolPimpl, Result); } -inline error_code SymbolRef::isInternal(bool &Result) const { - return OwningObject->isSymbolInternal(SymbolPimpl, Result); -} - -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::isAbsolute(bool &Result) const { - return OwningObject->isSymbolAbsolute(SymbolPimpl, Result); +inline error_code SymbolRef::getFlags(uint32_t &Result) const { + return OwningObject->getSymbolFlags(SymbolPimpl, Result); } inline error_code SymbolRef::getSection(section_iterator &Result) const { diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index a2dad41818e..bf278785e68 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -159,17 +159,23 @@ error_code COFFObjectFile::getSymbolType(DataRefImpl Symb, return object_error::success; } -error_code COFFObjectFile::isSymbolGlobal(DataRefImpl Symb, - bool &Result) const { +error_code COFFObjectFile::getSymbolFlags(DataRefImpl Symb, + uint32_t &Result) const { const coff_symbol *symb = toSymb(Symb); - Result = (symb->StorageClass == COFF::IMAGE_SYM_CLASS_EXTERNAL); - return object_error::success; -} + Result = SymbolRef::SF_None; + + // TODO: Set SF_FormatSpecific. + + // TODO: This are certainly too restrictive. + if (symb->StorageClass == COFF::IMAGE_SYM_CLASS_EXTERNAL) + Result |= SymbolRef::SF_Global; + + if (symb->StorageClass == COFF::IMAGE_SYM_CLASS_WEAK_EXTERNAL) + Result |= SymbolRef::SF_Weak; + + if (symb->SectionNumber == COFF::IMAGE_SYM_ABSOLUTE) + Result |= SymbolRef::SF_Absolute; -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; } @@ -262,19 +268,6 @@ error_code COFFObjectFile::getSymbolNMTypeChar(DataRefImpl Symb, return object_error::success; } -error_code COFFObjectFile::isSymbolInternal(DataRefImpl Symb, - bool &Result) const { - Result = false; - return object_error::success; -} - -error_code COFFObjectFile::isSymbolAbsolute(DataRefImpl Symb, - bool &Result) const { - const coff_symbol *symb = toSymb(Symb); - Result = symb->SectionNumber == COFF::IMAGE_SYM_ABSOLUTE; - return object_error::success; -} - error_code COFFObjectFile::getSymbolSection(DataRefImpl Symb, section_iterator &Result) const { const coff_symbol *symb = toSymb(Symb); diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index b1416eae89d..cbf6d0b2d86 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -262,61 +262,35 @@ error_code MachOObjectFile::getSymbolNMTypeChar(DataRefImpl DRI, return object_error::success; } -error_code MachOObjectFile::isSymbolInternal(DataRefImpl DRI, - bool &Result) const { +error_code MachOObjectFile::getSymbolFlags(DataRefImpl DRI, + uint32_t &Result) const { + uint16_t MachOFlags; + uint8_t MachOType; if (MachOObj->is64Bit()) { InMemoryStruct Entry; getSymbol64TableEntry(DRI, Entry); - Result = Entry->Flags & macho::STF_StabsEntryMask; + MachOFlags = Entry->Flags; + MachOType = Entry->Type; } else { InMemoryStruct Entry; getSymbolTableEntry(DRI, Entry); - Result = Entry->Flags & macho::STF_StabsEntryMask; - } - return object_error::success; -} - -error_code MachOObjectFile::isSymbolGlobal(DataRefImpl Symb, bool &Res) const { - - if (MachOObj->is64Bit()) { - InMemoryStruct Entry; - getSymbol64TableEntry(Symb, Entry); - Res = Entry->Type & MachO::NlistMaskExternal; - } else { - InMemoryStruct Entry; - getSymbolTableEntry(Symb, Entry); - Res = Entry->Type & MachO::NlistMaskExternal; - } - return object_error::success; -} - -error_code MachOObjectFile::isSymbolWeak(DataRefImpl Symb, bool &Res) const { - - if (MachOObj->is64Bit()) { - InMemoryStruct Entry; - getSymbol64TableEntry(Symb, Entry); - Res = Entry->Flags & (MachO::NListDescWeakRef | MachO::NListDescWeakDef); - } else { - InMemoryStruct Entry; - getSymbolTableEntry(Symb, Entry); - Res = Entry->Flags & (MachO::NListDescWeakRef | MachO::NListDescWeakDef); - } - return object_error::success; -} - -error_code MachOObjectFile::isSymbolAbsolute(DataRefImpl Symb, bool &Res) const{ - uint8_t n_type; - if (MachOObj->is64Bit()) { - InMemoryStruct Entry; - getSymbol64TableEntry(Symb, Entry); - n_type = Entry->Type; - } else { - InMemoryStruct Entry; - getSymbolTableEntry(Symb, Entry); - n_type = Entry->Type; + MachOFlags = Entry->Flags; + MachOType = Entry->Type; } - Res = (n_type & MachO::NlistMaskType) == MachO::NListTypeAbsolute; + Result = SymbolRef::SF_None; + if (MachOFlags & macho::STF_StabsEntryMask) + Result |= SymbolRef::SF_FormatSpecific; + + if (MachOType & MachO::NlistMaskExternal) + Result |= SymbolRef::SF_Global; + + if (MachOFlags & (MachO::NListDescWeakRef | MachO::NListDescWeakDef)) + Result |= SymbolRef::SF_Weak; + + if ((MachOType & MachO::NlistMaskType) == MachO::NListTypeAbsolute) + Result |= SymbolRef::SF_Absolute; + return object_error::success; } diff --git a/test/MC/ELF/many-section.s b/test/MC/ELF/many-section.s index e7e723ad905..b729e668168 100644 --- a/test/MC/ELF/many-section.s +++ b/test/MC/ELF/many-section.s @@ -1,5 +1,5 @@ // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o %t -// RUN: llvm-nm %t | FileCheck %s +// RUN: llvm-nm -a %t | FileCheck %s // CHECK: s000a // CHECK-NOT: U diff --git a/tools/llvm-nm/llvm-nm.cpp b/tools/llvm-nm/llvm-nm.cpp index 8688d4af659..9cf83b63370 100644 --- a/tools/llvm-nm/llvm-nm.cpp +++ b/tools/llvm-nm/llvm-nm.cpp @@ -291,9 +291,9 @@ static void DumpSymbolNamesFromObject(ObjectFile *obj) { } for (symbol_iterator i = ibegin; i != iend; i.increment(ec)) { if (error(ec)) break; - bool internal; - if (error(i->isInternal(internal))) break; - if (!DebugSyms && internal) + uint32_t symflags; + if (error(i->getFlags(symflags))) break; + if (!DebugSyms && (symflags & SymbolRef::SF_FormatSpecific)) continue; NMSymbol s; s.Size = object::UnknownAddressOrSize; diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index 44d681fc1cd..14147670f5d 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -482,21 +482,21 @@ static void PrintSymbolTable(const ObjectFile *o) { if (error(ec)) return; StringRef Name; uint64_t Address; - bool Global; SymbolRef::Type Type; - bool Weak; - bool Absolute; uint64_t Size; + uint32_t Flags; section_iterator Section = o->end_sections(); if (error(si->getName(Name))) continue; if (error(si->getAddress(Address))) continue; - if (error(si->isGlobal(Global))) continue; + if (error(si->getFlags(Flags))) continue; if (error(si->getType(Type))) continue; - if (error(si->isWeak(Weak))) continue; - if (error(si->isAbsolute(Absolute))) continue; if (error(si->getSize(Size))) continue; if (error(si->getSection(Section))) continue; + bool Global = Flags & SymbolRef::SF_Global; + bool Weak = Flags & SymbolRef::SF_Weak; + bool Absolute = Flags & SymbolRef::SF_Absolute; + if (Address == UnknownAddressOrSize) Address = 0; if (Size == UnknownAddressOrSize)