Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6399 → Rev 6400

/contrib/toolchain/avra/src/coff.h
0,0 → 1,403
//
// coff.h - Common Object File Format (COFF) support
//
// This file was developed for the avra assembler in order to produce COFF output files
// for use with the Atmel AVR Studio. The Lean C Compiler (LCC) debugging stabs
// output was used as input to the assembler.
//
// This software has absolutely no warrantee! The money you paid for this will be
// promptly refunded if not fully satisfied.
//
// Beta release 1/20/2000 by Bob Harris
//
// This software has not been fully tested and probably has a few software deficiencies.
// Some software support may be possible by sending a problem description report to
// rth@mclean.sparta.com
 
#define MAGIC_NUMBER_AVR 0xa12
 
#define N_GSYM 0x20 /* global symbol: name,,0,type,0 */
#define N_FNAME 0x22 /* procedure name (f77 kludge): name,,0 */
#define N_FUN 0x24 /* procedure: name,,0,linenumber,address */
#define N_STSYM 0x26 /* static symbol: name,,0,type,address */
#define N_LCSYM 0x28 /* .lcomm symbol: name,,0,type,address */
#define N_MAIN 0x2a /* name of main routine : name,,0,0,0 */
#define N_ROSYM 0x2c /* ro_data objects */
#define N_OBJ 0x38 /* object file path or name */
#define N_OPT 0x3c /* compiler options */
#define N_RSYM 0x40 /* register sym: name,,0,type,register */
#define N_SLINE 0x44 /* src line: 0,,0,linenumber,address */
#define N_FLINE 0x4c /* function start.end */
#define N_SSYM 0x60 /* structure elt: name,,0,type,struct_offset */
#define N_ENDM 0x62 /* last stab emitted for module */
#define N_SO 0x64 /* source file name: name,,0,0,address */
#define N_LSYM 0x80 /* local sym: name,,0,type,offset */
#define N_BINCL 0x82 /* header file: name,,0,0,0 */
#define N_SOL 0x84 /* #included file name: name,,0,0,address */
#define N_PSYM 0xa0 /* parameter: name,,0,type,offset */
#define N_EINCL 0xa2 /* end of include file */
#define N_ENTRY 0xa4 /* alternate entry: name,linenumber,address */
#define N_LBRAC 0xc0 /* left bracket: 0,,0,nesting level,address */
#define N_EXCL 0xc2 /* excluded include file */
#define N_RBRAC 0xe0 /* right bracket: 0,,0,nesting level,address */
#define N_BCOMM 0xe2 /* begin common: name,, */
#define N_ECOMM 0xe4 /* end common: name,, */
#define N_ECOML 0xe8 /* end common (local name): ,,address */
#define N_LENG 0xfe /* second stab entry with length information */
 
 
/*
* Type of a symbol, in low N bits of the word
*/
#define T_NULL 0
#define T_VOID 1 /* function argument (only used by compiler) */
#define T_CHAR 2 /* character */
#define T_SHORT 3 /* short integer */
#define T_INT 4 /* integer */
#define T_LONG 5 /* long integer */
#define T_FLOAT 6 /* floating point */
#define T_DOUBLE 7 /* double word */
#define T_STRUCT 8 /* structure */
#define T_UNION 9 /* union */
#define T_ENUM 10 /* enumeration */
#define T_MOE 11 /* member of enumeration*/
#define T_UCHAR 12 /* unsigned character */
#define T_USHORT 13 /* unsigned short */
#define T_UINT 14 /* unsigned integer */
#define T_ULONG 15 /* unsigned long */
#define T_LNGDBL 16 /* long double */
 
/*
* derived types, in n_type
*/
#define DT_NON (0) /* no derived type */
#define DT_PTR (1) /* pointer */
#define DT_FCN (2) /* function */
#define DT_ARY (3) /* array */
 
struct external_filehdr {
unsigned short f_magic; /* magic number */
unsigned short f_nscns; /* number of sections */
unsigned long f_timdat; /* time & date stamp */
unsigned long f_symptr; /* file pointer to symtab */
unsigned long f_nsyms; /* number of symtab entries */
unsigned short f_opthdr; /* sizeof(optional hdr) */
unsigned short f_flags; /* flags */
};
 
