//===- DLL.h ----------------------------------------------------*- C++ -*-===// // // 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::coff { // Windows-specific. // IdataContents creates all chunks for the DLL import table. // You are supposed to call add() to add symbols and then // call create() to populate the chunk vectors. class IdataContents { public: void add(DefinedImportData *sym) { imports.push_back(sym); } bool empty() { return imports.empty(); } void create(COFFLinkerContext &ctx); std::vector imports; std::vector dirs; std::vector lookups; std::vector addresses; std::vector hints; std::vector dllNames; std::vector auxIat; std::vector auxIatCopy; }; // Windows-specific. // DelayLoadContents creates all chunks for the delay-load DLL import table. class DelayLoadContents { public: DelayLoadContents(COFFLinkerContext &ctx) : ctx(ctx) {} void add(DefinedImportData *sym) { imports.push_back(sym); } bool empty() { return imports.empty(); } void create(); std::vector getChunks(); std::vector getDataChunks(); ArrayRef getCodeChunks() { return thunks; } ArrayRef getCodePData() { return pdata; } ArrayRef getCodeUnwindInfo() { return unwindinfo; } ArrayRef getAuxIat() { return auxIat; } ArrayRef getAuxIatCopy() { return auxIatCopy; } uint64_t getDirRVA() { return dirs[0]->getRVA(); } uint64_t getDirSize(); private: Chunk *newThunkChunk(DefinedImportData *s, Chunk *tailMerge); Chunk *newTailMergeChunk(SymbolTable &symtab, Chunk *dir); Chunk *newTailMergePDataChunk(SymbolTable &symtab, Chunk *tm); std::vector imports; std::vector dirs; std::vector moduleHandles; std::vector addresses; std::vector names; std::vector hintNames; std::vector thunks; std::vector pdata; std::vector unwindinfo; std::vector dllNames; std::vector auxIat; std::vector auxIatCopy; COFFLinkerContext &ctx; }; // Create all chunks for the DLL export table. void createEdataChunks(SymbolTable &symtab, std::vector &chunks); } // namespace lld::coff #endif