xref: /freebsd/contrib/llvm-project/lld/COFF/DLL.h (revision bdd1243d)
10b57cec5SDimitry Andric //===- DLL.h ----------------------------------------------------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef LLD_COFF_DLL_H
100b57cec5SDimitry Andric #define LLD_COFF_DLL_H
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "Chunks.h"
130b57cec5SDimitry Andric #include "Symbols.h"
140b57cec5SDimitry Andric 
15bdd1243dSDimitry Andric namespace lld::coff {
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric // Windows-specific.
180b57cec5SDimitry Andric // IdataContents creates all chunks for the DLL import table.
190b57cec5SDimitry Andric // You are supposed to call add() to add symbols and then
200b57cec5SDimitry Andric // call create() to populate the chunk vectors.
210b57cec5SDimitry Andric class IdataContents {
220b57cec5SDimitry Andric public:
add(DefinedImportData * sym)230b57cec5SDimitry Andric   void add(DefinedImportData *sym) { imports.push_back(sym); }
empty()240b57cec5SDimitry Andric   bool empty() { return imports.empty(); }
250b57cec5SDimitry Andric 
26bdd1243dSDimitry Andric   void create(COFFLinkerContext &ctx);
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric   std::vector<DefinedImportData *> imports;
290b57cec5SDimitry Andric   std::vector<Chunk *> dirs;
300b57cec5SDimitry Andric   std::vector<Chunk *> lookups;
310b57cec5SDimitry Andric   std::vector<Chunk *> addresses;
320b57cec5SDimitry Andric   std::vector<Chunk *> hints;
330b57cec5SDimitry Andric   std::vector<Chunk *> dllNames;
340b57cec5SDimitry Andric };
350b57cec5SDimitry Andric 
360b57cec5SDimitry Andric // Windows-specific.
370b57cec5SDimitry Andric // DelayLoadContents creates all chunks for the delay-load DLL import table.
380b57cec5SDimitry Andric class DelayLoadContents {
390b57cec5SDimitry Andric public:
DelayLoadContents(COFFLinkerContext & ctx)40bdd1243dSDimitry Andric   DelayLoadContents(COFFLinkerContext &ctx) : ctx(ctx) {}
add(DefinedImportData * sym)410b57cec5SDimitry Andric   void add(DefinedImportData *sym) { imports.push_back(sym); }
empty()420b57cec5SDimitry Andric   bool empty() { return imports.empty(); }
43bdd1243dSDimitry Andric   void create(Defined *helper);
440b57cec5SDimitry Andric   std::vector<Chunk *> getChunks();
450b57cec5SDimitry Andric   std::vector<Chunk *> getDataChunks();
getCodeChunks()460b57cec5SDimitry Andric   ArrayRef<Chunk *> getCodeChunks() { return thunks; }
getCodePData()47bdd1243dSDimitry Andric   ArrayRef<Chunk *> getCodePData() { return pdata; }
getCodeUnwindInfo()48bdd1243dSDimitry Andric   ArrayRef<Chunk *> getCodeUnwindInfo() { return unwindinfo; }
490b57cec5SDimitry Andric 
getDirRVA()500b57cec5SDimitry Andric   uint64_t getDirRVA() { return dirs[0]->getRVA(); }
510b57cec5SDimitry Andric   uint64_t getDirSize();
520b57cec5SDimitry Andric 
530b57cec5SDimitry Andric private:
540b57cec5SDimitry Andric   Chunk *newThunkChunk(DefinedImportData *s, Chunk *tailMerge);
550b57cec5SDimitry Andric   Chunk *newTailMergeChunk(Chunk *dir);
56bdd1243dSDimitry Andric   Chunk *newTailMergePDataChunk(Chunk *tm, Chunk *unwind);
57bdd1243dSDimitry Andric   Chunk *newTailMergeUnwindInfoChunk();
580b57cec5SDimitry Andric 
590b57cec5SDimitry Andric   Defined *helper;
600b57cec5SDimitry Andric   std::vector<DefinedImportData *> imports;
610b57cec5SDimitry Andric   std::vector<Chunk *> dirs;
620b57cec5SDimitry Andric   std::vector<Chunk *> moduleHandles;
630b57cec5SDimitry Andric   std::vector<Chunk *> addresses;
640b57cec5SDimitry Andric   std::vector<Chunk *> names;
650b57cec5SDimitry Andric   std::vector<Chunk *> hintNames;
660b57cec5SDimitry Andric   std::vector<Chunk *> thunks;
67bdd1243dSDimitry Andric   std::vector<Chunk *> pdata;
68bdd1243dSDimitry Andric   std::vector<Chunk *> unwindinfo;
690b57cec5SDimitry Andric   std::vector<Chunk *> dllNames;
70bdd1243dSDimitry Andric 
71bdd1243dSDimitry Andric   COFFLinkerContext &ctx;
720b57cec5SDimitry Andric };
730b57cec5SDimitry Andric 
740b57cec5SDimitry Andric // Windows-specific.
750b57cec5SDimitry Andric // EdataContents creates all chunks for the DLL export table.
760b57cec5SDimitry Andric class EdataContents {
770b57cec5SDimitry Andric public:
78bdd1243dSDimitry Andric   EdataContents(COFFLinkerContext &ctx);
790b57cec5SDimitry Andric   std::vector<Chunk *> chunks;
800b57cec5SDimitry Andric 
getRVA()810b57cec5SDimitry Andric   uint64_t getRVA() { return chunks[0]->getRVA(); }
getSize()820b57cec5SDimitry Andric   uint64_t getSize() {
830b57cec5SDimitry Andric     return chunks.back()->getRVA() + chunks.back()->getSize() - getRVA();
840b57cec5SDimitry Andric   }
85bdd1243dSDimitry Andric 
86bdd1243dSDimitry Andric   COFFLinkerContext &ctx;
870b57cec5SDimitry Andric };
880b57cec5SDimitry Andric 
89bdd1243dSDimitry Andric } // namespace lld::coff
900b57cec5SDimitry Andric 
910b57cec5SDimitry Andric #endif
92