/* Bits for f_flags:
* F_RELFLG relocation info stripped from file
* F_EXEC file is executable (no unresolved external references)
* F_LNNO line numbers stripped from file
* F_LSYMS local symbols stripped from file
* F_AR32WR file has byte ordering of an AR32WR machine (e.g. vax)
*/
 
#define F_RELFLG (0x0001)
#define F_EXEC (0x0002)
#define F_LNNO (0x0004)
#define F_LSYMS (0x0008)
 
/*********************************************************************/
struct external_scnhdr {
char s_name[8]; /* section name */
unsigned long s_paddr; /* physical address, aliased s_nlib */
unsigned long s_vaddr; /* virtual address */
unsigned long s_size; /* section size */
unsigned long s_scnptr; /* file ptr to raw data for section */
unsigned long s_relptr; /* file ptr to relocation */
unsigned long s_lnnoptr; /* file ptr to line numbers */
unsigned short s_nreloc; /* number of relocation entries */
unsigned short s_nlnno; /* number of line number entries*/
unsigned long s_flags; /* flags */
};
 
#define SCNHDR struct external_scnhdr
#define SCNHSZ sizeof(SCNHDR)
 
/*
* names of "special" sections
*/
#define _TEXT ".text"
#define _DATA ".data"
#define _BSS ".bss"
#define _COMMENT ".comment"
#define _LIB ".lib"
 
/*
* s_flags "type"
*/
#define STYP_TEXT (0x0020) /* section contains text only */
#define STYP_DATA (0x0040) /* section contains data only */
#define STYP_BSS (0x0080) /* section contains bss only */
 
 
/*********************************************************************/
 
struct lineno
{
union
{
long l_symndx; /* symtbl index of func name */
long l_paddr; /* paddr of line number */
} l_addr;
unsigned short l_lnno; /* line number */
};
 
#define LINENO struct lineno
#define LINESZ 6
 
 
 
#define N_UNDEF ((short)0) /* undefined symbol */
#define N_ABS ((short)-1) /* value of symbol is absolute */
#define N_DEBUG ((short)-2) /* debugging symbol -- value is meaningless */
 
/********************** STORAGE CLASSES **********************/
 
/* This used to be defined as -1, but now n_sclass is unsigned. */
#define C_EFCN 0xff /* physical end of function */
#define C_NULL 0
#define C_AUTO 1 /* automatic variable */
#define C_EXT 2 /* external symbol */
#define C_STAT 3 /* static */
#define C_REG 4 /* register variable */
#define C_EXTDEF 5 /* external definition */
#define C_LABEL 6 /* label */
#define C_ULABEL 7 /* undefined label */
#define C_MOS 8 /* member of structure */
#define C_ARG 9 /* function argument */
#define C_STRTAG 10 /* structure tag */
#define C_MOU 11 /* member of union */
#define C_UNTAG 12 /* union tag */
#define C_TPDEF 13 /* type definition */
#define C_USTATIC 14 /* undefined static */
#define C_ENTAG 15 /* enumeration tag */
#define C_MOE 16 /* member of enumeration */
#define C_REGPARM 17 /* register parameter */
#define C_FIELD 18 /* bit field */
#define C_AUTOARG 19 /* auto argument */
#define C_LASTENT 20 /* dummy entry (end of block) */
#define C_BLOCK 100 /* ".bb" or ".eb" */
#define C_FCN 101 /* ".bf" or ".ef" */
#define C_EOS 102 /* end of structure */
#define C_FILE 103 /* file name */
#define C_LINE 104 /* line # reformatted as symbol table entry */
#define C_ALIAS 105 /* duplicate tag */
#define C_HIDDEN 106 /* ext symbol in dmert public lib */
 
#define E_SYMNMLEN 8 /* # characters in a symbol name */
#define E_FILNMLEN 14 /* # characters in a file name */
#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */
 
