Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. //
  2. // coff.h - Common Object File Format (COFF) support
  3. //
  4. //      This file was developed for the avra assembler in order to produce COFF output files
  5. //      for use with the Atmel AVR Studio.  The Lean C Compiler (LCC) debugging stabs
  6. //      output was used as input to the assembler.
  7. //
  8. //      This software has absolutely no warrantee!  The money you paid for this will be
  9. //      promptly refunded if not fully satisfied.
  10. //
  11. //      Beta release 1/20/2000 by Bob Harris
  12. //
  13. //      This software has not been fully tested and probably has a few software deficiencies.
  14. //      Some software support may be possible by sending a problem description report to
  15. //      rth@mclean.sparta.com
  16.  
  17. #define MAGIC_NUMBER_AVR   0xa12
  18.  
  19. #define N_GSYM  0x20            /* global symbol: name,,0,type,0 */
  20. #define N_FNAME 0x22            /* procedure name (f77 kludge): name,,0 */
  21. #define N_FUN   0x24            /* procedure: name,,0,linenumber,address */
  22. #define N_STSYM 0x26            /* static symbol: name,,0,type,address */
  23. #define N_LCSYM 0x28            /* .lcomm symbol: name,,0,type,address */
  24. #define N_MAIN  0x2a            /* name of main routine : name,,0,0,0 */
  25. #define N_ROSYM 0x2c            /* ro_data objects */
  26. #define N_OBJ   0x38            /* object file path or name */
  27. #define N_OPT   0x3c            /* compiler options */
  28. #define N_RSYM  0x40            /* register sym: name,,0,type,register */
  29. #define N_SLINE 0x44            /* src line: 0,,0,linenumber,address */
  30. #define N_FLINE 0x4c            /* function start.end */
  31. #define N_SSYM  0x60            /* structure elt: name,,0,type,struct_offset */
  32. #define N_ENDM  0x62            /* last stab emitted for module */
  33. #define N_SO    0x64            /* source file name: name,,0,0,address */
  34. #define N_LSYM  0x80            /* local sym: name,,0,type,offset */
  35. #define N_BINCL 0x82            /* header file: name,,0,0,0 */
  36. #define N_SOL   0x84            /* #included file name: name,,0,0,address */
  37. #define N_PSYM  0xa0            /* parameter: name,,0,type,offset */
  38. #define N_EINCL 0xa2            /* end of include file */
  39. #define N_ENTRY 0xa4            /* alternate entry: name,linenumber,address */
  40. #define N_LBRAC 0xc0            /* left bracket: 0,,0,nesting level,address */
  41. #define N_EXCL  0xc2            /* excluded include file */
  42. #define N_RBRAC 0xe0            /* right bracket: 0,,0,nesting level,address */
  43. #define N_BCOMM 0xe2            /* begin common: name,, */
  44. #define N_ECOMM 0xe4            /* end common: name,, */
  45. #define N_ECOML 0xe8            /* end common (local name): ,,address */
  46. #define N_LENG  0xfe            /* second stab entry with length information */
  47.  
  48.  
  49. /*
  50.  * Type of a symbol, in low N bits of the word
  51.  */
  52. #define T_NULL          0
  53. #define T_VOID          1       /* function argument (only used by compiler) */
  54. #define T_CHAR          2       /* character            */
  55. #define T_SHORT         3       /* short integer        */
  56. #define T_INT           4       /* integer              */
  57. #define T_LONG          5       /* long integer         */
  58. #define T_FLOAT         6       /* floating point       */
  59. #define T_DOUBLE        7       /* double word          */
  60. #define T_STRUCT        8       /* structure            */
  61. #define T_UNION         9       /* union                */
  62. #define T_ENUM          10      /* enumeration          */
  63. #define T_MOE           11      /* member of enumeration*/
  64. #define T_UCHAR         12      /* unsigned character   */
  65. #define T_USHORT        13      /* unsigned short       */
  66. #define T_UINT          14      /* unsigned integer     */
  67. #define T_ULONG         15      /* unsigned long        */
  68. #define T_LNGDBL        16      /* long double          */
  69.  
  70. /*
  71.  * derived types, in n_type
  72. */
  73. #define DT_NON          (0)     /* no derived type */
  74. #define DT_PTR          (1)     /* pointer */
  75. #define DT_FCN          (2)     /* function */
  76. #define DT_ARY          (3)     /* array */
  77.  
  78. struct external_filehdr {
  79.         unsigned short f_magic;         /* magic number                 */
  80.         unsigned short f_nscns;         /* number of sections           */
  81.         unsigned long f_timdat; /* time & date stamp            */
  82.         unsigned long f_symptr; /* file pointer to symtab       */
  83.         unsigned long f_nsyms;          /* number of symtab entries     */
  84.         unsigned short f_opthdr;        /* sizeof(optional hdr)         */
  85.         unsigned short f_flags;         /* flags                        */
  86. };
  87.  
  88. /* Bits for f_flags:
  89.  *      F_RELFLG        relocation info stripped from file
  90.  *      F_EXEC          file is executable (no unresolved external references)
  91.  *      F_LNNO          line numbers stripped from file
  92.  *      F_LSYMS         local symbols stripped from file
  93.  *      F_AR32WR        file has byte ordering of an AR32WR machine (e.g. vax)
  94.  */
  95.  
  96. #define F_RELFLG        (0x0001)
  97. #define F_EXEC          (0x0002)
  98. #define F_LNNO          (0x0004)
  99. #define F_LSYMS         (0x0008)
  100.  
  101. /*********************************************************************/
  102. struct external_scnhdr {
  103.         char            s_name[8];      /* section name                 */
  104.         unsigned long           s_paddr;        /* physical address, aliased s_nlib */
  105.         unsigned long           s_vaddr;        /* virtual address              */
  106.         unsigned long           s_size;         /* section size                 */
  107.         unsigned long           s_scnptr;       /* file ptr to raw data for section */
  108.         unsigned long           s_relptr;       /* file ptr to relocation       */
  109.         unsigned long           s_lnnoptr;      /* file ptr to line numbers     */
  110.         unsigned short          s_nreloc;       /* number of relocation entries */
  111.         unsigned short          s_nlnno;        /* number of line number entries*/
  112.         unsigned long           s_flags;        /* flags                        */
  113. };
  114.  
  115. #define SCNHDR  struct external_scnhdr
  116. #define SCNHSZ  sizeof(SCNHDR)
  117.  
  118. /*
  119.  * names of "special" sections
  120.  */
  121. #define _TEXT   ".text"
  122. #define _DATA   ".data"
  123. #define _BSS    ".bss"
  124. #define _COMMENT ".comment"
  125. #define _LIB ".lib"
  126.  
  127. /*
  128.  * s_flags "type"
  129.  */
  130. #define STYP_TEXT        (0x0020)       /* section contains text only */
  131. #define STYP_DATA        (0x0040)       /* section contains data only */
  132. #define STYP_BSS         (0x0080)       /* section contains bss only */
  133.  
  134.  
  135. /*********************************************************************/
  136.  
  137. struct lineno
  138. {
  139.    union
  140.    {
  141.              long  l_symndx;  /* symtbl index of func name */
  142.              long  l_paddr;   /* paddr of line number */
  143.    } l_addr;
  144.    unsigned short  l_lnno;    /* line number */
  145. };
  146.  
  147. #define LINENO      struct lineno
  148. #define LINESZ      6
  149.  
  150.  
  151.  
  152. #define N_UNDEF ((short)0)      /* undefined symbol */
  153. #define N_ABS   ((short)-1)     /* value of symbol is absolute */
  154. #define N_DEBUG ((short)-2)     /* debugging symbol -- value is meaningless */
  155.  
  156. /********************** STORAGE CLASSES **********************/
  157.  
  158. /* This used to be defined as -1, but now n_sclass is unsigned.  */
  159. #define C_EFCN          0xff    /* physical end of function     */
  160. #define C_NULL          0
  161. #define C_AUTO          1       /* automatic variable           */
  162. #define C_EXT           2       /* external symbol              */
  163. #define C_STAT          3       /* static                       */
  164. #define C_REG           4       /* register variable            */
  165. #define C_EXTDEF        5       /* external definition          */
  166. #define C_LABEL         6       /* label                        */
  167. #define C_ULABEL        7       /* undefined label              */
  168. #define C_MOS           8       /* member of structure          */
  169. #define C_ARG           9       /* function argument            */
  170. #define C_STRTAG        10      /* structure tag                */
  171. #define C_MOU           11      /* member of union              */
  172. #define C_UNTAG         12      /* union tag                    */
  173. #define C_TPDEF         13      /* type definition              */
  174. #define C_USTATIC       14      /* undefined static             */
  175. #define C_ENTAG         15      /* enumeration tag              */
  176. #define C_MOE           16      /* member of enumeration        */
  177. #define C_REGPARM       17      /* register parameter           */
  178. #define C_FIELD         18      /* bit field                    */
  179. #define C_AUTOARG       19      /* auto argument                */
  180. #define C_LASTENT       20      /* dummy entry (end of block)   */
  181. #define C_BLOCK         100     /* ".bb" or ".eb"               */
  182. #define C_FCN           101     /* ".bf" or ".ef"               */
  183. #define C_EOS           102     /* end of structure             */
  184. #define C_FILE          103     /* file name                    */
  185. #define C_LINE          104     /* line # reformatted as symbol table entry */
  186. #define C_ALIAS         105     /* duplicate tag                */
  187. #define C_HIDDEN        106     /* ext symbol in dmert public lib */
  188.  
  189. #define E_SYMNMLEN      8       /* # characters in a symbol name        */
  190. #define E_FILNMLEN      14      /* # characters in a file name          */
  191. #define E_DIMNUM        4       /* # array dimensions in auxiliary entry */
  192.  
  193. struct syment
  194. {
  195.   union
  196.   {
  197.       char          _n_name[E_SYMNMLEN];  /* symbol name*/
  198.       struct
  199.       {
  200.             long    _n_zeroes;          /* symbol name */
  201.  
  202.             long    _n_offset;          /* location in string table */
  203.       } _n_n;
  204.       char          *_n_nptr[2];        /* allows overlaying */
  205.   } _n;
  206.   unsigned long     n_value;            /* value of symbol */
  207.  
  208.   short             n_scnum;            /* section number */
  209.  
  210.   unsigned short    n_type;             /* type and derived */
  211.  
  212.   char              n_sclass;           /* storage class */
  213.  
  214.   char              n_numaux;           /* number of aux entries */
  215. };
  216.  
  217. #define  n_name          _n._n_name
  218. #define  n_zeroes        _n._n_n._n_zeroes
  219. #define  n_offset        _n._n_n._n_offset
  220. #define  n_nptr          _n._n_nptr[1]
  221.  
  222. #define  SYMNMLEN  8
  223. #define  SYMESZ    18                    /* size of a symbol table entry */
  224.  
  225. union auxent
  226. {
  227.      struct
  228.      {
  229.            long   x_tagndx;
  230.            union
  231.            {
  232.                struct
  233.                {
  234.                      unsigned short   x_lnno;
  235.                      unsigned short   x_size;
  236.                } x_lnsz;
  237.                long    x_fsize;
  238.            } x_misc;
  239.            union
  240.            {
  241.                struct
  242.                {
  243.                      long    x_lnnoptr;
  244.                      long    x_endndx;
  245.                } x_fcn;
  246.                struct
  247.                {
  248.                      unsigned short   x_dimen[E_DIMNUM];
  249.                } x_ary;
  250.            } x_fcnary;
  251.            unsigned short   x_tvndx;
  252.        } x_sym;
  253.        union
  254.        {
  255.            char   x_fname[E_FILNMLEN];
  256.                         struct {
  257.                                 unsigned long x_zeroes;
  258.                                 unsigned long x_offset;
  259.                         } x_n;
  260.        } x_file;
  261.        struct
  262.        {
  263.            long   x_scnlen;
  264.            unsigned short   x_nreloc;
  265.            unsigned short   x_nlinno;
  266.        } x_scn;
  267.        struct
  268.        {
  269.            long   x_tvfill;
  270.            unsigned short   x_tvlen;
  271.            unsigned short   x_tvran[2];
  272.        } x_tv;
  273. };
  274.  
  275. #define FILNMLEN  14
  276. #define DIMNUM    4
  277. #define AUXENT    union auxent
  278. #define AUXESZ    18
  279.  
  280.  
  281. /* Coff additions */
  282. typedef struct ListNodeTag{
  283.         struct ListNodeTag *Next;       /* Double Linked List */
  284.         struct ListNodeTag *Last;       /* Double Linked List */
  285.         void *pObject;  /* points to list object */    
  286.         unsigned long Size;
  287.         int FileNumber;         /* corresponds to individual file(s) */
  288. } LISTNODE;
  289.  
  290. //#define LISTNODE struct ListNodeTag;
  291.  
  292. typedef struct ListNodeHeadTag {
  293.         LISTNODE Node;
  294. //      struct ListNodeTag *Next;       /* Double Linked List */
  295. //      struct ListNodeTag *Last;       /* Double Linked List */
  296.         int TotalBytes; /* size of allocated object(s) */
  297.         int TotalItems; /* number of allocated objects */
  298.         LISTNODE *current;      /* pointer for FindFirst/FindNext */
  299. } LISTNODEHEAD ;
  300.  
  301.  
  302. typedef struct  {
  303.         unsigned short StabType;
  304.         unsigned short CoffType;
  305.         unsigned short ByteSize;
  306.         unsigned short Line;    /* used by arrays */
  307.         unsigned short Dimensions[6]; /* used by arrays */
  308. } STABCOFFMAP;
  309.  
  310. struct coff_info {
  311.  
  312.         int CurrentFileNumber;
  313.         int FunctionStartLine;  /* used in Line number table */
  314.         int CurrentSourceLine;
  315.  
  316.         /* Internal */
  317.         unsigned char *pRomMemory;      /* 16 bit wide words/addresses */
  318.         unsigned char *pEEPRomMemory;   /* 8 bit wide words/addresses */
  319.    int MaxRomAddress;
  320.    int MaxEepromAddress;
  321.    int NeedLineNumberFixup;
  322.    int GlobalStartAddress;
  323.    int GlobalEndAddress;
  324.    LISTNODEHEAD ListOfSplitLines;
  325.  
  326.         /* External */
  327.         struct external_filehdr FileHeader;             /* Only one of these per output file */
  328.         LISTNODEHEAD ListOfSectionHeaders;      /* .text, .bss */
  329.         LISTNODEHEAD ListOfRawData;                     /* Program, EEPROM */
  330.         LISTNODEHEAD ListOfRelocations;         /* Not used now */
  331.         LISTNODEHEAD ListOfLineNumbers;
  332.         LISTNODEHEAD ListOfSymbols;
  333.         LISTNODEHEAD ListOfGlobals;
  334.         LISTNODEHEAD ListOfSpecials;
  335.         LISTNODEHEAD ListOfUndefined;
  336.         LISTNODEHEAD ListOfStrings;
  337.         LISTNODEHEAD ListOfTypes;
  338. };
  339.  
  340. #if 0 /* defined in avra.h */
  341.  
  342. FILE *open_coff_file(struct prog_info *pi, char *filename);
  343. void write_coff_file(struct prog_info *pi);
  344. void write_coff_eeprom( struct prog_info *pi, int address, unsigned char data);
  345. void write_coff_program( struct prog_info *pi, int address, unsigned char data);
  346. void close_coff_file(struct prog_info *pi, FILE *fp);
  347. int parse_stabs( struct prog_info *pi, char *p );
  348. int parse_stabn( struct prog_info *pi, char *p );
  349.  
  350. #endif
  351.  
  352. /**************************************************************/
  353. /*********** Internal Routines ********************************/
  354. /**************************************************************/
  355. int stab_add_lineno(  struct prog_info *pi, int LineNumber, char *pLabel, char *pFunction );
  356. int stab_add_lbracket( struct prog_info *pi, int Level, char *pLabel, char *pFunction );
  357. int stab_add_rbracket( struct prog_info *pi, int Level, char *pLabel, char *pFunction );
  358. int stab_add_filename( char *pName, char *pLabel );
  359. int stab_add_function( struct prog_info *pi, char *pName, char *pLabel );
  360. int stab_add_global( struct prog_info *pi, char *pName, char *pType );
  361. int stab_add_local(  struct prog_info *pi, char *pName, char *pType, char *pOffset  );
  362. int stab_add_parameter_symbol( struct prog_info *pi, char *pName, char *pType, char *pOffset  );
  363. int stab_add_static_symbol(  struct prog_info *pi, char *pName, char *pType, char *pLabel  );
  364. int stab_add_local_register(  struct prog_info *pi, char *pName, char *pType, char *pRegister  );
  365. int stab_add_local_type( char *pString, char *pType );
  366. int stab_add_tag_type( char *pName, char *pDesciptor );
  367.  
  368. int GetStabType( char *p, unsigned short *pType, char **pEnd );
  369. int AddNameToEntry( char *pName, struct syment *pEntry );
  370. int GetArrayType( char *p, char **pEnd, STABCOFFMAP *pMap, unsigned short *DerivedBits, int ExtraLevels );
  371. int GetEnumTagItem( char *p, char **pEnd, char **pEnumName, int *pEnumValue );
  372. int GetStructUnionTagItem( char *p, char **pEnd, char **pName, unsigned short *pType, unsigned short *pBitOffset, unsigned short *pBitSize);
  373. int GetStringDelimiters( char *pString, char **pTokens, int MaxTokens );
  374. int SetupDefinedType( unsigned short Type, STABCOFFMAP *pMap, unsigned short *DerivedBits, int ExtraLevels );
  375. int GetArrayDefinitions( STABCOFFMAP *pMap , char *pMinIndex, char *pMaxIndex, char *pType, unsigned short *DerivedBits, int ExtraLevels );
  376. int GetInternalType( char *pName, STABCOFFMAP *pMap );
  377. unsigned short GetCoffType( unsigned short StabType );
  378. unsigned short GetCoffTypeSize( unsigned short StabType );
  379. int CopyStabCoffMap( unsigned short StabType, STABCOFFMAP *pMap );
  380. int IsTypeArray( unsigned short CoffType );
  381. void AddArrayAuxInfo( union auxent *pAux, unsigned short SymbolIndex, STABCOFFMAP *pMap );
  382. int GetSubRangeType( unsigned short Type, STABCOFFMAP *pMap , char *pLow, char *pHigh );
  383. char *SkipPastDigits( char *p );
  384. int GetDigitLength( char *p );
  385.  
  386. /****************************************************************************************/
  387. /* List management routines */
  388. /****************************************************************************************/
  389.  
  390. void InitializeList( LISTNODEHEAD *pNode );
  391. void *AllocateTwoListObjects( LISTNODEHEAD *pHead, int size );
  392. void *AllocateListObject( LISTNODEHEAD *pHead, int size );
  393. LISTNODE *AllocateListNode( void *pObject, int size );
  394. void AddNodeToList( LISTNODEHEAD *pHead, LISTNODE *pNode );
  395. void *FindFirstListObject( LISTNODEHEAD *pHead );
  396. void *FindNextListObject( LISTNODEHEAD *pHead );
  397. LISTNODE *GetCurrentNode( LISTNODEHEAD *pHead );
  398. void *GetCurrentListObject( LISTNODEHEAD *pHead );
  399. void *FindLastListObject( LISTNODEHEAD *pHead );
  400. void *FindNextLastListObject( LISTNODEHEAD *pHead );
  401. void FreeList( LISTNODEHEAD *pHead );
  402. LISTNODE  *AddListObject(LISTNODEHEAD *pHead, void *pObject, int size );
  403.  
  404.