zig/deps/lld/COFF/DLL.h

83 lines
2.2 KiB
C
Raw Normal View History

//===- DLL.h ----------------------------------------------------*- C++ -*-===//
//
2019-08-04 00:43:55 +08:00
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef LLD_COFF_DLL_H
#define LLD_COFF_DLL_H
#include "Chunks.h"
#include "Symbols.h"
namespace lld {
namespace coff {
// Windows-specific.
// IdataContents creates all chunks for the DLL import table.
// You are supposed to call add() to add symbols and then
2019-02-08 06:07:18 +08:00
// call create() to populate the chunk vectors.
class IdataContents {
public:
2019-08-04 00:43:55 +08:00
void add(DefinedImportData *sym) { imports.push_back(sym); }
bool empty() { return imports.empty(); }
void create();
2019-08-04 00:43:55 +08:00
std::vector<DefinedImportData *> imports;
std::vector<Chunk *> dirs;
std::vector<Chunk *> lookups;
std::vector<Chunk *> addresses;
std::vector<Chunk *> hints;
std::vector<Chunk *> dllNames;
};
// Windows-specific.
// DelayLoadContents creates all chunks for the delay-load DLL import table.
class DelayLoadContents {
public:
2019-08-04 00:43:55 +08:00
void add(DefinedImportData *sym) { imports.push_back(sym); }
bool empty() { return imports.empty(); }
void create(Defined *helper);
std::vector<Chunk *> getChunks();
std::vector<Chunk *> getDataChunks();
2019-08-04 00:43:55 +08:00
ArrayRef<Chunk *> getCodeChunks() { return thunks; }
2019-08-04 00:43:55 +08:00
uint64_t getDirRVA() { return dirs[0]->getRVA(); }
uint64_t getDirSize();
private:
2019-08-04 00:43:55 +08:00
Chunk *newThunkChunk(DefinedImportData *s, Chunk *tailMerge);
Chunk *newTailMergeChunk(Chunk *dir);
2019-08-04 00:43:55 +08:00
Defined *helper;
std::vector<DefinedImportData *> imports;
std::vector<Chunk *> dirs;
std::vector<Chunk *> moduleHandles;
std::vector<Chunk *> addresses;
std::vector<Chunk *> names;
std::vector<Chunk *> hintNames;
std::vector<Chunk *> thunks;
std::vector<Chunk *> dllNames;
};
// Windows-specific.
// EdataContents creates all chunks for the DLL export table.
class EdataContents {
public:
EdataContents();
2019-08-04 00:43:55 +08:00
std::vector<Chunk *> chunks;
2018-08-05 05:47:16 +08:00
2019-08-04 00:43:55 +08:00
uint64_t getRVA() { return chunks[0]->getRVA(); }
2018-08-05 05:47:16 +08:00
uint64_t getSize() {
2019-08-04 00:43:55 +08:00
return chunks.back()->getRVA() + chunks.back()->getSize() - getRVA();
2018-08-05 05:47:16 +08:00
}
};
} // namespace coff
} // namespace lld
#endif