struct syment
{
union
{
char _n_name[E_SYMNMLEN]; /* symbol name*/
struct
{
long _n_zeroes; /* symbol name */
 
long _n_offset; /* location in string table */
} _n_n;
char *_n_nptr[2]; /* allows overlaying */
} _n;
unsigned long n_value; /* value of symbol */
 
short n_scnum; /* section number */
 
unsigned short n_type; /* type and derived */
 
char n_sclass; /* storage class */
 
char n_numaux; /* number of aux entries */
};
 
#define n_name _n._n_name
#define n_zeroes _n._n_n._n_zeroes
#define n_offset _n._n_n._n_offset
#define n_nptr _n._n_nptr[1]
 
#define SYMNMLEN 8
#define SYMESZ 18 /* size of a symbol table entry */
 
union auxent
{
struct
{
long x_tagndx;
union
{
struct
{
unsigned short x_lnno;
unsigned short x_size;
} x_lnsz;
long x_fsize;
} x_misc;
union
{
struct
{
long x_lnnoptr;
long x_endndx;
} x_fcn;
struct
{
unsigned short x_dimen[E_DIMNUM];
} x_ary;
} x_fcnary;
unsigned short x_tvndx;
} x_sym;
union
{
char x_fname[E_FILNMLEN];
struct {
unsigned long x_zeroes;
unsigned long x_offset;
} x_n;
} x_file;
struct
{
long x_scnlen;
unsigned short x_nreloc;
unsigned short x_nlinno;
} x_scn;
struct
{
long x_tvfill;
unsigned short x_tvlen;
unsigned short x_tvran[2];
} x_tv;
};
 
#define FILNMLEN 14
#define DIMNUM 4
#define AUXENT union auxent
#define AUXESZ 18
 
 
/* Coff additions */
typedef struct ListNodeTag{
struct ListNodeTag *Next; /* Double Linked List */
struct ListNodeTag *Last; /* Double Linked List */
void *pObject; /* points to list object */
unsigned long Size;
int FileNumber; /* corresponds to individual file(s) */
} LISTNODE;
 
//#define LISTNODE struct ListNodeTag;
 
typedef struct ListNodeHeadTag {
LISTNODE Node;
// struct ListNodeTag *Next; /* Double Linked List */
// struct ListNodeTag *Last; /* Double Linked List */
int TotalBytes; /* size of allocated object(s) */
int TotalItems; /* number of allocated objects */
LISTNODE *current; /* pointer for FindFirst/FindNext */
} LISTNODEHEAD ;
 
 
typedef struct {
unsigned short StabType;
unsigned short CoffType;
unsigned short ByteSize;
unsigned short Line; /* used by arrays */
unsigned short Dimensions[6]; /* used by arrays */
} STABCOFFMAP;
 
struct coff_info {
 
int CurrentFileNumber;
int FunctionStartLine; /* used in Line number table */
int CurrentSourceLine;
 
/* Internal */
unsigned char *pRomMemory; /* 16 bit wide words/addresses */
unsigned char *pEEPRomMemory; /* 8 bit wide words/addresses */
int MaxRomAddress;
int MaxEepromAddress;
int NeedLineNumberFixup;
int GlobalStartAddress;
int GlobalEndAddress;
LISTNODEHEAD ListOfSplitLines;
 
/* External */
struct external_filehdr FileHeader; /* Only one of these per output file */
LISTNODEHEAD ListOfSectionHeaders; /* .text, .bss */
LISTNODEHEAD ListOfRawData; /* Program, EEPROM */
LISTNODEHEAD ListOfRelocations; /* Not used now */
LISTNODEHEAD ListOfLineNumbers;
LISTNODEHEAD ListOfSymbols;
LISTNODEHEAD ListOfGlobals;
LISTNODEHEAD ListOfSpecials;
LISTNODEHEAD ListOfUndefined;
LISTNODEHEAD ListOfStrings;
LISTNODEHEAD ListOfTypes;
};
 
#if 0 /* defined in avra.h */
 
