summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2014-11-13 02:58:36 +0000
committerRui Ueyama <ruiu@google.com>2014-11-13 02:58:36 +0000
commit904cf593c1a3b372cf7d3ccb425d704faf35c7ab (patch)
tree68be0898bd755d40e50d0a950ab75699addeae5b
parent253dd39a9ac5e8abe0f12723c6b4a22109293e7a (diff)
downloadbcm5719-llvm-904cf593c1a3b372cf7d3ccb425d704faf35c7ab.tar.gz
bcm5719-llvm-904cf593c1a3b372cf7d3ccb425d704faf35c7ab.zip
[PECOFF] Fix delay-import address table contents.
Each entry in the delay-import address table had a wrong alignment requirement if 32 bit. As a result it got wrong delay-import table. Because llvm-readobj doesn't print out that field, we don't have a test for that. I'll submit a test that would catch this bug after improving llvm-readobj. llvm-svn: 221853
-rw-r--r--lld/lib/ReaderWriter/PECOFF/IdataPass.cpp5
-rw-r--r--lld/lib/ReaderWriter/PECOFF/IdataPass.h7
-rw-r--r--lld/test/pecoff/delayimport.test2
3 files changed, 10 insertions, 4 deletions
diff --git a/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp b/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp
index 925a262416f..1357168d9a1 100644
--- a/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/IdataPass.cpp
@@ -185,7 +185,10 @@ void DelayImportDirectoryAtom::addRelocations(
for (int i = 0, e = sharedAtoms.size(); i < e; ++i) {
const DefinedAtom *loader = new (_alloc) DelayLoaderAtom(
context, addrTable[i], this, delayLoadHelper);
- addDir64Reloc(addrTable[i], loader, context.ctx.getMachineType(), 0);
+ if (context.ctx.is64Bit())
+ addDir64Reloc(addrTable[i], loader, context.ctx.getMachineType(), 0);
+ else
+ addDir32NBReloc(addrTable[i], loader, context.ctx.getMachineType(), 0);
}
}
diff --git a/lld/lib/ReaderWriter/PECOFF/IdataPass.h b/lld/lib/ReaderWriter/PECOFF/IdataPass.h
index 143634131f2..9db82160339 100644
--- a/lld/lib/ReaderWriter/PECOFF/IdataPass.h
+++ b/lld/lib/ReaderWriter/PECOFF/IdataPass.h
@@ -162,15 +162,18 @@ private:
class DelayImportAddressAtom : public IdataAtom {
public:
explicit DelayImportAddressAtom(IdataContext &context)
- : IdataAtom(context, createContent(context.ctx)) {}
+ : IdataAtom(context, createContent(context.ctx)),
+ _align(Alignment(context.ctx.is64Bit() ? 3 : 2)) {}
StringRef customSectionName() const override { return ".data"; }
ContentPermissions permissions() const override { return permRW_; }
- Alignment alignment() const override { return Alignment(3); }
+ Alignment alignment() const override { return _align; }
private:
std::vector<uint8_t> createContent(const PECOFFLinkingContext &ctx) const {
return std::vector<uint8_t>(ctx.is64Bit() ? 8 : 4, 0);
}
+
+ Alignment _align;
};
// DelayLoaderAtom contains a wrapper function for __delayLoadHelper2.
diff --git a/lld/test/pecoff/delayimport.test b/lld/test/pecoff/delayimport.test
index 946e32ae909..eb7a31df13c 100644
--- a/lld/test/pecoff/delayimport.test
+++ b/lld/test/pecoff/delayimport.test
@@ -13,7 +13,7 @@ X86: DelayImport {
X86-NEXT: Name: vars.dll
X86-NEXT: Attributes: 0x1
X86-NEXT: ModuleHandle: 0x1000
-X86-NEXT: ImportAddressTable: 0x1008
+X86-NEXT: ImportAddressTable: 0x1004
X86-NEXT: ImportNameTable: 0x2000
X86-NEXT: BoundDelayImportTable: 0x0
X86-NEXT: UnloadDelayImportTable: 0x0
OpenPOWER on IntegriCloud