Modified Files:

read.c read.h ecoff.c ecoff.h ChangeLog

        * read.c (read_a_source_file): generate line stabs for asm file.
        * read.h: add extern generate_asm_line_stab.
        * ecoff.h : add prototype for ecoff_generate_asm_line_stab().
        * ecoff.c (add_file): if there's no filename provided, set switch
        to generate line stabs for .s file.
        * ecoff.c (add_procedure): add stabs symbol for .ent directive.
        * ecoff.c (generate_ecoff_stab): creates an artificial stabs.
        * ecoff.c (generate_asm_line_stab): generate a artifitial label
        for each line and generate a stabn for the line.
This commit is contained in:
Kung Hsu 1994-07-08 19:38:18 +00:00
parent 6f89cd429c
commit daad3bbf95
4 changed files with 222 additions and 15 deletions

View file

@ -1,3 +1,17 @@
Fri Jul 8 12:23:44 1994 Kung Hsu (kung@mexican.cygnus.com)
* config/obj-ecoff.h: define macro OBJ_GENERATE_ASM_LINE_STAB.
* config/obj-elf.h: ditto.
* read.c (read_a_source_file): generate line stabs for asm file.
* read.h: add extern generate_asm_line_stab.
* ecoff.h : add prototype for ecoff_generate_asm_line_stab().
* ecoff.c (add_file): if there's no filename provided, set switch
to generate line stabs for .s file.
* ecoff.c (add_procedure): add stabs symbol for .ent directive.
* ecoff.c (generate_ecoff_stab): creates an artificial stabs.
* ecoff.c (generate_asm_line_stab): generate a artifitial label
for each line and generate a stabn for the line.
Thu Jul 7 17:04:03 1994 Steve Chamberlain (sac@jonny.cygnus.com) Thu Jul 7 17:04:03 1994 Steve Chamberlain (sac@jonny.cygnus.com)
* gasp.c (get_any_string): Cope with getting a string with an * gasp.c (get_any_string): Cope with getting a string with an

View file

