This patch is to basically move the functionality to construct Data Directory from IdataPass to WriterPECOFF. Data Directory is a part of the PE/COFF header and contains the addresses of the import tables. We used to represent the link from Data Directory to the import tables as relocation references. The idea behind it is that, because relocation references are processed by the Writer, we wouldn't have to do anything special to fill the addresses of the import tables. I thought that the addresses would be set "automatically". But it turned out that that design made the pass and the writer rather complicated. In order to make relocation references between Data Directory to the import tables, these data structures needed to be represented as Atom. However, because Data Directory is not a section content but a part of the PE/COFF header, it did not fit well as an Atom. So we ended up having complicated code both in IdataPass and the writer. This patch simplifies it. One side effect of this patch is that we now have ".idata.a", ".idata.d" and "idata.t" sections for the import address table, the import directory table, and the import lookup table. The writer looks for the sections by name to find the start addresses of the sections. We probably should have a better way to find a specific atom from the core linking result, but currently using the section name seems to be the easiest way to do that. The Windows loader do not care about the import table's section layout. llvm-svn: 197016
84 lines
1.8 KiB
C++
84 lines
1.8 KiB
C++
//===- DefinedAtom.cpp ------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Linker
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
|
|
#include "lld/Core/DefinedAtom.h"
|
|
|
|
|
|
namespace lld {
|
|
|
|
|
|
DefinedAtom::ContentPermissions DefinedAtom::permissions() const {
|
|
// By default base permissions on content type.
|
|
return permissions(this->contentType());
|
|
}
|
|
|
|
// Utility function for deriving permissions from content type
|
|
DefinedAtom::ContentPermissions DefinedAtom::permissions(ContentType type) {
|
|
switch (type) {
|
|
case typeCode:
|
|
case typeResolver:
|
|
case typeBranchIsland:
|
|
case typeBranchShim:
|
|
case typeStub:
|
|
case typeStubHelper:
|
|
return permR_X;
|
|
|
|
case typeConstant:
|
|
case typeCString:
|
|
case typeUTF16String:
|
|
case typeCFI:
|
|
case typeLSDA:
|
|
case typeLiteral4:
|
|
case typeLiteral8:
|
|
case typeLiteral16:
|
|
case typeDTraceDOF:
|
|
case typeCompactUnwindInfo:
|
|
case typeRONote:
|
|
case typeNoAlloc:
|
|
return permR__;
|
|
|
|
case typeData:
|
|
case typeDataFast:
|
|
case typeZeroFill:
|
|
case typeZeroFillFast:
|
|
case typeObjC1Class:
|
|
case typeLazyPointer:
|
|
case typeLazyDylibPointer:
|
|
case typeThunkTLV:
|
|
case typeRWNote:
|
|
return permRW_;
|
|
|
|
case typeGOT:
|
|
case typeConstData:
|
|
case typeCFString:
|
|
case typeInitializerPtr:
|
|
case typeTerminatorPtr:
|
|
case typeCStringPtr:
|
|
case typeObjCClassPtr:
|
|
case typeObjC2CategoryList:
|
|
case typeTLVInitialData:
|
|
case typeTLVInitialZeroFill:
|
|
case typeTLVInitializerPtr:
|
|
case typeThreadData:
|
|
case typeThreadZeroFill:
|
|
return permRW_L;
|
|
|
|
case typeUnknown:
|
|
case typeTempLTO:
|
|
return permUnknown;
|
|
}
|
|
llvm_unreachable("unknown content type");
|
|
}
|
|
|
|
|
|
} // namespace
|
|
|