//===- LDFileFormat.h -----------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef MCLD_LDFILE_FORMAT_H
#define MCLD_LDFILE_FORMAT_H
#ifdef ENABLE_UNITTEST
#include <gtest.h>
#endif

#include <cstdio>
#include <cassert>

namespace mcld
{

class MCLinker;
class LDSection;

/** \class LDFileFormat
 *  \brief LDFileFormat describes the common file formats.
 */
class LDFileFormat
{
public:
  enum Kind {
    Null,
    Regular,
    BSS,
    NamePool,
    Relocation,
    Debug,
    Target,
    Exception,
    Version,
    Note,
    MetaData,
    Group,
  };

protected:
  LDFileFormat();

public:
  virtual ~LDFileFormat();

  /// initStdSections - initialize all standard sections.
  void initStdSections(MCLinker& pLinker);

  /// initObjectFormat - different format, such as ELF and MachO, should
  /// implement this
  virtual void initObjectFormat(MCLinker& pLinker) = 0;

  /// initObjectType - different types, such as shared object, executable
  /// files, should implement this
  virtual void initObjectType(MCLinker& pLinker) = 0;

  // -----  access functions  ----- //
  LDSection& getText() {
    assert(NULL != f_pTextSection);
    return *f_pTextSection;
  }

  const LDSection& getText() const {
    assert(NULL != f_pTextSection);
    return *f_pTextSection;
  }

  LDSection& getData() {
    assert(NULL != f_pDataSection);
    return *f_pDataSection;
  }

  const LDSection& getData() const {
    assert(NULL != f_pDataSection);
    return *f_pDataSection;
  }

  LDSection& getBSS() {
    assert(NULL != f_pBSSSection);
    return *f_pBSSSection;
  }

  const LDSection& getBSS() const {
    assert(NULL != f_pBSSSection);
    return *f_pBSSSection;
  }

  LDSection& getReadOnly() {
    assert(NULL != f_pReadOnlySection);
    return *f_pReadOnlySection;
  }

  const LDSection& getReadOnly() const {
    assert(NULL != f_pReadOnlySection);
    return *f_pReadOnlySection;
  }
protected:
  //         variable name         :  ELF               MachO
  LDSection* f_pTextSection;       // .text             __text
  LDSection* f_pDataSection;       // .data             __data
  LDSection* f_pBSSSection;        // .bss              __bss
  LDSection* f_pReadOnlySection;   // .rodata           __const
};

} // namespace of mcld

#endif
