//===- subzero/src/IceELFObjectWriter.h - ELF object writer -----*- C++ -*-===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Abstraction for a writer that is responsible for writing an ELF file.
//
//===----------------------------------------------------------------------===//

#ifndef SUBZERO_SRC_ICEELFOBJECTWRITER_H
#define SUBZERO_SRC_ICEELFOBJECTWRITER_H

#include "IceDefs.h"
#include "IceELFSection.h"
#include "IceELFStreamer.h"
#include "IceTypes.h"

using namespace llvm::ELF;

namespace Ice {

// Higher level ELF object writer.  Manages section information and writes
// the final ELF object.  The object writer will write to file the code
// and data as it is being defined (rather than keep a copy).
// After all definitions are written out, it will finalize the bookkeeping
// sections and write them out.  Expected usage:
//
// (1) writeInitialELFHeader (invoke once)
// (2) writeDataSection  (invoke once)
// (3) writeFunctionCode (must invoke once per function)
// (4) writeConstantPool (must invoke once per pooled primitive type)
// (5) setUndefinedSyms (invoke once)
// (6) writeNonUserSections (invoke once)
//
// The requirement for writeDataSection to be invoked only once can
// be relaxed if using -fdata-sections. The requirement to invoke only once
// without -fdata-sections is so that variables that belong to each possible
// SectionType are contiguous in the file. With -fdata-sections, each global
// variable is in a separate section and therefore the sections will be
// trivially contiguous.
//
// The motivation for requiring that writeFunctionCode happen after
// writeDataSection: to keep the .text and .data sections contiguous in the
// file. Having both -fdata-sections and -ffunction-sections does allow
// relaxing this requirement.
class ELFObjectWriter {
  ELFObjectWriter() = delete;
  ELFObjectWriter(const ELFObjectWriter &) = delete;
  ELFObjectWriter &operator=(const ELFObjectWriter &) = delete;

public:
  ELFObjectWriter(GlobalContext &Ctx, ELFStreamer &Out);

  // Write the initial ELF header. This is just to reserve space in the ELF
  // file. Reserving space allows the other functions to write text
  // and data directly to the file and get the right file offsets.
  void writeInitialELFHeader();

  // Copy initializer data for globals to file and note the offset and size
  // of each global's definition in the symbol table.
  // Use the given target's RelocationKind for any relocations.
  void writeDataSection(const VariableDeclarationList &Vars,
                        FixupKind RelocationKind);

  // Copy data of a function's text section to file and note the offset of the
  // symbol's definition in the symbol table.
  // Copy the text fixups for use after all functions are written.
  // The text buffer and fixups are extracted from the Assembler object.
  void writeFunctionCode(const IceString &FuncName, bool IsInternal,
                         const Assembler *Asm);

  // Queries the GlobalContext for constant pools of the given type
  // and writes out read-only data sections for those constants. This also
  // fills the symbol table with labels for each constant pool entry.
  template <typename ConstType> void writeConstantPool(Type Ty);

  // Populate the symbol table with a list of external/undefined symbols.
  void setUndefinedSyms(const ConstantList &UndefSyms);

  // Do final layout and write out the rest of the object file.
  // Finally, patch up the initial ELF header with the final info.
  void writeNonUserSections();

  // Which type of ELF section a global variable initializer belongs to.
  // This is used as an array index so should start at 0 and be contiguous.
  enum SectionType { ROData = 0, Data, BSS, NumSectionTypes };

private:
  GlobalContext &Ctx;
  ELFStreamer &Str;
  bool SectionNumbersAssigned;
  bool ELF64;

  // All created sections, separated into different pools.
  typedef std::vector<ELFSection *> SectionList;
  typedef std::vector<ELFTextSection *> TextSectionList;
  typedef std::vector<ELFDataSection *> DataSectionList;
  typedef std::vector<ELFRelocationSection *> RelSectionList;
  TextSectionList TextSections;
  RelSectionList RelTextSections;
  DataSectionList DataSections;
  RelSectionList RelDataSections;
  DataSectionList RODataSections;
  RelSectionList RelRODataSections;
  DataSectionList BSSSections;

  // Handles to special sections that need incremental bookkeeping.
  ELFSection *NullSection;
  ELFStringTableSection *ShStrTab;
  ELFSymbolTableSection *SymTab;
  ELFStringTableSection *StrTab;

  template <typename T>
  T *createSection(const IceString &Name, Elf64_Word ShType,
                   Elf64_Xword ShFlags, Elf64_Xword ShAddralign,
                   Elf64_Xword ShEntsize);

  // Create a relocation section, given the related section
  // (e.g., .text, .data., .rodata).
  ELFRelocationSection *
  createRelocationSection(const ELFSection *RelatedSection);

  // Align the file position before writing out a section's data,
  // and return the position of the file.
  Elf64_Off alignFileOffset(Elf64_Xword Align);

  // Assign an ordering / section numbers to each section.
  // Fill in other information that is only known near the end
  // (such as the size, if it wasn't already incrementally updated).
  // This then collects all sections in the decided order, into one vector,
  // for conveniently writing out all of the section headers.
  void assignSectionNumbersInfo(SectionList &AllSections);

  // This function assigns .foo and .rel.foo consecutive section numbers.
  // It also sets the relocation section's sh_info field to the related
  // section's number.
  template <typename UserSectionList>
  void assignRelSectionNumInPairs(SizeT &CurSectionNumber,
                                  UserSectionList &UserSections,
                                  RelSectionList &RelSections,
                                  SectionList &AllSections);

  // Link the relocation sections to the symbol table.
  void assignRelLinkNum(SizeT SymTabNumber, RelSectionList &RelSections);

  // Helper function for writeDataSection. Writes a data section of type
  // SectionType, given the global variables Vars belonging to that SectionType.
  void writeDataOfType(SectionType SectionType,
                       const VariableDeclarationList &Vars,
                       FixupKind RelocationKind);

  // Write the final relocation sections given the final symbol table.
  // May also be able to seek around the file and resolve function calls
  // that are for functions within the same section.
  void writeAllRelocationSections();
  void writeRelocationSections(RelSectionList &RelSections);

  // Write the ELF file header with the given information about sections.
  template <bool IsELF64>
  void writeELFHeaderInternal(Elf64_Off SectionHeaderOffset,
                              SizeT SectHeaderStrIndex, SizeT NumSections);
};

} // end of namespace Ice

#endif // SUBZERO_SRC_ICEELFOBJECTWRITER_H
