/* Definitions for the data structures and codes used in VMS debugging.
   Copyright (C) 2001-2023 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#ifndef GCC_VMSDBG_H
#define GCC_VMSDBG_H 1

/*  We define types and constants used in VMS Debug output.  Note that the
    structs only approximate the output that is written.  We write the output
    explicitly, field by field.  This output would only agree with the
    structs in this file if no padding were done.  The sizes after each
    struct are the size actually written, which is usually smaller than the
    size of the struct.  */

/* Header type codes.  */
typedef enum _DST_TYPE {DST_K_TBG = 0x17,
			DST_K_SOURCE = 155, DST_K_PROLOG = 162,
			DST_K_BLKBEG = 176, DST_K_BLKEND = 177,
			DST_K_LINE_NUM = 185, DST_K_MODBEG = 188,
			DST_K_MODEND = 189, DST_K_RTNBEG = 190,
			DST_K_RTNEND = 191} DST_DTYPE;

/* Header.  */

typedef struct _DST_HEADER
{
  union
    {
      unsigned short int dst_w_length;
      unsigned short int dst_x_length;
    } dst__header_length;
  union
    {
      ENUM_BITFIELD (_DST_TYPE) dst_w_type : 16;
      ENUM_BITFIELD (_DST_TYPE) dst_x_type : 16;
    } dst__header_type;
} DST_HEADER;
#define DST_K_DST_HEADER_SIZE sizeof 4

/* Language type codes.  */
typedef enum _DST_LANGUAGE {DST_K_FORTRAN = 1, DST_K_C = 7, DST_K_ADA = 9,
			    DST_K_UNKNOWN = 10, DST_K_CXX = 15} DST_LANGUAGE;

/* Module header (a module is the result of a single compilation).  */

typedef struct _DST_MODULE_BEGIN
{
  DST_HEADER dst_a_modbeg_header;
  struct
    {
      unsigned dst_v_modbeg_hide : 1;
      unsigned dst_v_modbeg_version : 1;
      unsigned dst_v_modbeg_unused : 6;
    } dst_b_modbeg_flags;
  unsigned char dst_b_modbeg_unused;
  DST_LANGUAGE dst_l_modbeg_language;
  unsigned short int dst_w_version_major;
  unsigned short int dst_w_version_minor;
  unsigned char dst_b_modbeg_name;
} DST_MODULE_BEGIN;
#define DST_K_MODBEG_SIZE 15

/* Module trailer.  */

typedef struct _DST_MB_TRLR
{
  unsigned char dst_b_compiler;
} DST_MB_TRLR;

#define DST_K_MB_TRLR_SIZE 1

#define DST_K_VERSION_MAJOR 1
#define DST_K_VERSION_MINOR 13

typedef struct _DST_MODULE_END
{
  DST_HEADER dst_a_modend_header;
} DST_MODULE_END;
#define DST_K_MODEND_SIZE sizeof 4

/* Routine header.  */

typedef struct _DST_ROUTINE_BEGIN
{
  DST_HEADER dst_a_rtnbeg_header;
  struct
    {
      unsigned dst_v_rtnbeg_unused : 4;
      unsigned dst_v_rtnbeg_unalloc : 1;
      unsigned dst_v_rtnbeg_prototype : 1;
      unsigned dst_v_rtnbeg_inlined : 1;
      unsigned dst_v_rtnbeg_no_call : 1;
    } dst_b_rtnbeg_flags;
  int *dst_l_rtnbeg_address;
  int *dst_l_rtnbeg_pd_address;
  unsigned char dst_b_rtnbeg_name;
} DST_ROUTINE_BEGIN;
#define DST_K_RTNBEG_SIZE 14

/* Routine trailer */

typedef struct _DST_ROUTINE_END
{
  DST_HEADER dst_a_rtnend_header;
  char dst_b_rtnend_unused;
  unsigned int dst_l_rtnend_size;
} DST_ROUTINE_END;
#define DST_K_RTNEND_SIZE 9

/* Block header.  */

typedef struct _DST_BLOCK_BEGIN
{
  DST_HEADER dst_a_blkbeg_header;
  unsigned char dst_b_blkbeg_unused;
  int *dst_l_blkbeg_address;
  unsigned char dst_b_blkbeg_name;
} DST_BLOCK_BEGIN;
#define DST_K_BLKBEG_SIZE 10

