1 /* Generic stabs parsing for gas.
2 Copyright (C) 1989, 90, 91, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
5 This file is part of GAS, the GNU Assembler.
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 2,
10 or (at your option) any later version.
12 GAS is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
15 the GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
27 /* We need this, despite the apparent object format dependency, since
28 it defines stab types, which all object formats can use now. */
30 #include "aout/stab_gnu.h"
32 static void s_stab_generic
PARAMS ((int, char *, char *));
33 static void generate_asm_file
PARAMS ((int, char *));
35 /* Allow backends to override the names used for the stab sections. */
36 #ifndef STAB_SECTION_NAME
37 #define STAB_SECTION_NAME ".stab"
40 #ifndef STAB_STRING_SECTION_NAME
41 #define STAB_STRING_SECTION_NAME ".stabstr"
44 /* Non-zero if we're in the middle of a .func function, in which case
45 stabs_generate_asm_lineno emits function relative line number stabs.
46 Otherwise it emits line number stabs with absolute addresses. Note that
47 both cases only apply to assembler code assembled with -gstabs. */
48 static int in_dot_func_p
;
50 /* Label at start of current function if in_dot_func_p != 0. */
51 static const char *current_function_label
;
54 * Handle .stabX directives, which used to be open-coded.
55 * So much creeping featurism overloaded the semantics that we decided
56 * to put all .stabX thinking in one place. Here.
58 * We try to make any .stabX directive legal. Other people's AS will often
59 * do assembly-time consistency checks: eg assigning meaning to n_type bits
60 * and "protecting" you from setting them to certain values. (They also zero
61 * certain bits before emitting symbols. Tut tut.)
63 * If an expression is not absolute we either gripe or use the relocation
64 * information. Other people's assemblers silently forget information they
65 * don't need and invent information they need that you didn't supply.
69 * Build a string dictionary entry for a .stabX symbol.
70 * The symbol is added to the .<secname>str section.
73 #ifndef SEPARATE_STAB_SECTIONS
74 #define SEPARATE_STAB_SECTIONS 0
78 get_stab_string_offset (string
, stabstr_secname
)
80 const char *stabstr_secname
;
89 if (! SEPARATE_STAB_SECTIONS
)
92 length
= strlen (string
);
95 save_subseg
= now_subseg
;
97 /* Create the stab string section. */
98 seg
= subseg_new (stabstr_secname
, 0);
100 retval
= seg_info (seg
)->stabu
.stab_string_size
;
103 /* Make sure the first string is empty. */
106 retval
= seg_info (seg
)->stabu
.stab_string_size
= 1;
108 bfd_set_section_flags (stdoutput
, seg
, SEC_READONLY
| SEC_DEBUGGING
);
109 if (seg
->name
== stabstr_secname
)
110 seg
->name
= xstrdup (stabstr_secname
);
115 { /* Ordinary case. */
116 p
= frag_more (length
+ 1);
119 seg_info (seg
)->stabu
.stab_string_size
+= length
+ 1;
124 subseg_set (save_seg
, save_subseg
);
130 #ifndef OBJ_PROCESS_STAB
131 #define OBJ_PROCESS_STAB(SEG,W,S,T,O,D) aout_process_stab(W,S,T,O,D)
134 static void aout_process_stab
PARAMS ((int, const char *, int, int, int));
137 aout_process_stab (what
, string
, type
, other
, desc
)
140 int type
, other
, desc
;
142 /* Put the stab information in the symbol table. */
145 /* Create the symbol now, but only insert it into the symbol chain
146 after any symbols mentioned in the value expression get into the
147 symbol chain. This is to avoid "continuation symbols" (where one
148 ends in "\" and the debug info is continued in the next .stabs
149 directive) from being separated by other random symbols. */
150 symbol
= symbol_create (string
, undefined_section
, 0,
151 (struct frag
*) NULL
);
152 if (what
== 's' || what
== 'n')
154 /* Pick up the value from the input line. */
155 symbol_set_frag (symbol
, &zero_address_frag
);
160 /* .stabd sets the name to NULL. Why? */
161 S_SET_NAME (symbol
, NULL
);
162 symbol_set_frag (symbol
, frag_now
);
163 S_SET_VALUE (symbol
, (valueT
) frag_now_fix ());
166 symbol_append (symbol
, symbol_lastP
, &symbol_rootP
, &symbol_lastP
);
168 S_SET_TYPE (symbol
, type
);
169 S_SET_OTHER (symbol
, other
);
170 S_SET_DESC (symbol
, desc
);
174 /* This can handle different kinds of stabs (s,n,d) and different
175 kinds of stab sections. */
178 s_stab_generic (what
, stab_secname
, stabstr_secname
)
181 char *stabstr_secname
;
189 /* The general format is:
190 .stabs "STRING",TYPE,OTHER,DESC,VALUE
191 .stabn TYPE,OTHER,DESC,VALUE
192 .stabd TYPE,OTHER,DESC
193 At this point input_line_pointer points after the pseudo-op and
194 any trailing whitespace. The argument what is one of 's', 'n' or
195 'd' indicating which type of .stab this is. */
203 string
= demand_copy_C_string (&length
);
205 if (*input_line_pointer
== ',')
206 input_line_pointer
++;
209 as_warn (_(".stabs: Missing comma"));
210 ignore_rest_of_line ();
215 if (get_absolute_expression_and_terminator (&longint
) != ',')
217 as_warn (_(".stab%c: Missing comma"), what
);
218 ignore_rest_of_line ();
223 if (get_absolute_expression_and_terminator (&longint
) != ',')
225 as_warn (_(".stab%c: Missing comma"), what
);
226 ignore_rest_of_line ();
231 desc
= get_absolute_expression ();
232 if (what
== 's' || what
== 'n')
234 if (*input_line_pointer
!= ',')
236 as_warn (_(".stab%c: Missing comma"), what
);
237 ignore_rest_of_line ();
240 input_line_pointer
++;
246 /* Solaris on PowerPC has decided that .stabd can take 4 arguments, so if we were
247 given 4 arguments, make it a .stabn */
248 else if (what
== 'd')
250 char *save_location
= input_line_pointer
;
253 if (*input_line_pointer
== ',')
255 input_line_pointer
++;
259 input_line_pointer
= save_location
;
270 listing_source_line ((unsigned int) desc
);
274 listing_source_file (string
);
278 #endif /* ! NO_LISTING */
280 /* We have now gathered the type, other, and desc information. For
281 .stabs or .stabn, input_line_pointer is now pointing at the
284 if (SEPARATE_STAB_SECTIONS
)
285 /* Output the stab information in a separate section. This is used
286 at least for COFF and ELF. */
288 segT saved_seg
= now_seg
;
289 subsegT saved_subseg
= now_subseg
;
290 fragS
*saved_frag
= frag_now
;
296 static segT cached_sec
;
297 static char *cached_secname
;
299 dot
= frag_now_fix ();
301 #ifdef md_flush_pending_output
302 md_flush_pending_output ();
305 if (cached_secname
&& !strcmp (cached_secname
, stab_secname
))
312 seg
= subseg_new (stab_secname
, 0);
314 free (cached_secname
);
315 cached_secname
= xstrdup (stab_secname
);
319 if (! seg_info (seg
)->hadone
)
322 bfd_set_section_flags (stdoutput
, seg
,
323 SEC_READONLY
| SEC_RELOC
| SEC_DEBUGGING
);
325 #ifdef INIT_STAB_SECTION
326 INIT_STAB_SECTION (seg
);
328 seg_info (seg
)->hadone
= 1;
331 stroff
= get_stab_string_offset (string
, stabstr_secname
);
334 /* release the string */
335 obstack_free (¬es
, string
);
338 /* At least for now, stabs in a special stab section are always
339 output as 12 byte blocks of information. */
341 md_number_to_chars (p
, (valueT
) stroff
, 4);
342 md_number_to_chars (p
+ 4, (valueT
) type
, 1);
343 md_number_to_chars (p
+ 5, (valueT
) other
, 1);
344 md_number_to_chars (p
+ 6, (valueT
) desc
, 2);
346 if (what
== 's' || what
== 'n')
348 /* Pick up the value from the input line. */
350 input_line_pointer
--;
358 /* Arrange for a value representing the current location. */
359 fake
= FAKE_LABEL_NAME
;
360 symbol
= symbol_new (fake
, saved_seg
, dot
, saved_frag
);
363 exp
.X_add_symbol
= symbol
;
364 exp
.X_add_number
= 0;
369 #ifdef OBJ_PROCESS_STAB
370 OBJ_PROCESS_STAB (seg
, what
, string
, type
, other
, desc
);
373 subseg_set (saved_seg
, saved_subseg
);
377 #ifdef OBJ_PROCESS_STAB
378 OBJ_PROCESS_STAB (0, what
, string
, type
, other
, desc
);
384 demand_empty_rest_of_line ();
387 /* Regular stab directive. */
393 s_stab_generic (what
, STAB_SECTION_NAME
, STAB_STRING_SECTION_NAME
);
396 /* "Extended stabs", used in Solaris only now. */
403 char *stab_secname
, *stabstr_secname
;
404 static char *saved_secname
, *saved_strsecname
;
406 /* @@ MEMORY LEAK: This allocates a copy of the string, but in most
407 cases it will be the same string, so we could release the storage
408 back to the obstack it came from. */
409 stab_secname
= demand_copy_C_string (&length
);
411 if (*input_line_pointer
== ',')
412 input_line_pointer
++;
415 as_bad (_("comma missing in .xstabs"));
416 ignore_rest_of_line ();
420 /* To get the name of the stab string section, simply add "str" to
421 the stab section name. */
422 if (saved_secname
== 0 || strcmp (saved_secname
, stab_secname
))
424 stabstr_secname
= (char *) xmalloc (strlen (stab_secname
) + 4);
425 strcpy (stabstr_secname
, stab_secname
);
426 strcat (stabstr_secname
, "str");
429 free (saved_secname
);
430 free (saved_strsecname
);
432 saved_secname
= stab_secname
;
433 saved_strsecname
= stabstr_secname
;
435 s_stab_generic (what
, saved_secname
, saved_strsecname
);
440 /* Frob invented at RMS' request. Set the n_desc of a symbol. */
452 name
= input_line_pointer
;
453 c
= get_symbol_end ();
454 p
= input_line_pointer
;
457 if (*input_line_pointer
!= ',')
460 as_bad (_("Expected comma after name \"%s\""), name
);
462 ignore_rest_of_line ();
466 input_line_pointer
++;
467 temp
= get_absolute_expression ();
469 symbolP
= symbol_find_or_make (name
);
471 S_SET_DESC (symbolP
, temp
);
473 demand_empty_rest_of_line ();
476 #endif /* defined (S_SET_DESC) */
478 /* Generate stabs debugging information to denote the main source file. */
481 stabs_generate_asm_file ()
486 as_where (&file
, &lineno
);
487 generate_asm_file (N_SO
, file
);
490 /* Generate stabs debugging information to denote the source file.
491 TYPE is one of N_SO, N_SOL. */
494 generate_asm_file (type
, file
)
498 static char *last_file
;
499 static int label_count
;
504 /* Rather than try to do this in some efficient fashion, we just
505 generate a string and then parse it again. That lets us use the
506 existing stabs hook, which expect to see a string, rather than
507 inventing new ones. */
509 hold
= input_line_pointer
;
511 if (last_file
== NULL
512 || strcmp (last_file
, file
) != 0)
514 sprintf (sym
, "%sF%d", FAKE_LABEL_NAME
, label_count
);
517 sprintf (buf
, "\"%s\",%d,0,0,%s\n", file
, type
, sym
);
518 input_line_pointer
= buf
;
522 if (last_file
!= NULL
)
524 last_file
= xstrdup (file
);
527 input_line_pointer
= hold
;
530 /* Generate stabs debugging information for the current line. This is
531 used to produce debugging information for an assembler file. */
534 stabs_generate_asm_lineno ()
536 static int label_count
;
543 /* Rather than try to do this in some efficient fashion, we just
544 generate a string and then parse it again. That lets us use the
545 existing stabs hook, which expect to see a string, rather than
546 inventing new ones. */
548 hold
= input_line_pointer
;
550 as_where (&file
, &lineno
);
552 generate_asm_file (N_SOL
, file
);
554 sprintf (sym
, "%sL%d", FAKE_LABEL_NAME
, label_count
);
559 buf
= (char *) alloca (100 + strlen (current_function_label
));
560 sprintf (buf
, "%d,0,%d,%s-%s\n", N_SLINE
, lineno
,
561 sym
, current_function_label
);
565 buf
= (char *) alloca (100);
566 sprintf (buf
, "%d,0,%d,%s\n", N_SLINE
, lineno
, sym
);
568 input_line_pointer
= buf
;
572 input_line_pointer
= hold
;
575 /* Emit a function stab.
576 All assembler functions are assumed to have return type `void'. */
579 stabs_generate_asm_func (funcname
, startlabname
)
580 const char *funcname
;
581 const char *startlabname
;
583 static int void_emitted_p
;
584 char *hold
= input_line_pointer
;
589 if (! void_emitted_p
)
591 input_line_pointer
= "\"void:t1=1\",128,0,0,0";
596 as_where (&file
, &lineno
);
597 asprintf (&buf
, "\"%s:F1\",%d,0,%d,%s",
598 funcname
, N_FUN
, lineno
+ 1, startlabname
);
599 input_line_pointer
= buf
;
603 input_line_pointer
= hold
;
604 current_function_label
= xstrdup (startlabname
);
608 /* Emit a stab to record the end of a function. */
611 stabs_generate_asm_endfunc (funcname
, startlabname
)
612 const char *funcname
;
613 const char *startlabname
;
615 static int label_count
;
616 char *hold
= input_line_pointer
;
620 sprintf (sym
, "%sendfunc%d", FAKE_LABEL_NAME
, label_count
);
624 asprintf (&buf
, "\"\",%d,0,0,%s-%s", N_FUN
, sym
, startlabname
);
625 input_line_pointer
= buf
;
629 input_line_pointer
= hold
;
631 current_function_label
= NULL
;