mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-25 16:24:23 +00:00
Add a SymbolTableEntryBase.
Use it when we don't need to know if we have a 32 or 64 bit SymbolTableEntry. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179074 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -71,6 +71,13 @@ namespace MachOFormat {
|
|||||||
support::ulittle32_t Word1;
|
support::ulittle32_t Word1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SymbolTableEntryBase {
|
||||||
|
support::ulittle32_t StringIndex;
|
||||||
|
uint8_t Type;
|
||||||
|
uint8_t SectionIndex;
|
||||||
|
support::ulittle16_t Flags;
|
||||||
|
};
|
||||||
|
|
||||||
template<bool is64Bits>
|
template<bool is64Bits>
|
||||||
struct SymbolTableEntry;
|
struct SymbolTableEntry;
|
||||||
|
|
||||||
@ -263,12 +270,11 @@ private:
|
|||||||
|
|
||||||
void moveToNextSection(DataRefImpl &DRI) const;
|
void moveToNextSection(DataRefImpl &DRI) const;
|
||||||
|
|
||||||
const MachOFormat::SymbolTableEntry<false> *
|
const MachOFormat::SymbolTableEntryBase *
|
||||||
getSymbolTableEntry(DataRefImpl DRI,
|
getSymbolTableEntryBase(DataRefImpl DRI) const;
|
||||||
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const;
|
|
||||||
|
|
||||||
const MachOFormat::SymbolTableEntry<true> *
|
const MachOFormat::SymbolTableEntryBase *
|
||||||
getSymbol64TableEntry(DataRefImpl DRI,
|
getSymbolTableEntryBase(DataRefImpl DRI,
|
||||||
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const;
|
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const;
|
||||||
|
|
||||||
void moveToNextSymbol(DataRefImpl &DRI) const;
|
void moveToNextSymbol(DataRefImpl &DRI) const;
|
||||||
|
@ -116,47 +116,40 @@ void MachOObjectFile::moveToNextSymbol(DataRefImpl &DRI) const {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const MachOFormat::SymbolTableEntry<false> *
|
const MachOFormat::SymbolTableEntryBase *
|
||||||
MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
|
MachOObjectFile::getSymbolTableEntryBase(DataRefImpl DRI) const {
|
||||||
const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a);
|
const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a);
|
||||||
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
|
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
|
||||||
reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Command);
|
reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Command);
|
||||||
|
return getSymbolTableEntryBase(DRI, SymtabLoadCmd);
|
||||||
return getSymbolTableEntry(DRI, SymtabLoadCmd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const MachOFormat::SymbolTableEntry<false> *
|
const MachOFormat::SymbolTableEntry<false> *
|
||||||
MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI,
|
MachOObjectFile::getSymbolTableEntry(DataRefImpl DRI) const {
|
||||||
|
const MachOFormat::SymbolTableEntryBase *Base = getSymbolTableEntryBase(DRI);
|
||||||
|
return reinterpret_cast<const MachOFormat::SymbolTableEntry<false>*>(Base);
|
||||||
|
}
|
||||||
|
|
||||||
|
const MachOFormat::SymbolTableEntryBase *
|
||||||
|
MachOObjectFile::getSymbolTableEntryBase(DataRefImpl DRI,
|
||||||
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
|
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
|
||||||
uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
|
uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
|
||||||
unsigned Index = DRI.d.b;
|
unsigned Index = DRI.d.b;
|
||||||
uint64_t Offset = (SymbolTableOffset +
|
|
||||||
Index * sizeof(MachOFormat::SymbolTableEntry<false>));
|
unsigned SymbolTableEntrySize = is64Bit() ?
|
||||||
StringRef Data =
|
sizeof(MachOFormat::SymbolTableEntry<true>) :
|
||||||
getData(Offset, sizeof(MachOFormat::SymbolTableEntry<false>));
|
sizeof(MachOFormat::SymbolTableEntry<false>);
|
||||||
|
|
||||||
|
uint64_t Offset = SymbolTableOffset + Index * SymbolTableEntrySize;
|
||||||
|
StringRef Data = getData(Offset, SymbolTableEntrySize);
|
||||||
return
|
return
|
||||||
reinterpret_cast<const MachOFormat::SymbolTableEntry<false>*>(Data.data());
|
reinterpret_cast<const MachOFormat::SymbolTableEntryBase*>(Data.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
const MachOFormat::SymbolTableEntry<true>*
|
const MachOFormat::SymbolTableEntry<true>*
|
||||||
MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
|
MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI) const {
|
||||||
const MachOFormat::LoadCommand *Command = getLoadCommandInfo(DRI.d.a);
|
const MachOFormat::SymbolTableEntryBase *Base = getSymbolTableEntryBase(DRI);
|
||||||
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd =
|
return reinterpret_cast<const MachOFormat::SymbolTableEntry<true>*>(Base);
|
||||||
reinterpret_cast<const MachOFormat::SymtabLoadCommand*>(Command);
|
|
||||||
|
|
||||||
return getSymbol64TableEntry(DRI, SymtabLoadCmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
const MachOFormat::SymbolTableEntry<true>*
|
|
||||||
MachOObjectFile::getSymbol64TableEntry(DataRefImpl DRI,
|
|
||||||
const MachOFormat::SymtabLoadCommand *SymtabLoadCmd) const {
|
|
||||||
uint64_t SymbolTableOffset = SymtabLoadCmd->SymbolTableOffset;
|
|
||||||
unsigned Index = DRI.d.b;
|
|
||||||
uint64_t Offset = (SymbolTableOffset +
|
|
||||||
Index * sizeof(MachOFormat::SymbolTableEntry<true>));
|
|
||||||
StringRef Data = getData(Offset, sizeof(MachOFormat::SymbolTableEntry<true>));
|
|
||||||
return
|
|
||||||
reinterpret_cast<const MachOFormat::SymbolTableEntry<true>*>(Data.data());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI,
|
error_code MachOObjectFile::getSymbolNext(DataRefImpl DRI,
|
||||||
@ -176,16 +169,9 @@ error_code MachOObjectFile::getSymbolName(DataRefImpl DRI,
|
|||||||
StringRef StringTable = getData(SymtabLoadCmd->StringTableOffset,
|
StringRef StringTable = getData(SymtabLoadCmd->StringTableOffset,
|
||||||
SymtabLoadCmd->StringTableSize);
|
SymtabLoadCmd->StringTableSize);
|
||||||
|
|
||||||
uint32_t StringIndex;
|
const MachOFormat::SymbolTableEntryBase *Entry =
|
||||||
if (is64Bit()) {
|
getSymbolTableEntryBase(DRI, SymtabLoadCmd);
|
||||||
const MachOFormat::SymbolTableEntry<true> *Entry =
|
uint32_t StringIndex = Entry->StringIndex;
|
||||||
getSymbol64TableEntry(DRI, SymtabLoadCmd);
|
|
||||||
StringIndex = Entry->StringIndex;
|
|
||||||
} else {
|
|
||||||
const MachOFormat::SymbolTableEntry<false> *Entry =
|
|
||||||
getSymbolTableEntry(DRI, SymtabLoadCmd);
|
|
||||||
StringIndex = Entry->StringIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *Start = &StringTable.data()[StringIndex];
|
const char *Start = &StringTable.data()[StringIndex];
|
||||||
Result = StringRef(Start);
|
Result = StringRef(Start);
|
||||||
@ -403,16 +389,10 @@ error_code MachOObjectFile::getSymbolSection(DataRefImpl Symb,
|
|||||||
|
|
||||||
error_code MachOObjectFile::getSymbolType(DataRefImpl Symb,
|
error_code MachOObjectFile::getSymbolType(DataRefImpl Symb,
|
||||||
SymbolRef::Type &Res) const {
|
SymbolRef::Type &Res) const {
|
||||||
uint8_t n_type;
|
const MachOFormat::SymbolTableEntryBase *Entry =
|
||||||
if (is64Bit()) {
|
getSymbolTableEntryBase(Symb);
|
||||||
const MachOFormat::SymbolTableEntry<true> *Entry =
|
uint8_t n_type = Entry->Type;
|
||||||
getSymbol64TableEntry(Symb);
|
|
||||||
n_type = Entry->Type;
|
|
||||||
} else {
|
|
||||||
const MachOFormat::SymbolTableEntry<false> *Entry =
|
|
||||||
getSymbolTableEntry(Symb);
|
|
||||||
n_type = Entry->Type;
|
|
||||||
}
|
|
||||||
Res = SymbolRef::ST_Other;
|
Res = SymbolRef::ST_Other;
|
||||||
|
|
||||||
// If this is a STAB debugging symbol, we can do nothing more.
|
// If this is a STAB debugging symbol, we can do nothing more.
|
||||||
|
Reference in New Issue
Block a user