diff options
author | David Meyer <pdox@google.com> | 2012-02-28 23:47:53 +0000 |
---|---|---|
committer | David Meyer <pdox@google.com> | 2012-02-28 23:47:53 +0000 |
commit | c46255a32ec92c427e621b6d7eabd887962ce4a4 (patch) | |
tree | 63caf01b15b0c1be7b8ee6f9d93dc14ea41f7371 /lib/Object | |
parent | 9993a3aebb27c5cac55429a23af2d2a0f129cb95 (diff) | |
download | llvm-c46255a32ec92c427e621b6d7eabd887962ce4a4.tar.gz llvm-c46255a32ec92c427e621b6d7eabd887962ce4a4.tar.bz2 llvm-c46255a32ec92c427e621b6d7eabd887962ce4a4.tar.xz |
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
Diffstat (limited to 'lib/Object')
-rw-r--r-- | lib/Object/COFFObjectFile.cpp | 37 | ||||
-rw-r--r-- | lib/Object/MachOObjectFile.cpp | 60 |
2 files changed, 32 insertions, 65 deletions
diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index a2dad41818..bf278785e6 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 b1416eae89..cbf6d0b2d8 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<macho::Symbol64TableEntry> Entry; getSymbol64TableEntry(DRI, Entry); - Result = Entry->Flags & macho::STF_StabsEntryMask; + MachOFlags = Entry->Flags; + MachOType = Entry->Type; } else { InMemoryStruct<macho::SymbolTableEntry> Entry; getSymbolTableEntry(DRI, Entry); - Result = Entry->Flags & macho::STF_StabsEntryMask; + MachOFlags = Entry->Flags; + MachOType = Entry->Type; } - return object_error::success; -} -error_code MachOObjectFile::isSymbolGlobal(DataRefImpl Symb, bool &Res) const { + Result = SymbolRef::SF_None; + if (MachOFlags & macho::STF_StabsEntryMask) + Result |= SymbolRef::SF_FormatSpecific; - if (MachOObj->is64Bit()) { - InMemoryStruct<macho::Symbol64TableEntry> Entry; - getSymbol64TableEntry(Symb, Entry); - Res = Entry->Type & MachO::NlistMaskExternal; - } else { - InMemoryStruct<macho::SymbolTableEntry> Entry; - getSymbolTableEntry(Symb, Entry); - Res = Entry->Type & MachO::NlistMaskExternal; - } - return object_error::success; -} + if (MachOType & MachO::NlistMaskExternal) + Result |= SymbolRef::SF_Global; -error_code MachOObjectFile::isSymbolWeak(DataRefImpl Symb, bool &Res) const { + if (MachOFlags & (MachO::NListDescWeakRef | MachO::NListDescWeakDef)) + Result |= SymbolRef::SF_Weak; - 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::isSymbolAbsolute(DataRefImpl Symb, bool &Res) const{ - uint8_t n_type; - if (MachOObj->is64Bit()) { - InMemoryStruct<macho::Symbol64TableEntry> Entry; - getSymbol64TableEntry(Symb, Entry); - n_type = Entry->Type; - } else { - InMemoryStruct<macho::SymbolTableEntry> Entry; - getSymbolTableEntry(Symb, Entry); - n_type = Entry->Type; - } + if ((MachOType & MachO::NlistMaskType) == MachO::NListTypeAbsolute) + Result |= SymbolRef::SF_Absolute; - Res = (n_type & MachO::NlistMaskType) == MachO::NListTypeAbsolute; return object_error::success; } |