]> oss.titaniummirror.com Git - msp430-binutils.git/blobdiff - bfd/vms.h
Imported binutils-2.20
[msp430-binutils.git] / bfd / vms.h
index 223554086cf8f3550e212d507efc781101ec0f8c..0d6e21557cd878db9d8184e83106c049cd4c9d28 100644 (file)
--- 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, 2006, 2007,
+   2008, 2009 Free Software Foundation, Inc.
+
+   Main header file.
 
    Written by Klaus K"ampf (kkaempf@rmi.de)
 
 #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
 #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.             */
 #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
 #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
 #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
 #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
 #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
 #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
 #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
 #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.  */
 #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
 /* 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 */