[lld] r190772 - [PECOFF] Use a dummy file as an "input file" for Idata atoms.

Rui Ueyama ruiu at google.com
Sun Sep 15 15:33:15 PDT 2013


Author: ruiu
Date: Sun Sep 15 17:33:15 2013
New Revision: 190772

URL: http://llvm.org/viewvc/llvm-project?rev=190772&view=rev
Log:
[PECOFF] Use a dummy file as an "input file" for Idata atoms.

Modified:
    lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h
    lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp

Modified: lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h?rev=190772&r1=190771&r2=190772&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h Sun Sep 15 17:33:15 2013
@@ -23,8 +23,9 @@
 
 #include "lld/Core/File.h"
 #include "lld/Core/Pass.h"
-#include "llvm/Support/Debug.h"
+#include "lld/ReaderWriter/Simple.h"
 #include "llvm/Support/COFF.h"
+#include "llvm/Support/Debug.h"
 #include "llvm/Support/Endian.h"
 
 #include <algorithm>
@@ -58,9 +59,10 @@ void addDir32NBReloc(COFFBaseDefinedAtom
 
 // A state object of this pass.
 struct Context {
-  explicit Context(MutableFile &f) : file(f) {}
+  explicit Context(MutableFile &f, File &g) : file(f), dummyFile(g) {}
 
   MutableFile &file;
+  File &dummyFile;
 
   // The object to accumulate idata atoms. Idata atoms need to be grouped by
   // type and be continuous in the output file. To force such layout, we
@@ -82,9 +84,9 @@ public:
   virtual ContentPermissions permissions() const { return permR__; }
 
 protected:
-  IdataAtom(MutableFile &file, vector<uint8_t> data)
-      : COFFLinkerInternalAtom(file, data) {
-    file.addAtom(*this);
+  IdataAtom(Context &context, vector<uint8_t> data)
+      : COFFLinkerInternalAtom(context.dummyFile, data) {
+    context.file.addAtom(*this);
   }
 };
 
@@ -93,7 +95,7 @@ protected:
 class DLLNameAtom : public IdataAtom {
 public:
   DLLNameAtom(Context &context, StringRef name)
-      : IdataAtom(context.file, stringRefToVector(name)) {
+      : IdataAtom(context, stringRefToVector(name)) {
     context.dllNameAtoms.push_back(this);
   }
 
@@ -117,7 +119,7 @@ private:
 class HintNameAtom : public IdataAtom {
 public:
   HintNameAtom(Context &context, uint16_t hint, StringRef importName)
-      : IdataAtom(context.file, assembleRawContent(hint, importName)),
+      : IdataAtom(context, assembleRawContent(hint, importName)),
         _importName(importName) {
     context.hintNameAtoms.push_back(this);
   }
@@ -144,7 +146,7 @@ private:
 class ImportTableEntryAtom : public IdataAtom {
 public:
   explicit ImportTableEntryAtom(Context &context, uint32_t contents)
-      : IdataAtom(context.file, assembleRawContent(contents)) {}
+      : IdataAtom(context, assembleRawContent(contents)) {}
 
 private:
   vector<uint8_t> assembleRawContent(uint32_t contents) {
@@ -162,7 +164,7 @@ class ImportDirectoryAtom : public Idata
 public:
   ImportDirectoryAtom(Context &context, StringRef loadName,
                       const vector<COFFSharedLibraryAtom *> &sharedAtoms)
-      : IdataAtom(context.file, vector<uint8_t>(20, 0)) {
+      : IdataAtom(context, vector<uint8_t>(20, 0)) {
     addRelocations(context, loadName, sharedAtoms);
     context.importDirectories.push_back(this);
   }
@@ -229,20 +231,30 @@ private:
 class NullImportDirectoryAtom : public IdataAtom {
 public:
   explicit NullImportDirectoryAtom(Context &context)
-      : IdataAtom(context.file, vector<uint8_t>(20, 0)) {
+      : IdataAtom(context, vector<uint8_t>(20, 0)) {
     context.importDirectories.push_back(this);
   }
 };
 
 } // anonymous namespace
 
+// An instance of this class represents "input file" for atoms created in this
+// pass. Only one instance of this class is created as a field of IdataPass.
+class IdataPassFile : public SimpleFile {
+public:
+  IdataPassFile(const LinkingContext &ctx)
+      : SimpleFile(ctx, "<idata-pass-file>") {}
+};
+
 class IdataPass : public lld::Pass {
 public:
+  IdataPass(const LinkingContext &ctx) : _dummyFile(ctx) {}
+
   virtual void perform(MutableFile &file) {
     if (file.sharedLibrary().size() == 0)
       return;
 
-    Context context(file);
+    Context context(file, _dummyFile);
     map<StringRef, vector<COFFSharedLibraryAtom *> > sharedAtoms =
         groupByLoadName(file);
     for (auto i : sharedAtoms) {
@@ -291,14 +303,14 @@ private:
   /// will be set by the writer.
   void createDataDirectoryAtoms(Context &context) {
     auto *dir = new (_alloc) coff::COFFDataDirectoryAtom(
-        context.file, llvm::COFF::DataDirectoryIndex::IMPORT_TABLE,
+        context.dummyFile, llvm::COFF::DataDirectoryIndex::IMPORT_TABLE,
         context.importDirectories.size() *
             context.importDirectories[0]->size());
     addDir32NBReloc(dir, context.importDirectories[0]);
     context.file.addAtom(*dir);
 
     auto *iat = new (_alloc) coff::COFFDataDirectoryAtom(
-        context.file, llvm::COFF::DataDirectoryIndex::IAT,
+        context.dummyFile, llvm::COFF::DataDirectoryIndex::IAT,
         context.importAddressTables.size() *
             context.importAddressTables[0]->size());
     addDir32NBReloc(iat, context.importAddressTables[0]);
@@ -320,6 +332,11 @@ private:
     }
   }
 
+  // A dummy file with which all the atoms created in the pass will be
+  // associated. Atoms need to be associated to an input file even if it's not
+  // read from a file, so we use this object.
+  IdataPassFile _dummyFile;
+
   llvm::BumpPtrAllocator _alloc;
 };
 

Modified: lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp?rev=190772&r1=190771&r2=190772&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/PECOFFLinkingContext.cpp Sun Sep 15 17:33:15 2013
@@ -122,7 +122,7 @@ PECOFFLinkingContext::stringFromRelocKin
 
 void PECOFFLinkingContext::addPasses(PassManager &pm) const {
   pm.add(std::unique_ptr<Pass>(new pecoff::GroupedSectionsPass()));
-  pm.add(std::unique_ptr<Pass>(new pecoff::IdataPass()));
+  pm.add(std::unique_ptr<Pass>(new pecoff::IdataPass(*this)));
   pm.add(std::unique_ptr<Pass>(new LayoutPass()));
 }
 } // end namespace lld





More information about the llvm-commits mailing list