mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-11-01 15:11:24 +00:00
Don't use DataRefImpl to implement ImportDirectoryEntryRef.
DataRefImpl (a union of two integers and a pointer) is not the ideal data type to represent a reference to an import directory entity. We should just use the pointer to the import table and an offset instead to simplify. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199349 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2666b15908
commit
6a8151dba1
@ -369,9 +369,9 @@ public:
|
||||
class ImportDirectoryEntryRef {
|
||||
public:
|
||||
ImportDirectoryEntryRef() : OwningObject(0) {}
|
||||
ImportDirectoryEntryRef(DataRefImpl ImportDirectory,
|
||||
ImportDirectoryEntryRef(const import_directory_table_entry *Table, uint32_t I,
|
||||
const COFFObjectFile *Owner)
|
||||
: ImportDirectoryPimpl(ImportDirectory), OwningObject(Owner) {}
|
||||
: ImportTable(Table), Index(I), OwningObject(Owner) {}
|
||||
|
||||
bool operator==(const ImportDirectoryEntryRef &Other) const;
|
||||
error_code getNext(ImportDirectoryEntryRef &Result) const;
|
||||
@ -384,7 +384,8 @@ public:
|
||||
getImportLookupEntry(const import_lookup_table_entry32 *&Result) const;
|
||||
|
||||
private:
|
||||
DataRefImpl ImportDirectoryPimpl;
|
||||
const import_directory_table_entry *ImportTable;
|
||||
uint32_t Index;
|
||||
const COFFObjectFile *OwningObject;
|
||||
};
|
||||
} // end namespace object
|
||||
|
@ -563,20 +563,13 @@ StringRef COFFObjectFile::getLoadName() const {
|
||||
}
|
||||
|
||||
import_directory_iterator COFFObjectFile::import_directory_begin() const {
|
||||
DataRefImpl Imp;
|
||||
Imp.p = reinterpret_cast<uintptr_t>(ImportDirectory);
|
||||
return import_directory_iterator(ImportDirectoryEntryRef(Imp, this));
|
||||
return import_directory_iterator(
|
||||
ImportDirectoryEntryRef(ImportDirectory, 0, this));
|
||||
}
|
||||
|
||||
import_directory_iterator COFFObjectFile::import_directory_end() const {
|
||||
DataRefImpl Imp;
|
||||
if (ImportDirectory) {
|
||||
Imp.p = reinterpret_cast<uintptr_t>(
|
||||
ImportDirectory + (NumberOfImportDirectory - 1));
|
||||
} else {
|
||||
Imp.p = 0;
|
||||
}
|
||||
return import_directory_iterator(ImportDirectoryEntryRef(Imp, this));
|
||||
return import_directory_iterator(
|
||||
ImportDirectoryEntryRef(ImportDirectory, NumberOfImportDirectory, this));
|
||||
}
|
||||
|
||||
section_iterator COFFObjectFile::begin_sections() const {
|
||||
@ -884,55 +877,42 @@ error_code COFFObjectFile::getLibraryPath(DataRefImpl LibData,
|
||||
|
||||
bool ImportDirectoryEntryRef::
|
||||
operator==(const ImportDirectoryEntryRef &Other) const {
|
||||
return ImportDirectoryPimpl == Other.ImportDirectoryPimpl;
|
||||
}
|
||||
|
||||
static const import_directory_table_entry *toImportEntry(DataRefImpl Imp) {
|
||||
return reinterpret_cast<const import_directory_table_entry *>(Imp.p);
|
||||
return ImportTable == Other.ImportTable && Index == Other.Index;
|
||||
}
|
||||
|
||||
error_code
|
||||
ImportDirectoryEntryRef::getNext(ImportDirectoryEntryRef &Result) const {
|
||||
const import_directory_table_entry *Dir = toImportEntry(ImportDirectoryPimpl);
|
||||
Dir += 1;
|
||||
DataRefImpl Next;
|
||||
Next.p = reinterpret_cast<uintptr_t>(Dir);
|
||||
Result = ImportDirectoryEntryRef(Next, OwningObject);
|
||||
Result = ImportDirectoryEntryRef(ImportTable, Index + 1, OwningObject);
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
error_code ImportDirectoryEntryRef::
|
||||
getImportTableEntry(const import_directory_table_entry *&Result) const {
|
||||
Result = toImportEntry(ImportDirectoryPimpl);
|
||||
Result = ImportTable;
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
error_code ImportDirectoryEntryRef::getName(StringRef &Result) const {
|
||||
const import_directory_table_entry *Dir = toImportEntry(ImportDirectoryPimpl);
|
||||
uintptr_t IntPtr = 0;
|
||||
if (error_code ec = OwningObject->getRvaPtr(Dir->NameRVA, IntPtr))
|
||||
return ec;
|
||||
const char *Ptr = reinterpret_cast<const char *>(IntPtr);
|
||||
Result = StringRef(Ptr);
|
||||
if (error_code EC = OwningObject->getRvaPtr(ImportTable->NameRVA, IntPtr))
|
||||
return EC;
|
||||
Result = StringRef(reinterpret_cast<const char *>(IntPtr));
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
error_code ImportDirectoryEntryRef::getImportLookupEntry(
|
||||
const import_lookup_table_entry32 *&Result) const {
|
||||
const import_directory_table_entry *Dir = toImportEntry(ImportDirectoryPimpl);
|
||||
uintptr_t IntPtr = 0;
|
||||
if (error_code ec = OwningObject->getRvaPtr(
|
||||
Dir->ImportLookupTableRVA, IntPtr))
|
||||
return ec;
|
||||
if (error_code EC =
|
||||
OwningObject->getRvaPtr(ImportTable->ImportLookupTableRVA, IntPtr))
|
||||
return EC;
|
||||
Result = reinterpret_cast<const import_lookup_table_entry32 *>(IntPtr);
|
||||
return object_error::success;
|
||||
}
|
||||
|
||||
namespace llvm {
|
||||
|
||||
ObjectFile *ObjectFile::createCOFFObjectFile(MemoryBuffer *Object) {
|
||||
error_code ec;
|
||||
return new COFFObjectFile(Object, ec);
|
||||
}
|
||||
|
||||
} // end namespace llvm
|
||||
|
Loading…
Reference in New Issue
Block a user