//===- DLL.h ----------------------------------------------------*- C++ -*-===//
//
//                             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.
// IdataContents creates all chunks for the DLL import table.
// 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); }
  bool empty() { return Imports.empty(); }
  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<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:
  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();
  ArrayRef<Chunk *> getCodeChunks() { return Thunks; }

  uint64_t getDirRVA() { return Dirs[0]->getRVA(); }
  uint64_t getDirSize();

private:
  Chunk *newThunkChunk(DefinedImportData *S, Chunk *Dir);

  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();
  std::vector<Chunk *> Chunks;
};

} // namespace coff
} // namespace lld

#endif
