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

Rui Ueyama ruiu at google.com
Wed Sep 18 18:49:54 PDT 2013


I wrote one. Will submit after submitting
http://llvm-reviews.chandlerc.com/D1719.


On Sun, Sep 15, 2013 at 7:24 PM, Shankar Easwaran
<shankare at codeaurora.org>wrote:

> testcase ?
>
>
> On 9/15/2013 5:33 PM, Rui Ueyama wrote:
>
>> Author: ruiu
>> Date: Sun Sep 15 17:33:15 2013
>> New Revision: 190772
>>
>> URL: http://llvm.org/viewvc/llvm-**project?rev=190772&view=rev<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<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<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
>>
>>
>> ______________________________**_________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/**mailman/listinfo/llvm-commits<http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
>>
>>
>>
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted
> by the Linux Foundation
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130918/df39dfbf/attachment.html>


More information about the llvm-commits mailing list