/* Block trailer.  */

typedef struct _DST_BLOCK_END
{
  DST_HEADER dst_a_blkend_header;
  unsigned char dst_b_blkend_unused;
  unsigned int dst_l_blkend_size;
} DST_BLOCK_END;
#define DST_K_BLKEND_SIZE 9

/* Line number header.  */

typedef struct _DST_LINE_NUM_HEADER
{
  DST_HEADER dst_a_line_num_header;
} DST_LINE_NUM_HEADER;
#define DST_K_LINE_NUM_HEADER_SIZE 4

/* PC to Line number correlation.  */

typedef struct _DST_PCLINE_COMMANDS
{
  char dst_b_pcline_command;
  union
    {
      unsigned int dst_l_pcline_unslong;
      unsigned short int dst_w_pcline_unsword;
      unsigned char dst_b_pcline_unsbyte;
    } dst_a_pcline_access_fields;
} DST_PCLINE_COMMANDS;

/* PC and Line number correlation codes.  */

#define DST_K_PCLINE_COMMANDS_SIZE 5
#define DST_K_PCLINE_COMMANDS_SIZE_MIN 2
#define DST_K_PCLINE_COMMANDS_SIZE_MAX 5
#define DST_K_DELTA_PC_LOW -128
#define DST_K_DELTA_PC_HIGH 0
#define DST_K_DELTA_PC_W 1
#define DST_K_INCR_LINUM 2
#define DST_K_INCR_LINUM_W 3
#define DST_K_SET_LINUM 9
#define DST_K_SET_ABS_PC 16
#define DST_K_DELTA_PC_L 17
#define DST_K_INCR_LINUM_L 18
#define DST_K_SET_LINUM_B 19
#define DST_K_SET_LINUM_L 20

/* Source file correlation header.  */

typedef struct _DST_SOURCE_CORR
{
  DST_HEADER dst_a_source_corr_header;
} DST_SOURCE_CORR;
#define DST_K_SOURCE_CORR_HEADER_SIZE 4

/* Source file correlation codes.  */

#define DST_K_SRC_DECLFILE 1
#define DST_K_SRC_SETFILE 2
#define DST_K_SRC_SETREC_L 3
#define DST_K_SRC_SETREC_W 4
#define DST_K_SRC_SETLNUM_L 5
#define DST_K_SRC_SETLNUM_W 6
#define DST_K_SRC_INCRLNUM_B 7
#define DST_K_SRC_DEFLINES_W 10
#define DST_K_SRC_DEFLINES_B 11
#define DST_K_SRC_FORMFEED 16
#define DST_K_SRC_MIN_CMD 1
#define DST_K_SRC_MAX_CMD 16

/* Source file header.  */

typedef struct _DST_SRC_COMMAND
{
  unsigned char dst_b_src_command;
  union
    {
      struct
	{
	  unsigned char dst_b_src_df_length;
	  unsigned char dst_b_src_df_flags;
	  unsigned short int dst_w_src_df_fileid;
	  int64_t dst_q_src_df_rms_cdt;
	  unsigned int dst_l_src_df_rms_ebk;
	  unsigned short int dst_w_src_df_rms_ffb;
	  unsigned char dst_b_src_df_rms_rfo;
	  unsigned char dst_b_src_df_filename;
	} dst_a_src_decl_src;
      unsigned int dst_l_src_unslong;
      unsigned short int dst_w_src_unsword;
      unsigned char dst_b_src_unsbyte;
    } dst_a_src_cmd_fields;
} DST_SRC_COMMAND;
#define DST_K_SRC_COMMAND_SIZE 21

/* Source file trailer.  */

typedef struct _DST_SRC_CMDTRLR
{
  unsigned char dst_b_src_df_libmodname;
} DST_SRC_CMDTRLR;
#define DST_K_SRC_CMDTRLR_SIZE 1

/* Prolog header.  */

typedef struct _DST_PROLOG
{
  DST_HEADER dst_a_prolog_header;
  unsigned int dst_l_prolog_bkpt_addr;
} DST_PROLOG;
#define DST_K_PROLOG_SIZE 8

#endif /* GCC_VMSDBG_H */