FILE *open_coff_file(struct prog_info *pi, char *filename);
void write_coff_file(struct prog_info *pi);
void write_coff_eeprom( struct prog_info *pi, int address, unsigned char data);
void write_coff_program( struct prog_info *pi, int address, unsigned char data);
void close_coff_file(struct prog_info *pi, FILE *fp);
int parse_stabs( struct prog_info *pi, char *p );
int parse_stabn( struct prog_info *pi, char *p );
 
#endif
 
/**************************************************************/
/*********** Internal Routines ********************************/
/**************************************************************/
int stab_add_lineno( struct prog_info *pi, int LineNumber, char *pLabel, char *pFunction );
int stab_add_lbracket( struct prog_info *pi, int Level, char *pLabel, char *pFunction );
int stab_add_rbracket( struct prog_info *pi, int Level, char *pLabel, char *pFunction );
int stab_add_filename( char *pName, char *pLabel );
int stab_add_function( struct prog_info *pi, char *pName, char *pLabel );
int stab_add_global( struct prog_info *pi, char *pName, char *pType );
int stab_add_local( struct prog_info *pi, char *pName, char *pType, char *pOffset );
int stab_add_parameter_symbol( struct prog_info *pi, char *pName, char *pType, char *pOffset );
int stab_add_static_symbol( struct prog_info *pi, char *pName, char *pType, char *pLabel );
int stab_add_local_register( struct prog_info *pi, char *pName, char *pType, char *pRegister );
int stab_add_local_type( char *pString, char *pType );
int stab_add_tag_type( char *pName, char *pDesciptor );
 
int GetStabType( char *p, unsigned short *pType, char **pEnd );
int AddNameToEntry( char *pName, struct syment *pEntry );
int GetArrayType( char *p, char **pEnd, STABCOFFMAP *pMap, unsigned short *DerivedBits, int ExtraLevels );
int GetEnumTagItem( char *p, char **pEnd, char **pEnumName, int *pEnumValue );
int GetStructUnionTagItem( char *p, char **pEnd, char **pName, unsigned short *pType, unsigned short *pBitOffset, unsigned short *pBitSize);
int GetStringDelimiters( char *pString, char **pTokens, int MaxTokens );
int SetupDefinedType( unsigned short Type, STABCOFFMAP *pMap, unsigned short *DerivedBits, int ExtraLevels );
int GetArrayDefinitions( STABCOFFMAP *pMap , char *pMinIndex, char *pMaxIndex, char *pType, unsigned short *DerivedBits, int ExtraLevels );
int GetInternalType( char *pName, STABCOFFMAP *pMap );
unsigned short GetCoffType( unsigned short StabType );
unsigned short GetCoffTypeSize( unsigned short StabType );
int CopyStabCoffMap( unsigned short StabType, STABCOFFMAP *pMap );
int IsTypeArray( unsigned short CoffType );
void AddArrayAuxInfo( union auxent *pAux, unsigned short SymbolIndex, STABCOFFMAP *pMap );
int GetSubRangeType( unsigned short Type, STABCOFFMAP *pMap , char *pLow, char *pHigh );
char *SkipPastDigits( char *p );
int GetDigitLength( char *p );
 
/****************************************************************************************/
/* List management routines */
/****************************************************************************************/
 
void InitializeList( LISTNODEHEAD *pNode );
void *AllocateTwoListObjects( LISTNODEHEAD *pHead, int size );
void *AllocateListObject( LISTNODEHEAD *pHead, int size );
LISTNODE *AllocateListNode( void *pObject, int size );
void AddNodeToList( LISTNODEHEAD *pHead, LISTNODE *pNode );
void *FindFirstListObject( LISTNODEHEAD *pHead );
void *FindNextListObject( LISTNODEHEAD *pHead );
LISTNODE *GetCurrentNode( LISTNODEHEAD *pHead );
void *GetCurrentListObject( LISTNODEHEAD *pHead );
void *FindLastListObject( LISTNODEHEAD *pHead );
void *FindNextLastListObject( LISTNODEHEAD *pHead );
void FreeList( LISTNODEHEAD *pHead );
LISTNODE *AddListObject(LISTNODEHEAD *pHead, void *pObject, int size );