2015-06-07 09:15:04 +08:00
|
|
|
//===- DLL.h -------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// The LLVM Linker
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#ifndef LLD_COFF_DLL_H
|
|
|
|
#define LLD_COFF_DLL_H
|
|
|
|
|
|
|
|
#include "Chunks.h"
|
|
|
|
#include "Symbols.h"
|
|
|
|
|
|
|
|
namespace lld {
|
|
|
|
namespace coff {
|
|
|
|
|
|
|
|
// Windows-specific.
|
2015-06-17 08:16:33 +08:00
|
|
|
// IdataContents creates all chunks for the DLL import table.
|
2015-06-07 09:15:04 +08:00
|
|
|
// You are supposed to call add() to add symbols and then
|
|
|
|
// call getChunks() to get a list of chunks.
|
|
|
|
class IdataContents {
|
|
|
|
public:
|
|
|
|
void add(DefinedImportData *Sym) { Imports.push_back(Sym); }
|
2015-06-22 06:31:52 +08:00
|
|
|
bool empty() { return Imports.empty(); }
|
2015-06-07 09:15:04 +08:00
|
|
|
std::vector<Chunk *> getChunks();
|
|
|
|
|
|
|
|
uint64_t getDirRVA() { return Dirs[0]->getRVA(); }
|
|
|
|
uint64_t getDirSize();
|
|
|
|
uint64_t getIATRVA() { return Addresses[0]->getRVA(); }
|
|
|
|
uint64_t getIATSize();
|
|
|
|
|
|
|
|
private:
|
|
|
|
void create();
|
|
|
|
|
|
|
|
std::vector<DefinedImportData *> Imports;
|
|
|
|
std::vector<std::unique_ptr<Chunk>> Dirs;
|
|
|
|
std::vector<std::unique_ptr<Chunk>> Lookups;
|
|
|
|
std::vector<std::unique_ptr<Chunk>> Addresses;
|
|
|
|
std::vector<std::unique_ptr<Chunk>> Hints;
|
|
|
|
std::map<StringRef, std::unique_ptr<Chunk>> DLLNames;
|
|
|
|
};
|
|
|
|
|
2015-06-22 06:31:52 +08:00
|
|
|
// Windows-specific.
|
|
|
|
// DelayLoadContents creates all chunks for the delay-load DLL import table.
|
|
|
|
class DelayLoadContents {
|
|
|
|
public:
|
|
|
|
void add(DefinedImportData *Sym) { Imports.push_back(Sym); }
|
|
|
|
bool empty() { return Imports.empty(); }
|
2015-06-27 05:40:15 +08:00
|
|
|
void create(Defined *Helper);
|
|
|
|
std::vector<Chunk *> getChunks();
|
|
|
|
std::vector<Chunk *> getDataChunks();
|
2015-06-22 06:31:52 +08:00
|
|
|
std::vector<std::unique_ptr<Chunk>> &getCodeChunks() { return Thunks; }
|
|
|
|
|
|
|
|
uint64_t getDirRVA() { return Dirs[0]->getRVA(); }
|
|
|
|
uint64_t getDirSize();
|
|
|
|
|
|
|
|
private:
|
2015-07-25 08:20:06 +08:00
|
|
|
Chunk *newThunkChunk(DefinedImportData *S, Chunk *Dir);
|
|
|
|
|
2015-06-22 06:31:52 +08:00
|
|
|
Defined *Helper;
|
|
|
|
std::vector<DefinedImportData *> Imports;
|
|
|
|
std::vector<std::unique_ptr<Chunk>> Dirs;
|
|
|
|
std::vector<std::unique_ptr<Chunk>> ModuleHandles;
|
|
|
|
std::vector<std::unique_ptr<Chunk>> Addresses;
|
|
|
|
std::vector<std::unique_ptr<Chunk>> Names;
|
|
|
|
std::vector<std::unique_ptr<Chunk>> HintNames;
|
|
|
|
std::vector<std::unique_ptr<Chunk>> Thunks;
|
|
|
|
std::map<StringRef, std::unique_ptr<Chunk>> DLLNames;
|
|
|
|
};
|
|
|
|
|
2015-06-17 08:16:33 +08:00
|
|
|
// Windows-specific.
|
|
|
|
// EdataContents creates all chunks for the DLL export table.
|
|
|
|
class EdataContents {
|
|
|
|
public:
|
|
|
|
EdataContents();
|
|
|
|
std::vector<std::unique_ptr<Chunk>> Chunks;
|
|
|
|
};
|
|
|
|
|
2015-06-07 09:15:04 +08:00
|
|
|
} // namespace coff
|
|
|
|
} // namespace lld
|
|
|
|
|
|
|
|
#endif
|