aboutsummaryrefslogtreecommitdiff
path: root/bfd/vms.h
diff options
context:
space:
mode:
Diffstat (limited to 'bfd/vms.h')
-rw-r--r--bfd/vms.h635
1 files changed, 434 insertions, 201 deletions
diff --git a/bfd/vms.h b/bfd/vms.h
index 2235540..b7d9344 100644
--- a/bfd/vms.h
+++ b/bfd/vms.h
@@ -1,6 +1,8 @@
/* vms.h -- Header file for VMS (Alpha and Vax) support.
- Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007
- Free Software Foundation, Inc.
+ Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007,
+ 2008, 2009 Free Software Foundation, Inc.
+
+ Main header file.
Written by Klaus K"ampf (kkaempf@rmi.de)
@@ -25,9 +27,12 @@
#ifndef VMS_H
#define VMS_H
-/* Constants starting with 'Exxx_' are for openVMS/Alpha (EVAX object language) */
+/* Constants starting with 'Exxx_' are for openVMS/Alpha (EVAX object
+ language). */
+
+#define VMS_BLOCK_SIZE 512
-/* VMS Text, information and relocation record (TIR/ETIR) definitions. */
+/* VMS Text Information and Relocation Records (TIR/ETIR). */
#define TIR_S_C_STA_GBL 0
#define TIR_S_C_STA_SB 1
@@ -107,7 +112,7 @@
#define ETIR_S_C_STA_GBL 0 /* Stack global symbol value. */
#define ETIR_S_C_STA_LW 1 /* Stack longword. */
#define ETIR_S_C_STA_QW 2 /* Stack quadword. */
-#define ETIR_S_C_STA_PQ 3 /* Stack psect base plus quadword offset. */
+#define ETIR_S_C_STA_PQ 3 /* Stack psect base + quadword off. */
#define ETIR_S_C_STA_LI 4 /* Stack literal. */
#define ETIR_S_C_STA_MOD 5 /* Stack module. */
#define ETIR_S_C_STA_CKARG 6 /* Check Arguments. */
@@ -173,7 +178,9 @@
#define ETIR_S_C_STC_NBH_PS 214 /* Store-conditional NOP,BSR or HINT at psect + offset. */
#define ETIR_S_C_MAXSTCCOD 214 /* Maximum store-conditional code. */
-/* VMS Global symbol definition record (GSD/EGSD). */
+#define ETIR_S_C_HEADER_SIZE 4 /* Size of the header of a command */
+
+/* VMS Global Symbol Directory Records (GSD/EGSD). */
#define GSD_S_K_ENTRIES 1
#define GSD_S_C_ENTRIES 1
@@ -206,6 +213,7 @@
#define EGSD_S_C_SYMG 8 /* EGST - gst version of SYM. */
#define EGSD_S_C_MAXRECTYP 8 /* Maximum entry type defined. */
+/* Program Section Definition. */
#define GPS_S_M_PIC 1
#define GPS_S_M_LIB 2
#define GPS_S_M_OVR 4
@@ -219,31 +227,41 @@
#define GPS_S_K_NAME 9
#define GPS_S_C_NAME 9
-#define EGPS_S_V_PIC 0x0001
-#define EGPS_S_V_LIB 0x0002
-#define EGPS_S_V_OVR 0x0004
-#define EGPS_S_V_REL 0x0008
-#define EGPS_S_V_GBL 0x0010
-#define EGPS_S_V_SHR 0x0020
-#define EGPS_S_V_EXE 0x0040
-#define EGPS_S_V_RD 0x0080
-#define EGPS_S_V_WRT 0x0100
-#define EGPS_S_V_VEC 0x0200
-#define EGPS_S_V_NOMOD 0x0400
-#define EGPS_S_V_COM 0x0800
-
+#define EGPS_S_B_ALIGN 4
+#define EGPS_S_W_FLAGS 6
+#define EGPS_S_L_ALLOC 8
+#define EGPS_S_B_NAMLNG 12
+
+#define EGPS_S_V_PIC 0x0001
+#define EGPS_S_V_LIB 0x0002
+#define EGPS_S_V_OVR 0x0004
+#define EGPS_S_V_REL 0x0008
+#define EGPS_S_V_GBL 0x0010
+#define EGPS_S_V_SHR 0x0020
+#define EGPS_S_V_EXE 0x0040
+#define EGPS_S_V_RD 0x0080
+#define EGPS_S_V_WRT 0x0100
+#define EGPS_S_V_VEC 0x0200
+#define EGPS_S_V_NOMOD 0x0400
+#define EGPS_S_V_COM 0x0800
+#define EGPS_S_V_ALLOC_64BIT 0x1000
+
+/* Symbol Defintion or Reference. */
#define GSY_S_M_WEAK 1
#define GSY_S_M_DEF 2
#define GSY_S_M_UNI 4
#define GSY_S_M_REL 8
-#define EGSY_S_V_WEAK 0x0001
-#define EGSY_S_V_DEF 0x0002
-#define EGSY_S_V_UNI 0x0004
-#define EGSY_S_V_REL 0x0008
-#define EGSY_S_V_COMM 0x0010
-#define EGSY_S_V_VECEP 0x0020
-#define EGSY_S_V_NORM 0x0040
+#define EGSY_S_W_FLAGS 6
+
+#define EGSY_S_V_WEAK 0x0001
+#define EGSY_S_V_DEF 0x0002
+#define EGSY_S_V_UNI 0x0004
+#define EGSY_S_V_REL 0x0008
+#define EGSY_S_V_COMM 0x0010
+#define EGSY_S_V_VECEP 0x0020
+#define EGSY_S_V_NORM 0x0040
+#define EGSY_S_V_QUAD_VAL 0x0080
#define LSY_S_M_DEF 2
#define LSY_S_M_REL 8
@@ -251,10 +269,26 @@
#define ENV_S_M_DEF 1
#define ENV_S_M_NESTED 2
+/* Symbol Definition. */
+#define ESDF_S_L_VALUE 8
+#define ESDF_S_L_PSINDX 28
+#define ESDF_S_B_NAMLNG 32
+
+/* Universal Symbol Definition. */
+#define EGST_S_W_FLAGS 6
+#define EGST_S_Q_LP_1 16
+#define EGST_S_Q_LP_2 24
+#define EGST_S_L_PSINDX 32
+#define EGST_S_B_NAMLNG 36
+
+/* Symbol Reference. */
+#define ESRF_S_B_NAMLNG 8
+
/* Debugger symbol definitions: These are done by hand,
as no machine-readable version seems to be available. */
#define DST_S_C_C 7 /* Language == "C". */
#define DST_S_C_CXX 15 /* Language == "C++". */
+#define DST_S_C_EPILOG 127
#define DST_S_C_VERSION 153
#define DST_S_C_SOURCE 155 /* Source file. */
#define DST_S_C_PROLOG 162
@@ -269,15 +303,19 @@
#define DST_S_C_MODEND 189 /* End of module. */
#define DST_S_C_RTNBEG 190 /* Beginning of routine.*/
#define DST_S_C_RTNEND 191 /* End of routine. */
-#define DST_S_C_DELTA_PC_W 1 /* Incr PC. */
-#define DST_S_C_INCR_LINUM 2 /* Incr Line #. */
-#define DST_S_C_INCR_LINUM_W 3 /* Incr Line #. */
-#define DST_S_C_SET_LINUM_INCR 4
+
+/* These are used with DST_S_C_LINE_NUM. */
+#define DST_S_C_LINE_NUM_HEADER_SIZE 4
+
+#define DST_S_C_DELTA_PC_W 1 /* Incr PC. */
+#define DST_S_C_INCR_LINUM 2 /* Incr Line #. */
+#define DST_S_C_INCR_LINUM_W 3 /* Incr Line #. */
+#define DST_S_C_SET_LINUM_INCR 4
#define DST_S_C_SET_LINUM_INCR_W 5
#define DST_S_C_RESET_LINUM_INCR 6
-#define DST_S_C_BEG_STMT_MODE 7
-#define DST_S_C_END_STMT_MODE 8
-#define DST_S_C_SET_LINE_NUM 9 /* Set Line #. */
+#define DST_S_C_BEG_STMT_MODE 7
+#define DST_S_C_END_STMT_MODE 8
+#define DST_S_C_SET_LINE_NUM 9 /* Set Line #. */
#define DST_S_C_SET_PC 10
#define DST_S_C_SET_PC_W 11
#define DST_S_C_SET_PC_L 12
@@ -295,9 +333,32 @@
#define DST_S_C_SRC_SETFILE 2 /* Set source file. */
#define DST_S_C_SRC_SETREC_L 3 /* Set record, longword value. */
#define DST_S_C_SRC_SETREC_W 4 /* Set record, word value. */
+#define DST_S_C_SRC_SETLNUM_L 5 /* Set line, longword value. */
+#define DST_S_C_SRC_SETLNUM_W 6 /* Set line, word value. */
+#define DST_S_C_SRC_INCRLNUM_B 7 /* Increment line. */
#define DST_S_C_SRC_DEFLINES_W 10 /* # of line, word counter. */
#define DST_S_C_SRC_DEFLINES_B 11 /* # of line, byte counter. */
#define DST_S_C_SRC_FORMFEED 16 /* ^L counts as a record. */
+
+#define DST_S_B_PCLINE_UNSBYTE 1
+#define DST_S_W_PCLINE_UNSWORD 1
+#define DST_S_L_PCLINE_UNSLONG 1
+
+#define DST_S_B_MODBEG_NAME 14
+#define DST_S_L_RTNBEG_ADDRESS 5
+#define DST_S_B_RTNBEG_NAME 13
+#define DST_S_L_RTNEND_SIZE 5
+
+/* These are used with DST_S_C_SOURCE. */
+#define DST_S_C_SOURCE_HEADER_SIZE 4
+
+#define DST_S_B_SRC_DF_LENGTH 1
+#define DST_S_W_SRC_DF_FILEID 3
+#define DST_S_B_SRC_DF_FILENAME 20
+#define DST_S_B_SRC_UNSBYTE 1
+#define DST_S_W_SRC_UNSWORD 1
+#define DST_S_L_SRC_UNSLONG 1
+
/* The following are the codes for the various data types. Anything not on
the list is included under 'advanced_type'. */
#define DBG_S_C_UCHAR 0x02
@@ -328,6 +389,7 @@
#define DSC_K_CLASS_D 0x02 /* Dynamic string (not via malloc!). */
#define DSC_K_CLASS_A 0x04 /* Array. */
#define DSC_K_CLASS_UBS 0x0d /* Unaligned bit string. */
+
/* These are the codes that are used to generate the definitions of struct
union and enum records. */
#define DBG_S_C_ENUM_ITEM 0xa4
@@ -336,7 +398,7 @@
#define DBG_S_C_STRUCT_ITEM DST_K_VFLAGS_BITOFFS /* 0xff */
#define DBG_S_C_STRUCT_START 0xab
#define DBG_S_C_STRUCT_END 0xac
-#define DST_K_TYPSPEC 0xaf /* Type specification. */
+#define DST_K_TYPSPEC 0xaf /* Type specification. */
/* These codes are used in the generation of the symbol definition records. */
#define DST_K_VFLAGS_NOVAL 0x80 /* Struct definition only. */
#define DST_K_VFLAGS_DSC 0xfa /* Descriptor used. */
@@ -379,7 +441,7 @@
#define DBG_S_C_VOID DST_K_TS_PTR
#define DBG_S_C_COMPLEX_ARRAY DST_K_TS_ARRAY
-/* VMS Module header record (EMH) definitions. */
+/* VMS Module Header Records (MHD/EMH). */
#define MHD_S_C_MHD 0
#define MHD_S_C_LNM 1
@@ -402,48 +464,68 @@
/* vms.c. */
extern asymbol *_bfd_vms_make_empty_symbol (bfd *);
+extern int _bfd_vms_slurp_object_records (bfd *abfd);
/* vms-gsd.c. */
-extern int _bfd_vms_slurp_gsd (bfd *, int);
-extern int _bfd_vms_write_gsd (bfd *, int);
+extern int _bfd_vms_slurp_gsd (bfd *abfd, int objtype);
+extern int _bfd_vms_write_gsd (bfd *abfd, int objtype);
+extern int _bfd_vms_slurp_dbg (bfd *abfd, int objtype);
+extern int _bfd_vms_write_dbg (bfd *abfd, int objtype);
+extern int _bfd_vms_slurp_tbt (bfd *abfd, int objtype);
+extern int _bfd_vms_write_tbt (bfd *abfd, int objtype);
-/* vms-mhd.c. */
+/* vms-misc.c. */
-extern int _bfd_vms_slurp_hdr (bfd *, int);
-extern int _bfd_vms_write_hdr (bfd *, int);
-extern int _bfd_vms_slurp_eom (bfd *, int);
-extern int _bfd_vms_write_eom (bfd *, int);
+extern int _bfd_vms_get_object_record (bfd *abfd);
+extern int _bfd_vms_get_first_record (bfd *abfd);
+
+/* vms-hdr.c. */
+
+extern int _bfd_vms_slurp_hdr (bfd *abfd, int objtype);
+extern int _bfd_vms_write_hdr (bfd *abfd, int objtype);
+extern int _bfd_vms_slurp_eom (bfd *abfd, int objtype);
+extern int _bfd_vms_write_eom (bfd *abfd, int objtype);
+extern bfd_boolean _bfd_vms_find_nearest_dst_line
+ (bfd *abfd, asection *section, asymbol **symbols, bfd_vma offset,
+ const char **file, const char **func, unsigned int *line);
+extern int _bfd_vms_slurp_ihd
+ (bfd *abfd, unsigned int *isd_offset, unsigned int *ihs_offset);
+extern int _bfd_vms_slurp_isd (bfd *abfd, unsigned int offset);
+extern int _bfd_vms_slurp_ihs (bfd *abfd, unsigned int offset);
/* vms-tir.c. */
-extern int _bfd_vms_slurp_tir (bfd *, int);
-extern int _bfd_vms_slurp_dbg (bfd *, int);
-extern int _bfd_vms_slurp_tbt (bfd *, int);
-extern int _bfd_vms_slurp_lnk (bfd *, int);
-
-extern int _bfd_vms_write_tir (bfd *, int);
-extern int _bfd_vms_write_tbt (bfd *, int);
-extern int _bfd_vms_write_dbg (bfd *, int);
-
-/* The r_type field in a reloc is one of he following values. */
-#define ALPHA_R_IGNORE 0
-#define ALPHA_R_REFQUAD 1
-#define ALPHA_R_BRADDR 2
-#define ALPHA_R_HINT 3
-#define ALPHA_R_SREL16 4
-#define ALPHA_R_SREL32 5
-#define ALPHA_R_SREL64 6
-#define ALPHA_R_OP_PUSH 7
-#define ALPHA_R_OP_STORE 8
-#define ALPHA_R_OP_PSUB 9
-#define ALPHA_R_OP_PRSHIFT 10
-#define ALPHA_R_LINKAGE 11
-#define ALPHA_R_REFLONG 12
-#define ALPHA_R_CODEADDR 13
-
-/* Object language definitions. */
-
+extern int _bfd_vms_slurp_tir (bfd *abfd, int objtype);
+extern int _bfd_vms_write_tir (bfd *abfd, int objtype);
+extern int _bfd_vms_slurp_lnk (bfd *abfd, int objtype);
+
+extern int _bfd_vms_slurp_relocs (bfd *abfd);
+extern int _bfd_vms_decode_relocs
+ (bfd *abfd, arelent *relocs, asection *section, asymbol **symbols);
+
+/* The r_type field in a reloc is one of the following values. */
+#define ALPHA_R_IGNORE 0
+#define ALPHA_R_REFQUAD 1
+#define ALPHA_R_BRADDR 2
+#define ALPHA_R_HINT 3
+#define ALPHA_R_SREL16 4
+#define ALPHA_R_SREL32 5
+#define ALPHA_R_SREL64 6
+#define ALPHA_R_OP_PUSH 7
+#define ALPHA_R_OP_STORE 8
+#define ALPHA_R_OP_PSUB 9
+#define ALPHA_R_OP_PRSHIFT 10
+#define ALPHA_R_LINKAGE 11
+#define ALPHA_R_REFLONG 12
+#define ALPHA_R_CODEADDR 13
+#define ALPHA_R_NOP 14
+#define ALPHA_R_BSR 15
+#define ALPHA_R_LDA 16
+#define ALPHA_R_BOH 17
+
+/* VMS Object Language (OBJ/EOBJ). */
+
#define OBJ_S_C_HDR 0 /* VAX moule header record. */
#define OBJ_S_C_GSD 1 /* VAX glbal symbol definition record. */
#define OBJ_S_C_TIR 2 /* VAX tet information record. */
@@ -453,13 +535,15 @@ extern int _bfd_vms_write_dbg (bfd *, int);
#define OBJ_S_C_LNK 6 /* VAX liker options record. */
#define OBJ_S_C_EOMW 7 /* VAX en of module word-psect record. */
#define OBJ_S_C_MAXRECTYP 7 /* VAX Lat assigned record type. */
+
#define EOBJ_S_C_EMH 8 /* EVAX mdule header record. */
#define EOBJ_S_C_EEOM 9 /* EVAX ed of module record. */
-#define EOBJ_S_C_EGSD 10 /* EVAX gobal symbol definition record.*/
-#define EOBJ_S_C_ETIR 11 /* EVAX txt information record. */
+#define EOBJ_S_C_EGSD 10 /* EVAX gobal symbol definition record. */
+#define EOBJ_S_C_ETIR 11 /* EVAX txt information record. */
#define EOBJ_S_C_EDBG 12 /* EVAX Dbugger information record. */
#define EOBJ_S_C_ETBT 13 /* EVAX Taceback information record. */
#define EOBJ_S_C_MAXRECTYP 13 /* EVAX Lst assigned record type. */
+
#define OBJ_S_K_SUBTYP 1
#define OBJ_S_C_SUBTYP 1
#define EOBJ_S_K_SUBTYP 4
@@ -475,8 +559,9 @@ extern int _bfd_vms_write_dbg (bfd *, int);
#define EOBJ_S_C_STOREPLIM -1 /* Maximu repeat count on store commands. */
#define OBJ_S_C_PSCALILIM 9 /* Maximu p-sect alignment. */
#define EOBJ_S_C_PSCALILIM 16 /* Maximu p-sect alignment. */
-
+
#define EVAX_OFFSET 256 /* Type ofset for EVAX codes in switch. */
+
/* Miscellaneous definitions. */
#if __GNUC__
@@ -484,140 +569,286 @@ typedef unsigned long long uquad;
#else
typedef unsigned long uquad;
#endif
-
-#define MAX_OUTREC_SIZE 4096
-#define MIN_OUTREC_LUFT 64
-
-typedef struct _vms_section
-{
- unsigned char *contents;
- bfd_vma offset;
- bfd_size_type size;
- struct _vms_section *next;
-} vms_section;
-
-extern vms_section * _bfd_get_vms_section (bfd *, int);
-
-typedef struct _vms_reloc
-{
- struct _vms_reloc *next;
- arelent *reloc;
- asection *section;
-} vms_reloc;
-
+
+#define MAX_OUTREC_SIZE 4096
+#define MIN_OUTREC_LUFT 64
+
/* VMS module header. */
-
-struct hdr_struc
-{
- int hdr_b_strlvl;
- long hdr_l_arch1;
- long hdr_l_arch2;
- long hdr_l_recsiz;
- char * hdr_t_name;
- char * hdr_t_version;
- char * hdr_t_date;
- char * hdr_c_lnm;
- char * hdr_c_src;
- char * hdr_c_ttl;
-};
-
-/* VMS end of module. */
-
-struct eom_struc
-{
- long eom_l_total_lps;
- unsigned char eom_b_comcod;
- bfd_boolean eom_has_transfer;
- unsigned char eom_b_tfrflg;
- long eom_l_psindx;
- long eom_l_tfradr;
-};
-
-enum file_format_enum { FF_UNKNOWN, FF_FOREIGN, FF_NATIVE, FF_VAX };
-
-typedef struct vms_symbol_struct
-{
- struct bfd_hash_entry bfd_hash;
- asymbol *symbol;
-} vms_symbol_entry;
-
+
+struct hdr_struct
+{
+ char hdr_b_strlvl;
+ int hdr_l_arch1;
+ int hdr_l_arch2;
+ int hdr_l_recsiz;
+ char *hdr_t_name;
+ char *hdr_t_version;
+ char *hdr_t_date;
+ char *hdr_c_lnm;
+ char *hdr_c_src;
+ char *hdr_c_ttl;
+ char *hdr_c_cpr;
+};
+
+#define EMH_S_W_HDRTYP 4
+#define EMH_S_B_STRLVL 6
+#define EMH_S_L_ARCH1 8
+#define EMH_S_L_ARCH2 12
+#define EH_S_L_RECSIZ 16
+#define EMH_S_B_NAMLNG 20
+
+#define EMH_DATE_LENGTH 17
+
+/* VMS End-Of-Module records (EOM/EEOM). */
+
+struct eom_struct
+{
+ int eom_l_total_lps;
+ short eom_w_comcod;
+ bfd_boolean eom_has_transfer;
+ char eom_b_tfrflg;
+ int eom_l_psindx;
+ int eom_l_tfradr;
+};
+
+#define EEOM_S_L_TOTAL_LPS 4
+#define EEOM_S_W_COMCOD 8
+#define EEOM_S_B_TFRFLG 10
+#define EEOM_S_L_PSINDX 12
+#define EEOM_S_L_TFRADR 16
+
+/* VMS Image Header Records (IHD/EIHD). */
+
+#define EIHD_S_K_MAJORID 3 /* Major id constant */
+#define EIHD_S_K_MINORID 0 /* Minor id constant */
+#define EIHD_S_K_EXE 1 /* Executable image */
+
+#define EIHD_S_L_SIZE 8
+#define EIHD_S_L_ISDOFF 12
+#define EIHD_S_L_SYMDBGOFF 20
+#define EIHD_S_Q_SYMVVA 40
+#define EIHD_S_L_IMGTYPE 52
+
+/* VMS Image Section Description Records (ISD/EISD). */
+
+#define EISD_S_L_EISDSIZE 8
+#define EISD_S_L_SECSIZE 12
+#define EISD_S_Q_VIR_ADDR 16
+#define EISD_S_L_FLAGS 24
+#define EISD_S_L_VBN 28
+#define EISD_S_R_CONTROL 32
+#define EISD_S_L_IDENT 36
+#define EISD_S_T_GBLNAM 40
+
+#define EISD_S_M_GBL 0x0001
+#define EISD_S_M_CRF 0x0002
+#define EISD_S_M_DZRO 0x0004
+#define EISD_S_M_WRT 0x0008
+#define EISD_S_M_INITALCODE 0x0010
+#define EISD_S_M_BASED 0x0020
+#define EISD_S_M_FIXUPVEC 0x0040
+#define EISD_S_M_RESIDENT 0x0080
+#define EISD_S_M_VECTOR 0x0100
+#define EISD_S_M_PROTECT 0x0200
+#define EISD_S_M_LASTCLU 0x0400
+#define EISD_S_M_EXE 0x0800
+#define EISD_S_M_NONSHRADR 0x1000
+#define EISD_S_M_QUAD_LENGTH 0x2000
+#define EISD_S_M_ALLOC_64BIT 0x4000
+
+/* VMS Image Header Symbol Records (IHS/EIHS). */
+
+#define EIHS_S_L_DSTVBN 8
+#define EIHS_S_L_DSTSIZE 12
+#define EIHS_S_L_GSTVBN 16
+#define EIHS_S_L_GSTSIZE 20
+#define EIHS_S_L_DMTVBN 24
+#define EIHS_S_L_DMTBYTES 28
+
+/* Debugger symbol definitions. */
+
+#define DBG_S_L_DMT_MODBEG 0
+#define DBG_S_L_DST_SIZE 4
+#define DBG_S_W_DMT_PSECT_COUNT 8
+#define DBG_S_C_DMT_HEADER_SIZE 12
+
+#define DBG_S_L_DMT_PSECT_START 0
+#define DBG_S_L_DMT_PSECT_LENGTH 4
+#define DBG_S_C_DMT_PSECT_SIZE 8
+
+
+enum file_format_enum { FF_UNKNOWN, FF_FOREIGN, FF_NATIVE };
+enum file_type_enum { FT_UNKNOWN, FT_MODULE, FT_IMAGE };
+
+typedef struct vms_symbol_struct
+{
+ struct bfd_hash_entry bfd_hash;
+ asymbol *symbol;
+} vms_symbol_entry;
+
/* Stack value for push/pop commands. */
-
-struct stack_struct
-{
- uquad value;
- int psect;
-};
-#define STACKSIZE 8192
-
-/* location stack definitions for CTL_DFLC, CTL_STLOC, and CTL_STKDL */
-
-struct location_struct
-{
- unsigned long value;
- int psect;
-};
-#define LOCATION_SAVE_SIZE 32
-
-#define VMS_SECTION_COUNT 1024
-
-struct vms_private_data_struct
-{
- bfd_boolean is_vax;
+
+struct stack_struct
+{
+ uquad value;
+ int psect;
+};
+
+#define STACKSIZE 8192
+
+/* A minimal decoding of DST compilation units. We only decode
+ what's needed to get to the line number information. */
+
+struct fileinfo
+{
+ char *name;
+ unsigned int srec;
+};
+
+struct srecinfo
+{
+ struct srecinfo *next;
+ unsigned int line;
+ unsigned int sfile;
+ unsigned int srec;
+};
+
+struct lineinfo
+{
+ struct lineinfo *next;
+ bfd_vma address;
+ unsigned int line;
+};
+
+struct funcinfo
+{
+ struct funcinfo *next;
+ char *name;
+ bfd_vma low;
+ bfd_vma high;
+};
+
+struct module
+{
+ /* Chain the previously read compilation unit. */
+ struct module *next;
+
+ /* The module name. */
+ char *name;
+
+ /* The start offset and size of debug info in the DST section. */
+ unsigned int modbeg;
+ unsigned int size;
+
+ /* The lowest and highest addresses contained in this compilation
+ unit as specified in the compilation unit header. */
+ bfd_vma low;
+ bfd_vma high;
+
+ /* The listing line table. */
+ struct lineinfo *line_table;
+
+ /* The source record table. */
+ struct srecinfo *srec_table;
+
+ /* A list of the functions found in this module. */
+ struct funcinfo *func_table;
+
+ /* Current allocation of file_table. */
+ unsigned int file_table_count;
+
+ /* An array of the files making up this module. */
+ struct fileinfo *file_table;
+};
+
+struct vms_private_data_struct
+{
+ bfd_boolean is_vax;
bfd_boolean fixup_done; /* Flag to indicate if all
section pointers and PRIV(sections)
are set up correctly. */
- unsigned char *vms_buf; /* Buffer to record. */
- int buf_size; /* Max size of buffer. */
- unsigned char *vms_rec; /* Actual record ptr. */
- int rec_length; /* Remaining record length. */
- int rec_size; /* Actual record size. */
- int rec_type; /* Actual record type. */
- enum file_format_enum file_format;
-
- struct hdr_struc hdr_data; /* Data from HDR/EMH record. */
- struct eom_struc eom_data; /* Data from EOM/EEOM record. */
- unsigned int section_count; /* # of sections in following array. */
- asection **sections; /* Array of GSD/EGSD sections. */
- int gsd_sym_count; /* # of GSD/EGSD symbols. */
- asymbol **symbols; /* Vector of GSD/EGSD symbols. */
- struct proc_value *procedure;
-
- struct stack_struct *stack;
- int stackptr;
-
- vms_section *vms_section_table[VMS_SECTION_COUNT];
-
+ unsigned char *vms_buf; /* record buffer */
+ unsigned int buf_size; /* size of record buffer */
+ unsigned char *vms_rec; /* record pointer in record buffer */
+ unsigned int rec_size; /* record size */
+ enum file_format_enum file_format;
+
+ struct hdr_struct hdr_data; /* data from HDR/EMH record */
+ struct eom_struct eom_data; /* data from EOM/EEOM record */
+ unsigned int section_count; /* # of sections in following array */
+ asection **sections; /* array of GSD/EGSD sections */
+ unsigned int gsd_sym_count; /* # of GSD/EGSD symbols */
+ asymbol **symbols; /* vector of GSD/EGSD symbols */
+ struct proc_value *procedure;
+
+ struct stack_struct *stack;
+ int stackptr;
+
struct bfd_hash_table *vms_symbol_table;
- struct bfd_symbol **symcache;
- int symnum;
-
- struct location_struct *location_stack;
-
- asection *image_section; /* Section for image_ptr. */
- unsigned char *image_ptr; /* A pointer to section->contents. */
-
- unsigned char pdsc[8]; /* Procedure descriptor. */
-
- /* Output routine storage. */
- unsigned char *output_buf; /* Output data. */
- int push_level;
- int pushed_size;
- int length_pos;
- int output_size;
- int output_alignment;
-
- /* Linkage index counter
- used by conditional store commands (TIR_S_C_STC_). */
- int vms_linkage_index;
-
- /* see tc-alpha.c of gas for a descripton. */
- int flag_hash_long_names; /* -+, hash instead of truncate. */
- int flag_show_after_trunc; /* -H, shw hashing/truncation. */
-};
-
-#define PRIV(name) ((struct vms_private_data_struct *) abfd->tdata.any)->name
-
+ struct bfd_symbol **symcache;
+ int symnum;
+
+ asection *image_section; /* section for image_ptr */
+ unsigned char *image_ptr; /* a pointer to section->contents */
+
+ unsigned char pdsc[8]; /* procedure descriptor */
+
+ struct module *modules; /* list of all compilation units */
+
+ struct dst_info *dst_info;
+ asection *dst_section;
+ unsigned char *dst_ptr_end;
+ unsigned int dst_ptr_offsets_count; /* # of offsets in following array */
+ unsigned int *dst_ptr_offsets; /* array of saved image_ptr offsets */
+
+ /* Shared library support */
+ bfd_vma symvva; /* relative virtual address of symbol vector */
+
+ /* Output routine storage */
+ unsigned char *output_buf; /* output data */
+ int push_level;
+ int pushed_size;
+ int length_pos;
+ int output_size;
+ int output_alignment;
+
+ /* linkage index counter used by conditional store commands */
+ int vms_linkage_index;
+
+ /* see tc-alpha.c of gas for a description. */
+ int flag_hash_long_names; /* -+, hash instead of truncate */
+ int flag_show_after_trunc; /* -H, show hashing/truncation */
+};
+
+#define PRIV(name) ((struct vms_private_data_struct *)abfd->tdata.any)->name
+
+/* Used to keep extra VMS specific information for a given section.
+
+ reloc_size holds the size of the relocation stream, note this
+ is very different from the number of relocations as VMS relocations
+ are variable length.
+
+ reloc_stream is the actual stream of relocation entries. */
+
+struct vms_section_data_struct
+{
+ bfd_size_type reloc_size;
+ unsigned char *reloc_stream;
+ bfd_size_type reloc_offset;
+ flagword vflags;
+};
+
+#define vms_section_data(sec) \
+ ((struct vms_section_data_struct *)sec->used_by_bfd)
+
+struct evax_private_udata_struct
+{
+ asymbol *bsym;
+ asymbol *enbsym;
+ char *origname;
+ int lkindex;
+};
+
#define SECTION_NAME_TEMPLATE "__SEC__%d"
#if VMS_DEBUG
@@ -635,7 +866,6 @@ extern char * _bfd_vms_save_sized_string (unsigned char *, int);
extern char * _bfd_vms_save_counted_string (unsigned char *);
extern void _bfd_vms_push (bfd *, uquad, int);
extern uquad _bfd_vms_pop (bfd *, int *);
-extern bfd_boolean _bfd_save_vms_section (bfd *, asection *, const void *, file_ptr, bfd_size_type);
extern void _bfd_vms_output_begin (bfd *, int, int);
extern void _bfd_vms_output_alignment (bfd *, int);
extern void _bfd_vms_output_push (bfd *);
@@ -653,4 +883,7 @@ extern void _bfd_vms_output_fill (bfd *, int, int);
extern char * _bfd_vms_length_hash_symbol (bfd *, const char *, int);
extern vms_symbol_entry * _bfd_vms_enter_symbol (bfd *, char *);
+#define EGPS_S_V_NO_SHIFT 16
+
+extern void bfd_vms_set_section_flags (bfd *, asection *, flagword);
#endif /* VMS_H */