ti.h revision 77298
177298Sobrien/* COFF information for TI COFF support. Definitions in this file should be 277298Sobrien customized in a target-specific file, and then this file included (see 377298Sobrien tic54x.h for an example). */ 477298Sobrien#ifndef COFF_TI_H 577298Sobrien#define COFF_TI_H 677298Sobrien 777298Sobrien/********************** FILE HEADER **********************/ 877298Sobrien 977298Sobrienstruct external_filehdr { 1077298Sobrien char f_magic[2]; /* magic number */ 1177298Sobrien char f_nscns[2]; /* number of sections */ 1277298Sobrien char f_timdat[4]; /* time & date stamp */ 1377298Sobrien char f_symptr[4]; /* file pointer to symtab */ 1477298Sobrien char f_nsyms[4]; /* number of symtab entries */ 1577298Sobrien char f_opthdr[2]; /* sizeof(optional hdr) */ 1677298Sobrien char f_flags[2]; /* flags */ 1777298Sobrien char f_target_id[2]; /* magic no. (TI COFF-specific) */ 1877298Sobrien}; 1977298Sobrien 2077298Sobrien/* COFF0 has magic number in f_magic, and omits f_target_id from the file 2177298Sobrien header; for later versions, f_magic is 0xC1 for COFF1 and 0xC2 for COFF2 2277298Sobrien and the target-specific magic number is found in f_target_id */ 2377298Sobrien 2477298Sobrien#define TICOFF0MAGIC TI_TARGET_ID 2577298Sobrien#define TICOFF1MAGIC 0x00C1 2677298Sobrien#define TICOFF2MAGIC 0x00C2 2777298Sobrien#define TICOFF_AOUT_MAGIC 0x0108 /* magic number in optional header */ 2877298Sobrien#define TICOFF 1 /* customize coffcode.h */ 2977298Sobrien 3077298Sobrien/* The target_id field changes depending on the particular CPU target */ 3177298Sobrien/* for COFF0, the target id appeared in f_magic, where COFFX magic is now */ 3277298Sobrien#ifndef TI_TARGET_ID 3377298Sobrien#error "TI_TARGET_ID needs to be defined for your CPU" 3477298Sobrien#endif 3577298Sobrien 3677298Sobrien/* Which bfd_arch to use... */ 3777298Sobrien#ifndef TICOFF_TARGET_ARCH 3877298Sobrien#error "TICOFF_TARGET_ARCH needs to be defined for your CPU" 3977298Sobrien#endif 4077298Sobrien 4177298Sobrien/* Default to COFF2 for file output */ 4277298Sobrien#ifndef TICOFF_DEFAULT_MAGIC 4377298Sobrien#define TICOFF_DEFAULT_MAGIC TICOFF2MAGIC 4477298Sobrien#endif 4577298Sobrien 4677298Sobrien/* This value is made available in the rare case where a bfd is unavailable */ 4777298Sobrien#ifndef OCTETS_PER_BYTE_POWER 4877298Sobrien#error "OCTETS_PER_BYTE_POWER not defined for this CPU" 4977298Sobrien#else 5077298Sobrien#define OCTETS_PER_BYTE (1<<OCTETS_PER_BYTE_POWER) 5177298Sobrien#endif 5277298Sobrien 5377298Sobrien/* default alignment is on a byte (not octet!) boundary */ 5477298Sobrien#ifndef COFF_DEFAULT_SECTION_ALIGNMENT_POWER 5577298Sobrien#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER 0 5677298Sobrien#endif 5777298Sobrien 5877298Sobrien/* TI COFF encodes the section alignment in the section header flags */ 5977298Sobrien#define COFF_ALIGN_IN_SECTION_HEADER 1 6077298Sobrien#define COFF_ALIGN_IN_S_FLAGS 1 6177298Sobrien/* requires a power-of-two argument */ 6277298Sobrien#define COFF_ENCODE_ALIGNMENT(S,X) ((S).s_flags |= (((unsigned)(X)&0xF)<<8)) 6377298Sobrien/* result is a power of two */ 6477298Sobrien#define COFF_DECODE_ALIGNMENT(X) (((X)>>8)&0xF) 6577298Sobrien 6677298Sobrien#define COFF0_P(ABFD) (bfd_coff_filhsz(ABFD) == FILHSZ_V0) 6777298Sobrien#define COFF2_P(ABFD) (bfd_coff_scnhsz(ABFD) != SCNHSZ_V01) 6877298Sobrien 6977298Sobrien#define COFF0_BADMAG(x) ((x).f_magic != TICOFF0MAGIC) 7077298Sobrien#define COFF1_BADMAG(x) ((x).f_magic != TICOFF1MAGIC || (x).f_target_id != TI_TARGET_ID) 7177298Sobrien#define COFF2_BADMAG(x) ((x).f_magic != TICOFF2MAGIC || (x).f_target_id != TI_TARGET_ID) 7277298Sobrien 7377298Sobrien/* we need to read/write an extra field in the coff file header */ 7477298Sobrien#ifndef COFF_ADJUST_FILEHDR_IN_POST 7577298Sobrien#define COFF_ADJUST_FILEHDR_IN_POST(abfd,src,dst) \ 7677298Sobriendo { ((struct internal_filehdr *)(dst))->f_target_id = \ 7777298Sobrienbfd_h_get_16(abfd, (bfd_byte *)(((FILHDR *)(src))->f_target_id)); \ 7877298Sobrien} while(0) 7977298Sobrien#endif 8077298Sobrien 8177298Sobrien#ifndef COFF_ADJUST_FILEHDR_OUT_POST 8277298Sobrien#define COFF_ADJUST_FILEHDR_OUT_POST(abfd,src,dst) \ 8377298Sobriendo { bfd_h_put_16(abfd, ((struct internal_filehdr *)(src))->f_target_id, \ 8477298Sobrien (bfd_byte *)(((FILHDR *)(dst))->f_target_id)); \ 8577298Sobrien} while(0) 8677298Sobrien#endif 8777298Sobrien 8877298Sobrien#define FILHDR struct external_filehdr 8977298Sobrien#define FILHSZ 22 9077298Sobrien#define FILHSZ_V0 20 /* COFF0 omits target_id field */ 9177298Sobrien 9277298Sobrien/* File header flags */ 9377298Sobrien#define F_RELFLG (0x0001) 9477298Sobrien#define F_EXEC (0x0002) 9577298Sobrien#define F_LNNO (0x0004) 9677298Sobrien/* F_LSYMS needs to be redefined in your source file */ 9777298Sobrien#define F_LSYMS_TICOFF (0x0010) /* normal COFF is 0x8 */ 9877298Sobrien 9977298Sobrien#define F_10 0x00 /* file built for TMS320C1x devices */ 10077298Sobrien#define F_20 0x10 /* file built for TMS320C2x devices */ 10177298Sobrien#define F_25 0x20 /* file built for TMS320C2x/C5x devices */ 10277298Sobrien#define F_LENDIAN 0x0100 /* 16 bits/word, LSB first */ 10377298Sobrien#define F_SYMMERGE 0x1000 /* duplicate symbols were removed */ 10477298Sobrien 10577298Sobrien/********************** OPTIONAL HEADER **********************/ 10677298Sobrien 10777298Sobrien 10877298Sobrientypedef struct 10977298Sobrien{ 11077298Sobrien char magic[2]; /* type of file (0x108) */ 11177298Sobrien char vstamp[2]; /* version stamp */ 11277298Sobrien char tsize[4]; /* text size in bytes, padded to FW bdry*/ 11377298Sobrien char dsize[4]; /* initialized data " " */ 11477298Sobrien char bsize[4]; /* uninitialized data " " */ 11577298Sobrien char entry[4]; /* entry pt. */ 11677298Sobrien char text_start[4]; /* base of text used for this file */ 11777298Sobrien char data_start[4]; /* base of data used for this file */ 11877298Sobrien} 11977298SobrienAOUTHDR; 12077298Sobrien 12177298Sobrien 12277298Sobrien#define AOUTHDRSZ 28 12377298Sobrien#define AOUTSZ 28 12477298Sobrien 12577298Sobrien 12677298Sobrien/********************** SECTION HEADER **********************/ 12777298Sobrien/* COFF0, COFF1 */ 12877298Sobrienstruct external_scnhdr_v01 { 12977298Sobrien char s_name[8]; /* section name */ 13077298Sobrien char s_paddr[4]; /* physical address, aliased s_nlib */ 13177298Sobrien char s_vaddr[4]; /* virtual address */ 13277298Sobrien char s_size[4]; /* section size (in WORDS) */ 13377298Sobrien char s_scnptr[4]; /* file ptr to raw data for section */ 13477298Sobrien char s_relptr[4]; /* file ptr to relocation */ 13577298Sobrien char s_lnnoptr[4]; /* file ptr to line numbers */ 13677298Sobrien char s_nreloc[2]; /* number of relocation entries */ 13777298Sobrien char s_nlnno[2]; /* number of line number entries*/ 13877298Sobrien char s_flags[2]; /* flags */ 13977298Sobrien char s_reserved[1]; /* reserved */ 14077298Sobrien char s_page[1]; /* section page number (LOAD) */ 14177298Sobrien}; 14277298Sobrien 14377298Sobrien/* COFF2 */ 14477298Sobrienstruct external_scnhdr { 14577298Sobrien char s_name[8]; /* section name */ 14677298Sobrien char s_paddr[4]; /* physical address, aliased s_nlib */ 14777298Sobrien char s_vaddr[4]; /* virtual address */ 14877298Sobrien char s_size[4]; /* section size (in WORDS) */ 14977298Sobrien char s_scnptr[4]; /* file ptr to raw data for section */ 15077298Sobrien char s_relptr[4]; /* file ptr to relocation */ 15177298Sobrien char s_lnnoptr[4]; /* file ptr to line numbers */ 15277298Sobrien char s_nreloc[4]; /* number of relocation entries */ 15377298Sobrien char s_nlnno[4]; /* number of line number entries*/ 15477298Sobrien char s_flags[4]; /* flags */ 15577298Sobrien char s_reserved[2]; /* reserved */ 15677298Sobrien char s_page[2]; /* section page number (LOAD) */ 15777298Sobrien}; 15877298Sobrien 15977298Sobrien/* 16077298Sobrien * Special section flags 16177298Sobrien */ 16277298Sobrien 16377298Sobrien/* TI COFF defines these flags; 16477298Sobrien STYP_CLINK: the section should be excluded from the final 16577298Sobrien linker output if there are no references found to any symbol in the section 16677298Sobrien STYP_BLOCK: the section should be blocked, i.e. if the section would cross 16777298Sobrien a page boundary, it is started at a page boundary instead. 16877298Sobrien TI COFF puts the section alignment power of two in the section flags 16977298Sobrien e.g. 2**N is alignment, flags |= (N & 0xF) << 8 17077298Sobrien*/ 17177298Sobrien#define STYP_CLINK (0x4000) 17277298Sobrien#define STYP_BLOCK (0x1000) 17377298Sobrien#define STYP_ALIGN (0x0F00) /* TI COFF stores section alignment here */ 17477298Sobrien 17577298Sobrien#define SCNHDR_V01 struct external_scnhdr_v01 17677298Sobrien#define SCNHDR struct external_scnhdr 17777298Sobrien#define SCNHSZ_V01 40 /* for v0 and v1 */ 17877298Sobrien#define SCNHSZ 48 17977298Sobrien 18077298Sobrien/* COFF2 changes the offsets and sizes of these fields 18177298Sobrien Assume we're dealing with the COFF2 scnhdr structure, and adjust 18277298Sobrien accordingly 18377298Sobrien */ 18477298Sobrien#define GET_SCNHDR_NRELOC(ABFD,PTR) \ 18577298Sobrien(COFF2_P(ABFD) ? bfd_h_get_32 (ABFD,PTR) : bfd_h_get_16 (ABFD, PTR)) 18677298Sobrien#define PUT_SCNHDR_NRELOC(ABFD,VAL,PTR) \ 18777298Sobrien(COFF2_P(ABFD) ? bfd_h_put_32 (ABFD,VAL,PTR) : bfd_h_put_16 (ABFD,VAL,PTR)) 18877298Sobrien#define GET_SCNHDR_NLNNO(ABFD,PTR) \ 18977298Sobrien(COFF2_P(ABFD) ? bfd_h_get_32 (ABFD,PTR) : bfd_h_get_16 (ABFD, (PTR)-2)) 19077298Sobrien#define PUT_SCNHDR_NLNNO(ABFD,VAL,PTR) \ 19177298Sobrien(COFF2_P(ABFD) ? bfd_h_put_32 (ABFD,VAL,PTR) : bfd_h_put_16 (ABFD,VAL,(PTR)-2)) 19277298Sobrien#define GET_SCNHDR_FLAGS(ABFD,PTR) \ 19377298Sobrien(COFF2_P(ABFD) ? bfd_h_get_32 (ABFD,PTR) : bfd_h_get_16 (ABFD, (PTR)-4)) 19477298Sobrien#define PUT_SCNHDR_FLAGS(ABFD,VAL,PTR) \ 19577298Sobrien(COFF2_P(ABFD) ? bfd_h_put_32 (ABFD,VAL,PTR) : bfd_h_put_16 (ABFD,VAL,(PTR)-4)) 19677298Sobrien#define GET_SCNHDR_PAGE(ABFD,PTR) \ 19777298Sobrien(COFF2_P(ABFD) ? bfd_h_get_16 (ABFD,PTR) : bfd_h_get_8 (ABFD, (PTR)-7)) 19877298Sobrien/* on output, make sure that the "reserved" field is zero */ 19977298Sobrien#define PUT_SCNHDR_PAGE(ABFD,VAL,PTR) \ 20077298Sobrien(COFF2_P(ABFD) ? bfd_h_put_16 (ABFD,VAL,PTR) : \ 20177298Sobrienbfd_h_put_8 (ABFD,VAL,(PTR)-7), bfd_h_put_8 (ABFD, 0, (PTR)-8)) 20277298Sobrien 20377298Sobrien/* TI COFF stores section size as number of bytes (address units, not octets), 20477298Sobrien so adjust to be number of octets, which is what BFD expects */ 20577298Sobrien#define GET_SCNHDR_SIZE(ABFD,SZP) \ 20677298Sobrien(bfd_h_get_32(ABFD,SZP)*bfd_octets_per_byte(ABFD)) 20777298Sobrien#define PUT_SCNHDR_SIZE(ABFD,SZ,SZP) \ 20877298Sobrienbfd_h_put_32(ABFD,(SZ)/bfd_octets_per_byte(ABFD),SZP) 20977298Sobrien 21077298Sobrien#define COFF_ADJUST_SCNHDR_IN_POST(ABFD,EXT,INT) \ 21177298Sobriendo { ((struct internal_scnhdr *)(INT))->s_page = \ 21277298SobrienGET_SCNHDR_PAGE(ABFD,(bfd_byte *)((SCNHDR *)(EXT))->s_page); \ 21377298Sobrien} while(0) 21477298Sobrien 21577298Sobrien/* The line number and reloc overflow checking in coff_swap_scnhdr_out in 21677298Sobrien coffswap.h doesn't use PUT_X for s_nlnno and s_nreloc. 21777298Sobrien Due to different sized v0/v1/v2 section headers, we have to re-write these 21877298Sobrien fields. 21977298Sobrien */ 22077298Sobrien#define COFF_ADJUST_SCNHDR_OUT_POST(ABFD,INT,EXT) \ 22177298Sobriendo { \ 22277298SobrienPUT_SCNHDR_NLNNO(ABFD,((struct internal_scnhdr *)(INT))->s_nlnno,\ 22377298Sobrien (bfd_byte *)((SCNHDR *)(EXT))->s_nlnno); \ 22477298SobrienPUT_SCNHDR_NRELOC(ABFD,((struct internal_scnhdr *)(INT))->s_nreloc,\ 22577298Sobrien (bfd_byte *)((SCNHDR *)(EXT))->s_nreloc); \ 22677298SobrienPUT_SCNHDR_FLAGS(ABFD,((struct internal_scnhdr *)(INT))->s_flags, \ 22777298Sobrien (bfd_byte *)((SCNHDR *)(EXT))->s_flags); \ 22877298SobrienPUT_SCNHDR_PAGE(ABFD,((struct internal_scnhdr *)(INT))->s_page, \ 22977298Sobrien (bfd_byte *)((SCNHDR *)(EXT))->s_page); \ 23077298Sobrien} while(0) 23177298Sobrien 23277298Sobrien/* Page macros 23377298Sobrien 23477298Sobrien The first GDB port requires flags in its remote memory access commands to 23577298Sobrien distinguish between data/prog space. Hopefully we can make this go away 23677298Sobrien eventually. Stuff the page in the upper bits of a 32-bit address, since 23777298Sobrien the c5x family only uses 16 or 23 bits. 23877298Sobrien 23977298Sobrien c2x, c5x and most c54x devices have 16-bit addresses, but the c548 has 24077298Sobrien 23-bit program addresses. Make sure the page flags don't interfere. 24177298Sobrien These flags are used by GDB to identify the destination page for 24277298Sobrien addresses. 24377298Sobrien*/ 24477298Sobrien 24577298Sobrien/* recognized load pages */ 24677298Sobrien#define PG_PROG 0x0 /* PROG page */ 24777298Sobrien#define PG_DATA 0x1 /* DATA page */ 24877298Sobrien 24977298Sobrien#define ADDR_MASK 0x00FFFFFF 25077298Sobrien#define PG_TO_FLAG(p) (((unsigned long)(p) & 0xFF) << 24) 25177298Sobrien#define FLAG_TO_PG(f) (((f) >> 24) & 0xFF) 25277298Sobrien 25377298Sobrien/* 25477298Sobrien * names of "special" sections 25577298Sobrien */ 25677298Sobrien#define _TEXT ".text" 25777298Sobrien#define _DATA ".data" 25877298Sobrien#define _BSS ".bss" 25977298Sobrien#define _CINIT ".cinit" /* initialized C data */ 26077298Sobrien#define _SCONST ".const" /* constants */ 26177298Sobrien#define _SWITCH ".switch" /* switch tables */ 26277298Sobrien#define _STACK ".stack" /* C stack */ 26377298Sobrien#define _SYSMEM ".sysmem" /* used for malloc et al. syscalls */ 26477298Sobrien 26577298Sobrien/********************** LINE NUMBERS **********************/ 26677298Sobrien 26777298Sobrien/* 1 line number entry for every "breakpointable" source line in a section. 26877298Sobrien * Line numbers are grouped on a per function basis; first entry in a function 26977298Sobrien * grouping will have l_lnno = 0 and in place of physical address will be the 27077298Sobrien * symbol table index of the function name. 27177298Sobrien */ 27277298Sobrienstruct external_lineno { 27377298Sobrien union { 27477298Sobrien char l_symndx[4]; /* function name symbol index, iff l_lnno == 0*/ 27577298Sobrien char l_paddr[4]; /* (physical) address of line number */ 27677298Sobrien } l_addr; 27777298Sobrien char l_lnno[2]; /* line number */ 27877298Sobrien}; 27977298Sobrien 28077298Sobrien#define LINENO struct external_lineno 28177298Sobrien#define LINESZ 6 28277298Sobrien 28377298Sobrien 28477298Sobrien/********************** SYMBOLS **********************/ 28577298Sobrien 28677298Sobrien/* NOTE: this is what a local label looks like in assembly source; what it 28777298Sobrien looks like in COFF output is undefined */ 28877298Sobrien#define TICOFF_LOCAL_LABEL_P(NAME) \ 28977298Sobrien((NAME[0] == '$' && NAME[1] >= '0' && NAME[1] <= '9' && NAME[2] == '\0') \ 29077298Sobrien || NAME[strlen(NAME)-1] == '?') 29177298Sobrien 29277298Sobrien#define E_SYMNMLEN 8 /* # characters in a symbol name */ 29377298Sobrien#define E_FILNMLEN 14 /* # characters in a file name */ 29477298Sobrien#define E_DIMNUM 4 /* # array dimensions in auxiliary entry */ 29577298Sobrien 29677298Sobrienstruct external_syment 29777298Sobrien{ 29877298Sobrien union { 29977298Sobrien char e_name[E_SYMNMLEN]; 30077298Sobrien struct { 30177298Sobrien char e_zeroes[4]; 30277298Sobrien char e_offset[4]; 30377298Sobrien } e; 30477298Sobrien } e; 30577298Sobrien char e_value[4]; 30677298Sobrien char e_scnum[2]; 30777298Sobrien char e_type[2]; 30877298Sobrien char e_sclass[1]; 30977298Sobrien char e_numaux[1]; 31077298Sobrien}; 31177298Sobrien 31277298Sobrien 31377298Sobrien#define N_BTMASK (017) 31477298Sobrien#define N_TMASK (060) 31577298Sobrien#define N_BTSHFT (4) 31677298Sobrien#define N_TSHIFT (2) 31777298Sobrien 31877298Sobrien 31977298Sobrienunion external_auxent { 32077298Sobrien struct { 32177298Sobrien char x_tagndx[4]; /* str, un, or enum tag indx */ 32277298Sobrien union { 32377298Sobrien struct { 32477298Sobrien char x_lnno[2]; /* declaration line number */ 32577298Sobrien char x_size[2]; /* str/union/array size */ 32677298Sobrien } x_lnsz; 32777298Sobrien char x_fsize[4]; /* size of function */ 32877298Sobrien } x_misc; 32977298Sobrien union { 33077298Sobrien struct { /* if ISFCN, tag, or .bb */ 33177298Sobrien char x_lnnoptr[4]; /* ptr to fcn line # */ 33277298Sobrien char x_endndx[4]; /* entry ndx past block end */ 33377298Sobrien } x_fcn; 33477298Sobrien struct { /* if ISARY, up to 4 dimen. */ 33577298Sobrien char x_dimen[E_DIMNUM][2]; 33677298Sobrien } x_ary; 33777298Sobrien } x_fcnary; 33877298Sobrien char x_tvndx[2]; /* tv index */ 33977298Sobrien } x_sym; 34077298Sobrien 34177298Sobrien union { 34277298Sobrien char x_fname[E_FILNMLEN]; 34377298Sobrien struct { 34477298Sobrien char x_zeroes[4]; 34577298Sobrien char x_offset[4]; 34677298Sobrien } x_n; 34777298Sobrien } x_file; 34877298Sobrien 34977298Sobrien struct { 35077298Sobrien char x_scnlen[4]; /* section length */ 35177298Sobrien char x_nreloc[2]; /* # relocation entries */ 35277298Sobrien char x_nlinno[2]; /* # line numbers */ 35377298Sobrien } x_scn; 35477298Sobrien 35577298Sobrien struct { 35677298Sobrien char x_tvfill[4]; /* tv fill value */ 35777298Sobrien char x_tvlen[2]; /* length of .tv */ 35877298Sobrien char x_tvran[2][2]; /* tv range */ 35977298Sobrien } x_tv; /* info about .tv section (in auxent of symbol .tv)) */ 36077298Sobrien 36177298Sobrien 36277298Sobrien}; 36377298Sobrien 36477298Sobrien#define SYMENT struct external_syment 36577298Sobrien#define SYMESZ 18 36677298Sobrien#define AUXENT union external_auxent 36777298Sobrien#define AUXESZ 18 36877298Sobrien 36977298Sobrien/* section lengths are in target bytes (not host bytes) */ 37077298Sobrien#define GET_SCN_SCNLEN(ABFD,EXT) \ 37177298Sobrien(bfd_h_get_32(ABFD,(bfd_byte *)(EXT)->x_scn.x_scnlen)*bfd_octets_per_byte(ABFD)) 37277298Sobrien#define PUT_SCN_SCNLEN(ABFD,INT,EXT) \ 37377298Sobrienbfd_h_put_32(ABFD,(INT)/bfd_octets_per_byte(ABFD),\ 37477298Sobrien (bfd_byte *)(EXT)->x_scn.x_scnlen) 37577298Sobrien 37677298Sobrien/* lnsz size is in bits in COFF file, in bytes in BFD */ 37777298Sobrien#define GET_LNSZ_SIZE(abfd, ext) \ 37877298Sobrien(bfd_h_get_16(abfd, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_size) / \ 37977298Sobrien (class != C_FIELD ? 8 : 1)) 38077298Sobrien 38177298Sobrien#define PUT_LNSZ_SIZE(abfd, in, ext) \ 38277298Sobrien bfd_h_put_16(abfd, ((class != C_FIELD) ? (in)*8 : (in)), \ 38377298Sobrien (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size) 38477298Sobrien 38577298Sobrien/* TI COFF stores offsets for MOS and MOU in bits; BFD expects bytes */ 38677298Sobrien#define COFF_ADJUST_SYM_IN_POST(ABFD,EXT,INT) \ 38777298Sobriendo { struct internal_syment *dst = (struct internal_syment *)(INT); \ 38877298Sobrienif (dst->n_sclass == C_MOS || dst->n_sclass == C_MOU) dst->n_value /= 8; \ 38977298Sobrien} while (0) 39077298Sobrien 39177298Sobrien#define COFF_ADJUST_SYM_OUT_POST(ABFD,INT,EXT) \ 39277298Sobriendo { struct internal_syment *src = (struct internal_syment *)(INT); \ 39377298SobrienSYMENT *dst = (SYMENT *)(EXT); \ 39477298Sobrienif(src->n_sclass == C_MOU || src->n_sclass == C_MOS) \ 39577298Sobrienbfd_h_put_32(abfd,src->n_value * 8,(bfd_byte *)dst->e_value); \ 39677298Sobrien} while (0) 39777298Sobrien 39877298Sobrien/* Detect section-relative absolute symbols so they get flagged with a sym 39977298Sobrien index of -1. 40077298Sobrien*/ 40177298Sobrien#define SECTION_RELATIVE_ABSOLUTE_SYMBOL_P(RELOC,SECT) \ 40277298Sobrien((*(RELOC)->sym_ptr_ptr)->section->output_section == (SECT) \ 40377298Sobrien && (RELOC)->howto->name[0] == 'A') 40477298Sobrien 40577298Sobrien/********************** RELOCATION DIRECTIVES **********************/ 40677298Sobrien 40777298Sobrienstruct external_reloc_v0 { 40877298Sobrien char r_vaddr[4]; 40977298Sobrien char r_symndx[2]; 41077298Sobrien char r_reserved[2]; 41177298Sobrien char r_type[2]; 41277298Sobrien}; 41377298Sobrien 41477298Sobrienstruct external_reloc { 41577298Sobrien char r_vaddr[4]; 41677298Sobrien char r_symndx[4]; 41777298Sobrien char r_reserved[2]; /* extended pmad byte for COFF2 */ 41877298Sobrien char r_type[2]; 41977298Sobrien}; 42077298Sobrien 42177298Sobrien#define RELOC struct external_reloc 42277298Sobrien#define RELSZ_V0 10 /* FIXME -- coffcode.h needs fixing */ 42377298Sobrien#define RELSZ 12 /* for COFF1/2 */ 42477298Sobrien 42577298Sobrien/* various relocation types. */ 42677298Sobrien#define R_ABS 0x0000 /* no relocation */ 42777298Sobrien#define R_REL13 0x002A /* 13-bit direct reference (???) */ 42877298Sobrien#define R_PARTLS7 0x0028 /* 7 LSBs of an address */ 42977298Sobrien#define R_PARTMS9 0x0029 /* 9MSBs of an address */ 43077298Sobrien#define R_EXTWORD 0x002B /* 23-bit direct reference */ 43177298Sobrien#define R_EXTWORD16 0x002C /* 16-bit direct reference to 23-bit addr*/ 43277298Sobrien#define R_EXTWORDMS7 0x002D /* upper 7 bits of 23-bit address */ 43377298Sobrien 43477298Sobrien#endif /* COFF_TI_H */ 435