[lld] r216039 - [PECOFF] Emit PE+ idata tables.
Rui Ueyama
ruiu at google.com
Tue Aug 19 18:09:43 PDT 2014
Author: ruiu
Date: Tue Aug 19 20:09:42 2014
New Revision: 216039
URL: http://llvm.org/viewvc/llvm-project?rev=216039&view=rev
Log:
[PECOFF] Emit PE+ idata tables.
Import tables in the PE+ format is an array of 64 bit numbers,
although the executable size is still limited to 4GB in PE+.
Modified:
lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp
lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h
lld/trunk/test/pecoff/Inputs/nop64.obj.yaml
lld/trunk/test/pecoff/pe32plus.test
Modified: lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp?rev=216039&r1=216038&r2=216039&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.cpp Tue Aug 19 20:09:42 2014
@@ -50,9 +50,16 @@ std::vector<uint8_t> HintNameAtom::assem
}
std::vector<uint8_t>
-ImportTableEntryAtom::assembleRawContent(uint32_t contents) {
+ImportTableEntryAtom::assembleRawContent(uint32_t rva, bool is64) {
+ // The element size of the import table is 32 bit in PE and 64 bit
+ // in PE+. In PE+, bits 62-31 are filled with zero.
+ if (is64) {
+ std::vector<uint8_t> ret(8);
+ *reinterpret_cast<llvm::support::ulittle64_t *>(&ret[0]) = rva;
+ return ret;
+ }
std::vector<uint8_t> ret(4);
- *reinterpret_cast<llvm::support::ulittle32_t *>(&ret[0]) = contents;
+ *reinterpret_cast<llvm::support::ulittle32_t *>(&ret[0]) = rva;
return ret;
}
@@ -114,7 +121,7 @@ void IdataPass::perform(std::unique_ptr<
if (file->sharedLibrary().empty())
return;
- idata::Context context(*file, _dummyFile);
+ idata::Context context(*file, _dummyFile, _is64);
std::map<StringRef, std::vector<COFFSharedLibraryAtom *> > sharedAtoms =
groupByLoadName(*file);
for (auto i : sharedAtoms) {
Modified: lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h?rev=216039&r1=216038&r2=216039&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h (original)
+++ lld/trunk/lib/ReaderWriter/PECOFF/IdataPass.h Tue Aug 19 20:09:42 2014
@@ -24,6 +24,7 @@
#include "lld/Core/File.h"
#include "lld/Core/Pass.h"
#include "lld/Core/Simple.h"
+#include "lld/ReaderWriter/PECOFFLinkingContext.h"
#include "llvm/Support/COFF.h"
#include <algorithm>
@@ -41,9 +42,11 @@ class ImportTableEntryAtom;
// A state object of this pass.
struct Context {
- Context(MutableFile &f, VirtualFile &g) : file(f), dummyFile(g) {}
+ Context(MutableFile &f, VirtualFile &g, bool peplus)
+ : file(f), dummyFile(g), is64(peplus) {}
MutableFile &file;
VirtualFile &dummyFile;
+ bool is64;
};
/// The root class of all idata atoms.
@@ -79,9 +82,8 @@ private:
class ImportTableEntryAtom : public IdataAtom {
public:
- ImportTableEntryAtom(Context &context, uint32_t contents,
- StringRef sectionName)
- : IdataAtom(context, assembleRawContent(contents)),
+ ImportTableEntryAtom(Context &ctx, uint32_t contents, StringRef sectionName)
+ : IdataAtom(ctx, assembleRawContent(contents, ctx.is64)),
_sectionName(sectionName) {}
StringRef customSectionName() const override {
@@ -89,7 +91,7 @@ public:
};
private:
- std::vector<uint8_t> assembleRawContent(uint32_t contents);
+ std::vector<uint8_t> assembleRawContent(uint32_t contents, bool is64);
StringRef _sectionName;
};
@@ -131,7 +133,8 @@ public:
class IdataPass : public lld::Pass {
public:
- IdataPass(const LinkingContext &ctx) : _dummyFile(ctx) {}
+ IdataPass(const PECOFFLinkingContext &ctx)
+ : _dummyFile(ctx), _is64(ctx.is64Bit()) {}
void perform(std::unique_ptr<MutableFile> &file) override;
@@ -146,6 +149,7 @@ private:
// read from a file, so we use this object.
VirtualFile _dummyFile;
+ bool _is64;
llvm::BumpPtrAllocator _alloc;
};
Modified: lld/trunk/test/pecoff/Inputs/nop64.obj.yaml
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/Inputs/nop64.obj.yaml?rev=216039&r1=216038&r2=216039&view=diff
==============================================================================
--- lld/trunk/test/pecoff/Inputs/nop64.obj.yaml (original)
+++ lld/trunk/test/pecoff/Inputs/nop64.obj.yaml Tue Aug 19 20:09:42 2014
@@ -6,15 +6,15 @@ sections:
- Name: .text
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
Alignment: 16
- SectionData: C3
+ SectionData: C3C3C3C3
+ Relocations:
+ - VirtualAddress: 0
+ SymbolName: __imp__fn
+ Type: IMAGE_REL_AMD64_REL32
- Name: .data
Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
Alignment: 16
SectionData: ''
- - Name: '.debug$S'
- Characteristics: [ IMAGE_SCN_CNT_INITIALIZED_DATA, IMAGE_SCN_MEM_DISCARDABLE, IMAGE_SCN_MEM_READ ]
- Alignment: 1
- SectionData: 04000000F10000005D0000002200011100000000433A5C63796777696E5C686F6D655C727569755C6E6F702E6F626A0037003C1103020000D00000000000000000000B00000027C601004D6963726F736F667420285229204D6163726F20417373656D626C65720000000000
symbols:
- Name: '@comp.id'
Value: 13485607
@@ -36,7 +36,7 @@ symbols:
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 1
- NumberOfRelocations: 0
+ NumberOfRelocations: 1
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
@@ -52,18 +52,12 @@ symbols:
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
- - Name: '.debug$S'
+ - Name: __imp__fn
Value: 0
- SectionNumber: 3
+ SectionNumber: 0
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
- StorageClass: IMAGE_SYM_CLASS_STATIC
- SectionDefinition:
- Length: 108
- NumberOfRelocations: 0
- NumberOfLinenumbers: 0
- CheckSum: 0
- Number: 0
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: start
Value: 0
SectionNumber: 1
Modified: lld/trunk/test/pecoff/pe32plus.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/pecoff/pe32plus.test?rev=216039&r1=216038&r2=216039&view=diff
==============================================================================
--- lld/trunk/test/pecoff/pe32plus.test (original)
+++ lld/trunk/test/pecoff/pe32plus.test Tue Aug 19 20:09:42 2014
@@ -1,7 +1,7 @@
# RUN: yaml2obj %p/Inputs/nop64.obj.yaml > %t.obj
# RUN: lld -flavor link /out:%t.exe /subsystem:console /entry:start \
-# RUN: /machine:x64 -- %t.obj
+# RUN: /machine:x64 -- %t.obj %p/Inputs/vars.lib
# RUN: llvm-readobj -file-headers %t.exe | FileCheck %s
CHECK: Format: COFF-x86-64
@@ -9,7 +9,7 @@ CHECK-NEXT: Arch: x86_64
CHECK-NEXT: AddressSize: 64bit
CHECK-NEXT: ImageFileHeader {
CHECK-NEXT: Machine: IMAGE_FILE_MACHINE_AMD64 (0x8664)
-CHECK-NEXT: SectionCount: 1
+CHECK-NEXT: SectionCount: 5
CHECK-NEXT: TimeDateStamp:
CHECK-NEXT: PointerToSymbolTable: 0x0
CHECK-NEXT: SymbolCount: 0
@@ -23,10 +23,10 @@ CHECK-NEXT: ImageOptionalHeader {
CHECK-NEXT: MajorLinkerVersion: 0
CHECK-NEXT: MinorLinkerVersion: 0
CHECK-NEXT: SizeOfCode: 512
-CHECK-NEXT: SizeOfInitializedData: 0
+CHECK-NEXT: SizeOfInitializedData: 2048
CHECK-NEXT: SizeOfUninitializedData: 0
-CHECK-NEXT: AddressOfEntryPoint: 0x1000
-CHECK-NEXT: BaseOfCode: 0x1000
+CHECK-NEXT: AddressOfEntryPoint: 0x5000
+CHECK-NEXT: BaseOfCode: 0x5000
CHECK-NEXT: ImageBase: 0x140000000
CHECK-NEXT: SectionAlignment: 4096
CHECK-NEXT: FileAlignment: 512
@@ -36,8 +36,8 @@ CHECK-NEXT: MajorImageVersion: 0
CHECK-NEXT: MinorImageVersion: 0
CHECK-NEXT: MajorSubsystemVersion: 6
CHECK-NEXT: MinorSubsystemVersion: 0
-CHECK-NEXT: SizeOfImage: 8192
-CHECK-NEXT: SizeOfHeaders: 512
+CHECK-NEXT: SizeOfImage: 24576
+CHECK-NEXT: SizeOfHeaders: 1024
CHECK-NEXT: Subsystem: IMAGE_SUBSYSTEM_WINDOWS_CUI (0x3)
CHECK-NEXT: Subsystem [ (0x8140)
CHECK-NEXT: IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE (0x40)
@@ -52,8 +52,8 @@ CHECK-NEXT: NumberOfRvaAndSize: 16
CHECK-NEXT: DataDirectory {
CHECK-NEXT: ExportTableRVA: 0x0
CHECK-NEXT: ExportTableSize: 0x0
-CHECK-NEXT: ImportTableRVA: 0x0
-CHECK-NEXT: ImportTableSize: 0x0
+CHECK-NEXT: ImportTableRVA: 0x3000
+CHECK-NEXT: ImportTableSize: 0x28
CHECK-NEXT: ResourceTableRVA: 0x0
CHECK-NEXT: ResourceTableSize: 0x0
CHECK-NEXT: ExceptionTableRVA: 0x0
@@ -74,8 +74,8 @@ CHECK-NEXT: LoadConfigTableRVA: 0x0
CHECK-NEXT: LoadConfigTableSize: 0x0
CHECK-NEXT: BoundImportRVA: 0x0
CHECK-NEXT: BoundImportSize: 0x0
-CHECK-NEXT: IATRVA: 0x0
-CHECK-NEXT: IATSize: 0x0
+CHECK-NEXT: IATRVA: 0x2000
+CHECK-NEXT: IATSize: 0x10
CHECK-NEXT: DelayImportDescriptorRVA: 0x0
CHECK-NEXT: DelayImportDescriptorSize: 0x0
CHECK-NEXT: CLRRuntimeHeaderRVA: 0x0
More information about the llvm-commits
mailing list