#pragma once

/*!
 * @file link_types.h
 * Types used in the linking data, shared between the object file generator and the kernel's linker.
 */

#include "common_types.h"

enum LinkKind {
  LINK_TABLE_END = 0,                 //! no more linking data
  LINK_SYMBOL_OFFSET = 1,             //! link a symbol (pointer to symbol table entry)
  LINK_TYPE_PTR = 2,                  //! link a pointer to a type.
  LINK_DISTANCE_TO_OTHER_SEG_64 = 3,  //! link to another segment
  LINK_DISTANCE_TO_OTHER_SEG_32 = 4,  //! link to another segment
  LINK_PTR = 5,                       //! link a pointer within this segment
};

enum SegmentTypes { MAIN_SEGMENT = 0, DEBUG_SEGMENT = 1, TOP_LEVEL_SEGMENT = 2 };

constexpr const char* SEGMENT_NAMES[3] = {"main", "debug", "top-level"};

constexpr int N_SEG = 3;

/*!
 * Data at the front of the DGO.
 */
struct DgoHeader {
  u32 object_count;
  char name[60];
};

/*!
 * Data at the front of each OBJ.
 */
struct ObjectHeader {
  u32 size;
  char name[60];
};

// Header for link data used for V2 linking data
// used in GOAL and OpenGOAL
struct LinkHeaderV2 {
  uint32_t type_tag;  // always -1
  uint32_t length;    // length of link data
  uint32_t version;   // always 2
};

// Header for link data used for V4
struct LinkHeaderV4 {
  uint32_t type_tag;   // always -1
  uint32_t length;     // length of V2 link data found after object.
  uint32_t version;    // always 4
  uint32_t code_size;  // length of object data before link data starts
};