@ -778,7 +778,6 @@ enum aux_type {
#define MAX_CLUSTER_PAGES 63 #define MAX_CLUSTER_PAGES 63
#endif #endif
/* Linked list connecting separate page allocations. */ /* Linked list connecting separate page allocations. */
typedef struct vlinks { typedef struct vlinks {
struct vlinks *prev; /* previous set of pages */ struct vlinks *prev; /* previous set of pages */
@ -1394,6 +1393,7 @@ static alloc_info_t alloc_counts[ (int)alloc_type_last ];
/* Various statics. */ /* Various statics. */
static efdr_t *cur_file_ptr = (efdr_t *) 0; /* current file desc. header */ static efdr_t *cur_file_ptr = (efdr_t *) 0; /* current file desc. header */
static proc_t *cur_proc_ptr = (proc_t *) 0; /* current procedure header */ static proc_t *cur_proc_ptr = (proc_t *) 0; /* current procedure header */
static proc_t *first_proc_ptr = (proc_t *) 0; /* first procedure header */
static thead_t *top_tag_head = (thead_t *) 0; /* top level tag head */ static thead_t *top_tag_head = (thead_t *) 0; /* top level tag head */
static thead_t *cur_tag_head = (thead_t *) 0; /* current tag head */ static thead_t *cur_tag_head = (thead_t *) 0; /* current tag head */
#ifdef ECOFF_DEBUG #ifdef ECOFF_DEBUG
@ -1477,6 +1477,7 @@ static forward_t *allocate_forward PARAMS ((void));
static thead_t *allocate_thead PARAMS ((void)); static thead_t *allocate_thead PARAMS ((void));
static void free_thead PARAMS ((thead_t *ptr)); static void free_thead PARAMS ((thead_t *ptr));
static lineno_list_t *allocate_lineno_list PARAMS ((void)); static lineno_list_t *allocate_lineno_list PARAMS ((void));
static void generate_ecoff_stab PARAMS ((int, const char *, int, int, int));
/* This function should be called when the assembler starts up. */ /* This function should be called when the assembler starts up. */
@ -2131,6 +2132,9 @@ add_procedure (func)
cur_proc_ptr = new_proc_ptr = &vp->last->datum->proc[vp->objects_last_page++]; cur_proc_ptr = new_proc_ptr = &vp->last->datum->proc[vp->objects_last_page++];
if (first_proc_ptr == (proc_t *) NULL)
first_proc_ptr = new_proc_ptr;
vp->num_allocated++; vp->num_allocated++;
new_proc_ptr->pdr.isym = -1; new_proc_ptr->pdr.isym = -1;
@ -2186,7 +2190,10 @@ add_file (file_name, indx)
as_fatal ("fake .file after real one"); as_fatal ("fake .file after real one");
as_where (&file, (unsigned int *) NULL); as_where (&file, (unsigned int *) NULL);
file_name = (const char *) file; file_name = (const char *) file;
generate_asm_line_stab = 1;
} }
else
generate_asm_line_stab = 0;
#ifndef NO_LISTING #ifndef NO_LISTING
if (listing) if (listing)
@ -2266,6 +2273,18 @@ add_file (file_name, indx)
fil_ptr->int_type = add_aux_sym_tir (&int_type_info, fil_ptr->int_type = add_aux_sym_tir (&int_type_info,
hash_yes, hash_yes,
&cur_file_ptr->thash_head[0]); &cur_file_ptr->thash_head[0]);
if (generate_asm_line_stab)
{
static char itstr[] = "int:t1=r1;-2147483648;2147483647;";
mark_stabs (0);
(void) add_ecoff_symbol (file_name, st_Nil, sc_Nil,
symbol_new ("L0\001", now_seg,
(valueT) frag_now_fix (),
frag_now),
0, ECOFF_MARK_STAB (N_SO));
(void) add_ecoff_symbol (itstr, st_Nil, sc_Nil,
(symbolS *)NULL, 0, ECOFF_MARK_STAB (N_LSYM));
}
} }
} }
@ -2967,11 +2986,23 @@ ecoff_directive_end (ignore)
if (ent == (symbolS *) NULL) if (ent == (symbolS *) NULL)
as_warn (".end directive names unknown symbol"); as_warn (".end directive names unknown symbol");
else else
(void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text, {
(void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text,
symbol_new ("L0\001", now_seg, symbol_new ("L0\001", now_seg,
(valueT) frag_now_fix (), (valueT) frag_now_fix (),
frag_now), frag_now),
(symint_t) 0, (symint_t) 0); (symint_t) 0, (symint_t) 0);
if (generate_asm_line_stab)
{
char *n;
n = xmalloc (strlen (name) + 4);
strcpy (n, name);
strcat (n, ":F1");
(void) add_ecoff_symbol ((const char *) n, stGlobal, scText,
ent, 0, ECOFF_MARK_STAB (N_FUN));
}
}
cur_proc_ptr = (proc_t *) NULL; cur_proc_ptr = (proc_t *) NULL;
@ -3522,6 +3553,7 @@ ecoff_build_lineno (backend, buf, bufend, offset, linecntptr)
unsigned long c; unsigned long c;
long iline; long iline;
long totcount; long totcount;
lineno_list_t first;
if (linecntptr != (long *) NULL) if (linecntptr != (long *) NULL)
*linecntptr = 0; *linecntptr = 0;
@ -3534,6 +3566,31 @@ ecoff_build_lineno (backend, buf, bufend, offset, linecntptr)
c = offset; c = offset;
iline = 0; iline = 0;
totcount = 0; totcount = 0;
/* For some reason the address of the first procedure is ignored
when reading line numbers. This doesn't matter if the address of
the first procedure is 0, but when gcc is generating MIPS
embedded PIC code, it will put strings in the .text section
before the first procedure. We cope by inserting a dummy line if
the address of the first procedure is not 0. Hopefully this
won't screw things up too badly. */
if (first_proc_ptr != (proc_t *) NULL
&& first_lineno != (lineno_list_t *) NULL
&& ((S_GET_VALUE (first_proc_ptr->sym->as_sym)
+ bfd_get_section_vma (stdoutput,
S_GET_SEGMENT (first_proc_ptr->sym->as_sym)))
!= 0))
{
first.file = first_lineno->file;
first.proc = first_lineno->proc;
first.frag = &zero_address_frag;
first.paddr = 0;
first.lineno = 0;
first.next = first_lineno;
first_lineno = &first;
}
for (l = first_lineno; l != (lineno_list_t *) NULL; l = l->next) for (l = first_lineno; l != (lineno_list_t *) NULL; l = l->next)
{ {
long count; long count;
@ -4180,12 +4237,14 @@ ecoff_build_aux (backend, buf, bufend, offset)
switch (aux_ptr->type) switch (aux_ptr->type)
{ {
case aux_tir: case aux_tir:
ecoff_swap_tir_out (bigendian, &aux_ptr->data.ti, (*backend->swap_tir_out) (bigendian,
&aux_out->a_ti); &aux_ptr->data.ti,
&aux_out->a_ti);
break; break;
case aux_rndx: case aux_rndx:
ecoff_swap_rndx_out (bigendian, &aux_ptr->data.rndx, (*backend->swap_rndx_out) (bigendian,
&aux_out->a_rndx); &aux_ptr->data.rndx,
&aux_out->a_rndx);
break; break;
case aux_dnLow: case aux_dnLow:
AUX_PUT_DNLOW (bigendian, aux_ptr->data.dnLow, AUX_PUT_DNLOW (bigendian, aux_ptr->data.dnLow,
@ -4536,9 +4595,13 @@ ecoff_build_debug (hdr, bufp, backend)
know ((offset & (backend->debug_align - 1)) == 0); know ((offset & (backend->debug_align - 1)) == 0);
hdr->magic = backend->sym_magic; /* FIXME: This value should be determined from the .verstamp directive,
/* FIXME: what should hdr->vstamp be? */ with reasonable defaults in config files. */
#ifdef TC_ALPHA
hdr->vstamp = 0x030b;
#else
hdr->vstamp = 0x020b; hdr->vstamp = 0x020b;
#endif
*bufp = buf; *bufp = buf;
return offset; return offset;
@ -4950,4 +5013,119 @@ ecoff_set_gp_prolog_size (sz)
cur_proc_ptr->pdr.gp_used = 1; cur_proc_ptr->pdr.gp_used = 1;
} }
static void
generate_ecoff_stab (what, string, type, other, desc)
int what;
const char *string;
int type;
int other;
int desc;
{
efdr_t *save_file_ptr = cur_file_ptr;
symbolS *sym;
symint_t value;
st_t st;
sc_t sc;
symint_t indx;
localsym_t *hold = NULL;
/* We don't handle .stabd. */
if (what != 's' && what != 'n')
{
as_bad (".stab%c is not supported", what);
return;
}
/* We ignore the other field. */
if (other != 0)
as_warn (".stab%c: ignoring non-zero other field", what);
/* Make sure we have a current file. */
if (cur_file_ptr == (efdr_t *) NULL)
{
add_file ((const char *) NULL, 0);
save_file_ptr = cur_file_ptr;
}
/* For stabs in ECOFF, the first symbol must be @stabs. This is a
signal to gdb. */
if (stabs_seen == 0)
mark_stabs (0);
/* Line number stabs are handled differently, since they have two
values, the line number and the address of the label. We use the
index field (aka desc) to hold the line number, and the value
field to hold the address. The symbol type is st_Label, which
should be different from the other stabs, so that gdb can
recognize it. */
if (type == N_SLINE)
{
SYMR dummy_symr;
#ifndef NO_LISTING
if (listing)
listing_source_line ((unsigned int) desc);
#endif
dummy_symr.index = desc;
if (dummy_symr.index != desc)
{
as_warn ("Line number (%d) for .stab%c directive cannot fit in index field (20 bits)",
desc, what);
return;
}
sym = symbol_find_or_make ((char *)string);
value = 0;
st = st_Label;
sc = sc_Text;
indx = desc;
}
else
{
#ifndef NO_LISTING
if (listing && (type == N_SO || type == N_SOL))
listing_source_file (string);
#endif
sym = symbol_find_or_make ((char *)string);
sc = sc_Nil;
st = st_Nil;
value = 0;
indx = ECOFF_MARK_STAB (type);
}
/* Don't store the stabs symbol we are creating as the type of the
ECOFF symbol. We want to compute the type of the ECOFF symbol
independently. */
if (sym != (symbolS *) NULL)
hold = sym->ecoff_symbol;
(void) add_ecoff_symbol (string, st, sc, sym, value, indx);
if (sym != (symbolS *) NULL)
sym->ecoff_symbol = hold;
/* Restore normal file type. */
cur_file_ptr = save_file_ptr;
}
static int line_label_cnt = 0;
void
ecoff_generate_asm_line_stab (lineno)
int lineno;
{
char *ll;
line_label_cnt++;
/* generate local label $LMnn */
ll = xmalloc(10);
sprintf(ll, "$LM%d", line_label_cnt);
colon (ll);
/* generate stab for the line */
generate_ecoff_stab ('n', ll, N_SLINE, 0, lineno);
}
#endif /* ECOFF_DEBUGGING */ #endif /* ECOFF_DEBUGGING */

View file

@ -32,6 +32,9 @@ extern void ecoff_read_begin_hook PARAMS ((void));
obj_symbol_new_hook. */ obj_symbol_new_hook. */
extern void ecoff_symbol_new_hook PARAMS ((struct symbol *)); extern void ecoff_symbol_new_hook PARAMS ((struct symbol *));
/* This function should be called by the obj_frob_symbol hook. */
extern void ecoff_frob_symbol PARAMS ((struct symbol *));
/* Build the ECOFF debugging information. This should be called by /* Build the ECOFF debugging information. This should be called by
obj_frob_file. This fills in the counts in *HDR; the offsets are obj_frob_file. This fills in the counts in *HDR; the offsets are
filled in relative to the start of the *BUFP. It sets *BUFP to a filled in relative to the start of the *BUFP. It sets *BUFP to a
@ -74,4 +77,7 @@ extern void ecoff_set_gp_prolog_size PARAMS ((int sz));
extern void obj_ecoff_set_ext PARAMS ((struct symbol *, EXTR *)); extern void obj_ecoff_set_ext PARAMS ((struct symbol *, EXTR *));
#endif #endif
/* This routine is called from read.c to generate line number stabs for .s file
*/
extern void ecoff_generate_asm_line_stab PARAMS ((int));
#endif /* ECOFF_DEBUGGING */ #endif /* ECOFF_DEBUGGING */

View file

@ -60,6 +60,8 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
char *input_line_pointer; /*->next char of source file to parse. */ char *input_line_pointer; /*->next char of source file to parse. */
int generate_asm_line_stab = 0; /* flag to generate line stab for .s file */
#if BITS_PER_CHAR != 8 #if BITS_PER_CHAR != 8
/* The following table is indexed by[(char)] and will break if /* The following table is indexed by[(char)] and will break if
a char does not have exactly 256 states (hopefully 0:255!)! */ a char does not have exactly 256 states (hopefully 0:255!)! */
@ -544,6 +546,16 @@ read_a_source_file (name)
c = *input_line_pointer; c = *input_line_pointer;
*input_line_pointer = '\0'; *input_line_pointer = '\0';
#ifdef OBJ_GENERATE_ASM_LINE_STAB
if (generate_asm_line_stab)
{
int lineno;
char *s;
as_where (&s, &lineno);
OBJ_GENERATE_ASM_LINE_STAB (lineno);
}
#endif
md_assemble (s); /* Assemble 1 instruction. */ md_assemble (s); /* Assemble 1 instruction. */
*input_line_pointer++ = c; *input_line_pointer++ = c;
@ -1503,13 +1515,12 @@ pseudo_set (symbolP)
symbolS *symbolP; symbolS *symbolP;
{ {
expressionS exp; expressionS exp;
#if defined(OBJ_AOUT) | defined(OBJ_BOUT) #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
int ext; int ext;
#endif /* OBJ_AOUT or OBJ_BOUT */ #endif /* OBJ_AOUT or OBJ_BOUT */
know (symbolP); /* NULL pointer is logic error. */ know (symbolP); /* NULL pointer is logic error. */
#if defined(OBJ_AOUT) | defined(OBJ_BOUT) #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
/* @@ Fix this right for BFD. */
ext = S_IS_EXTERNAL (symbolP); ext = S_IS_EXTERNAL (symbolP);
#endif /* OBJ_AOUT or OBJ_BOUT */ #endif /* OBJ_AOUT or OBJ_BOUT */
@ -1542,8 +1553,7 @@ pseudo_set (symbolP)
/* Fall through. */ /* Fall through. */
case O_constant: case O_constant:
S_SET_SEGMENT (symbolP, absolute_section); S_SET_SEGMENT (symbolP, absolute_section);
#if defined(OBJ_AOUT) | defined(OBJ_BOUT) #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
/* @@ Fix this right for BFD. */
if (ext) if (ext)
S_SET_EXTERNAL (symbolP); S_SET_EXTERNAL (symbolP);
else else
@ -1565,8 +1575,7 @@ pseudo_set (symbolP)
else else
{ {
S_SET_SEGMENT (symbolP, S_GET_SEGMENT (exp.X_add_symbol)); S_SET_SEGMENT (symbolP, S_GET_SEGMENT (exp.X_add_symbol));
#if defined(OBJ_AOUT) | defined(OBJ_BOUT) #if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
/* @@ Fix this right for BFD! */
if (ext) if (ext)
S_SET_EXTERNAL (symbolP); S_SET_EXTERNAL (symbolP);
else else