Don't use DataRefImpl to implement ImportDirectoryEntryRef.
authorRui Ueyama <ruiu@google.com>
Thu, 16 Jan 2014 03:13:19 +0000 (03:13 +0000)
committerRui Ueyama <ruiu@google.com>
Thu, 16 Jan 2014 03:13:19 +0000 (03:13 +0000)
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

include/llvm/Object/COFF.h
lib/Object/COFFObjectFile.cpp

index aaffbbcb5e793745c5015c0f7d5e36f5741addd0..431029045f0b73f66d0b7e9868a8f9990d806e4a 100644 (file)
@@ -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
index 42066c372b43b5077a5de4c1099735ac3770f453..dc8a718c7a374cafad75f4bf8de5ca450d609376 100644 (file)
@@ -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);
-  }
-
+ObjectFile *ObjectFile::createCOFFObjectFile(MemoryBuffer *Object) {
+  error_code ec;
+  return new COFFObjectFile(Object, ec);
+}
 } // end namespace llvm