Home | History | Annotate | Line # | Download | only in gas
stabs.c revision 1.1.1.8
      1      1.1     skrll /* Generic stabs parsing for gas.
      2  1.1.1.8  christos    Copyright (C) 1989-2020 Free Software Foundation, Inc.
      3      1.1     skrll 
      4      1.1     skrll    This file is part of GAS, the GNU Assembler.
      5      1.1     skrll 
      6      1.1     skrll    GAS is free software; you can redistribute it and/or modify
      7      1.1     skrll    it under the terms of the GNU General Public License as
      8      1.1     skrll    published by the Free Software Foundation; either version 3,
      9      1.1     skrll    or (at your option) any later version.
     10      1.1     skrll 
     11      1.1     skrll    GAS is distributed in the hope that it will be useful, but
     12      1.1     skrll    WITHOUT ANY WARRANTY; without even the implied warranty of
     13      1.1     skrll    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     14      1.1     skrll    the GNU General Public License for more details.
     15      1.1     skrll 
     16      1.1     skrll    You should have received a copy of the GNU General Public License
     17      1.1     skrll    along with GAS; see the file COPYING.  If not, write to the Free
     18      1.1     skrll    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
     19      1.1     skrll    02110-1301, USA.  */
     20      1.1     skrll 
     21      1.1     skrll #include "as.h"
     22  1.1.1.3  christos #include "filenames.h"
     23      1.1     skrll #include "obstack.h"
     24      1.1     skrll #include "subsegs.h"
     25      1.1     skrll #include "ecoff.h"
     26      1.1     skrll 
     27      1.1     skrll /* We need this, despite the apparent object format dependency, since
     28      1.1     skrll    it defines stab types, which all object formats can use now.  */
     29      1.1     skrll 
     30      1.1     skrll #include "aout/stab_gnu.h"
     31      1.1     skrll 
     32      1.1     skrll /* Holds whether the assembler is generating stabs line debugging
     33      1.1     skrll    information or not.  Potentially used by md_cleanup function.  */
     34      1.1     skrll 
     35      1.1     skrll int outputting_stabs_line_debug = 0;
     36      1.1     skrll 
     37  1.1.1.5  christos static void generate_asm_file (int, const char *);
     38      1.1     skrll 
     39      1.1     skrll /* Allow backends to override the names used for the stab sections.  */
     40      1.1     skrll #ifndef STAB_SECTION_NAME
     41      1.1     skrll #define STAB_SECTION_NAME ".stab"
     42      1.1     skrll #endif
     43      1.1     skrll 
     44      1.1     skrll #ifndef STAB_STRING_SECTION_NAME
     45      1.1     skrll #define STAB_STRING_SECTION_NAME ".stabstr"
     46      1.1     skrll #endif
     47      1.1     skrll 
     48  1.1.1.6  christos /* True if we're in the middle of a .func function, in which case
     49      1.1     skrll    stabs_generate_asm_lineno emits function relative line number stabs.
     50      1.1     skrll    Otherwise it emits line number stabs with absolute addresses.  Note that
     51      1.1     skrll    both cases only apply to assembler code assembled with -gstabs.  */
     52  1.1.1.6  christos static bfd_boolean in_dot_func_p = FALSE;
     53      1.1     skrll 
     54  1.1.1.6  christos /* Label at start of current function if in_dot_func_p != FALSE.  */
     55      1.1     skrll static const char *current_function_label;
     56      1.1     skrll 
     57      1.1     skrll /*
     58      1.1     skrll  * Handle .stabX directives, which used to be open-coded.
     59      1.1     skrll  * So much creeping featurism overloaded the semantics that we decided
     60      1.1     skrll  * to put all .stabX thinking in one place. Here.
     61      1.1     skrll  *
     62      1.1     skrll  * We try to make any .stabX directive legal. Other people's AS will often
     63      1.1     skrll  * do assembly-time consistency checks: eg assigning meaning to n_type bits
     64      1.1     skrll  * and "protecting" you from setting them to certain values. (They also zero
     65      1.1     skrll  * certain bits before emitting symbols. Tut tut.)
     66      1.1     skrll  *
     67      1.1     skrll  * If an expression is not absolute we either gripe or use the relocation
     68      1.1     skrll  * information. Other people's assemblers silently forget information they
     69      1.1     skrll  * don't need and invent information they need that you didn't supply.
     70      1.1     skrll  */
     71      1.1     skrll 
     72      1.1     skrll /*
     73      1.1     skrll  * Build a string dictionary entry for a .stabX symbol.
     74      1.1     skrll  * The symbol is added to the .<secname>str section.
     75      1.1     skrll  */
     76      1.1     skrll 
     77      1.1     skrll #ifndef SEPARATE_STAB_SECTIONS
     78      1.1     skrll #define SEPARATE_STAB_SECTIONS 0
     79      1.1     skrll #endif
     80      1.1     skrll 
     81      1.1     skrll unsigned int
     82  1.1.1.8  christos get_stab_string_offset (const char *string, const char *stabstr_secname,
     83  1.1.1.8  christos 			bfd_boolean free_stabstr_secname)
     84      1.1     skrll {
     85      1.1     skrll   unsigned int length;
     86      1.1     skrll   unsigned int retval;
     87      1.1     skrll   segT save_seg;
     88      1.1     skrll   subsegT save_subseg;
     89      1.1     skrll   segT seg;
     90      1.1     skrll   char *p;
     91      1.1     skrll 
     92      1.1     skrll   if (! SEPARATE_STAB_SECTIONS)
     93      1.1     skrll     abort ();
     94      1.1     skrll 
     95      1.1     skrll   length = strlen (string);
     96      1.1     skrll 
     97      1.1     skrll   save_seg = now_seg;
     98      1.1     skrll   save_subseg = now_subseg;
     99      1.1     skrll 
    100  1.1.1.8  christos   /* Create the stab string section, if it doesn't already exist.  */
    101      1.1     skrll   seg = subseg_new (stabstr_secname, 0);
    102  1.1.1.8  christos   if (free_stabstr_secname && seg->name != stabstr_secname)
    103  1.1.1.8  christos     free ((char *) stabstr_secname);
    104      1.1     skrll 
    105      1.1     skrll   retval = seg_info (seg)->stabu.stab_string_size;
    106      1.1     skrll   if (retval <= 0)
    107      1.1     skrll     {
    108      1.1     skrll       /* Make sure the first string is empty.  */
    109      1.1     skrll       p = frag_more (1);
    110      1.1     skrll       *p = 0;
    111      1.1     skrll       retval = seg_info (seg)->stabu.stab_string_size = 1;
    112  1.1.1.8  christos       bfd_set_section_flags (seg, SEC_READONLY | SEC_DEBUGGING);
    113      1.1     skrll     }
    114      1.1     skrll 
    115      1.1     skrll   if (length > 0)
    116      1.1     skrll     {				/* Ordinary case.  */
    117      1.1     skrll       p = frag_more (length + 1);
    118      1.1     skrll       strcpy (p, string);
    119      1.1     skrll 
    120      1.1     skrll       seg_info (seg)->stabu.stab_string_size += length + 1;
    121      1.1     skrll     }
    122      1.1     skrll   else
    123      1.1     skrll     retval = 0;
    124      1.1     skrll 
    125      1.1     skrll   subseg_set (save_seg, save_subseg);
    126      1.1     skrll 
    127      1.1     skrll   return retval;
    128      1.1     skrll }
    129      1.1     skrll 
    130      1.1     skrll #ifdef AOUT_STABS
    131      1.1     skrll #ifndef OBJ_PROCESS_STAB
    132      1.1     skrll #define OBJ_PROCESS_STAB(SEG,W,S,T,O,D)	aout_process_stab(W,S,T,O,D)
    133      1.1     skrll #endif
    134      1.1     skrll 
    135      1.1     skrll /* Here instead of obj-aout.c because other formats use it too.  */
    136      1.1     skrll void
    137  1.1.1.5  christos aout_process_stab (int what, const char *string, int type, int other, int desc)
    138      1.1     skrll {
    139      1.1     skrll   /* Put the stab information in the symbol table.  */
    140      1.1     skrll   symbolS *symbol;
    141      1.1     skrll 
    142      1.1     skrll   /* Create the symbol now, but only insert it into the symbol chain
    143      1.1     skrll      after any symbols mentioned in the value expression get into the
    144      1.1     skrll      symbol chain.  This is to avoid "continuation symbols" (where one
    145      1.1     skrll      ends in "\" and the debug info is continued in the next .stabs
    146      1.1     skrll      directive) from being separated by other random symbols.  */
    147      1.1     skrll   symbol = symbol_create (string, undefined_section, 0,
    148      1.1     skrll 			  &zero_address_frag);
    149      1.1     skrll   if (what == 's' || what == 'n')
    150      1.1     skrll     {
    151      1.1     skrll       /* Pick up the value from the input line.  */
    152      1.1     skrll       pseudo_set (symbol);
    153      1.1     skrll     }
    154      1.1     skrll   else
    155      1.1     skrll     {
    156      1.1     skrll       /* .stabd sets the name to NULL.  Why?  */
    157      1.1     skrll       S_SET_NAME (symbol, NULL);
    158      1.1     skrll       symbol_set_frag (symbol, frag_now);
    159      1.1     skrll       S_SET_VALUE (symbol, (valueT) frag_now_fix ());
    160      1.1     skrll     }
    161      1.1     skrll 
    162      1.1     skrll   symbol_append (symbol, symbol_lastP, &symbol_rootP, &symbol_lastP);
    163      1.1     skrll 
    164      1.1     skrll   symbol_get_bfdsym (symbol)->flags |= BSF_DEBUGGING;
    165      1.1     skrll 
    166      1.1     skrll   S_SET_TYPE (symbol, type);
    167      1.1     skrll   S_SET_OTHER (symbol, other);
    168      1.1     skrll   S_SET_DESC (symbol, desc);
    169      1.1     skrll }
    170      1.1     skrll #endif
    171      1.1     skrll 
    172      1.1     skrll /* This can handle different kinds of stabs (s,n,d) and different
    173  1.1.1.8  christos    kinds of stab sections.  If STAB_SECNAME_OBSTACK_END is non-NULL,
    174  1.1.1.8  christos    then STAB_SECNAME and STABSTR_SECNAME will be freed if possible
    175  1.1.1.8  christos    before this function returns (the former by obstack_free).  */
    176      1.1     skrll 
    177      1.1     skrll static void
    178  1.1.1.8  christos s_stab_generic (int what,
    179  1.1.1.8  christos 		const char *stab_secname,
    180  1.1.1.8  christos 		const char *stabstr_secname,
    181  1.1.1.8  christos 		const char *stab_secname_obstack_end)
    182      1.1     skrll {
    183      1.1     skrll   long longint;
    184  1.1.1.5  christos   const char *string;
    185  1.1.1.5  christos   char *saved_string_obstack_end;
    186      1.1     skrll   int type;
    187      1.1     skrll   int other;
    188      1.1     skrll   int desc;
    189      1.1     skrll 
    190      1.1     skrll   /* The general format is:
    191      1.1     skrll      .stabs "STRING",TYPE,OTHER,DESC,VALUE
    192      1.1     skrll      .stabn TYPE,OTHER,DESC,VALUE
    193      1.1     skrll      .stabd TYPE,OTHER,DESC
    194      1.1     skrll      At this point input_line_pointer points after the pseudo-op and
    195      1.1     skrll      any trailing whitespace.  The argument what is one of 's', 'n' or
    196      1.1     skrll      'd' indicating which type of .stab this is.  */
    197      1.1     skrll 
    198      1.1     skrll   if (what != 's')
    199      1.1     skrll     {
    200      1.1     skrll       string = "";
    201      1.1     skrll       saved_string_obstack_end = 0;
    202      1.1     skrll     }
    203      1.1     skrll   else
    204      1.1     skrll     {
    205      1.1     skrll       int length;
    206      1.1     skrll 
    207      1.1     skrll       string = demand_copy_C_string (&length);
    208  1.1.1.7  christos       if (string == NULL)
    209  1.1.1.7  christos 	{
    210  1.1.1.7  christos 	  as_warn (_(".stab%c: missing string"), what);
    211  1.1.1.7  christos 	  ignore_rest_of_line ();
    212  1.1.1.7  christos 	  return;
    213  1.1.1.7  christos 	}
    214      1.1     skrll       /* FIXME: We should probably find some other temporary storage
    215      1.1     skrll 	 for string, rather than leaking memory if someone else
    216      1.1     skrll 	 happens to use the notes obstack.  */
    217  1.1.1.8  christos       saved_string_obstack_end = obstack_next_free (&notes);
    218      1.1     skrll       SKIP_WHITESPACE ();
    219      1.1     skrll       if (*input_line_pointer == ',')
    220      1.1     skrll 	input_line_pointer++;
    221      1.1     skrll       else
    222      1.1     skrll 	{
    223      1.1     skrll 	  as_warn (_(".stab%c: missing comma"), what);
    224      1.1     skrll 	  ignore_rest_of_line ();
    225      1.1     skrll 	  return;
    226      1.1     skrll 	}
    227      1.1     skrll     }
    228      1.1     skrll 
    229      1.1     skrll   if (get_absolute_expression_and_terminator (&longint) != ',')
    230      1.1     skrll     {
    231      1.1     skrll       as_warn (_(".stab%c: missing comma"), what);
    232      1.1     skrll       ignore_rest_of_line ();
    233      1.1     skrll       return;
    234      1.1     skrll     }
    235      1.1     skrll   type = longint;
    236      1.1     skrll 
    237      1.1     skrll   if (get_absolute_expression_and_terminator (&longint) != ',')
    238      1.1     skrll     {
    239      1.1     skrll       as_warn (_(".stab%c: missing comma"), what);
    240      1.1     skrll       ignore_rest_of_line ();
    241      1.1     skrll       return;
    242      1.1     skrll     }
    243      1.1     skrll   other = longint;
    244      1.1     skrll 
    245      1.1     skrll   desc = get_absolute_expression ();
    246      1.1     skrll 
    247      1.1     skrll   if ((desc > 0xffff) || (desc < -0x8000))
    248      1.1     skrll     /* This could happen for example with a source file with a huge
    249      1.1     skrll        number of lines.  The only cure is to use a different debug
    250      1.1     skrll        format, probably DWARF.  */
    251      1.1     skrll     as_warn (_(".stab%c: description field '%x' too big, try a different debug format"),
    252      1.1     skrll 	     what, desc);
    253      1.1     skrll 
    254      1.1     skrll   if (what == 's' || what == 'n')
    255      1.1     skrll     {
    256      1.1     skrll       if (*input_line_pointer != ',')
    257      1.1     skrll 	{
    258      1.1     skrll 	  as_warn (_(".stab%c: missing comma"), what);
    259      1.1     skrll 	  ignore_rest_of_line ();
    260      1.1     skrll 	  return;
    261      1.1     skrll 	}
    262      1.1     skrll       input_line_pointer++;
    263      1.1     skrll       SKIP_WHITESPACE ();
    264      1.1     skrll     }
    265      1.1     skrll 
    266      1.1     skrll #ifdef TC_PPC
    267      1.1     skrll #ifdef OBJ_ELF
    268      1.1     skrll   /* Solaris on PowerPC has decided that .stabd can take 4 arguments, so if we were
    269      1.1     skrll      given 4 arguments, make it a .stabn */
    270      1.1     skrll   else if (what == 'd')
    271      1.1     skrll     {
    272      1.1     skrll       char *save_location = input_line_pointer;
    273      1.1     skrll 
    274      1.1     skrll       SKIP_WHITESPACE ();
    275      1.1     skrll       if (*input_line_pointer == ',')
    276      1.1     skrll 	{
    277      1.1     skrll 	  input_line_pointer++;
    278      1.1     skrll 	  what = 'n';
    279      1.1     skrll 	}
    280      1.1     skrll       else
    281      1.1     skrll 	input_line_pointer = save_location;
    282      1.1     skrll     }
    283      1.1     skrll #endif /* OBJ_ELF */
    284      1.1     skrll #endif /* TC_PPC */
    285      1.1     skrll 
    286      1.1     skrll #ifndef NO_LISTING
    287      1.1     skrll   if (listing)
    288      1.1     skrll     {
    289      1.1     skrll       switch (type)
    290      1.1     skrll 	{
    291      1.1     skrll 	case N_SLINE:
    292      1.1     skrll 	  listing_source_line ((unsigned int) desc);
    293      1.1     skrll 	  break;
    294      1.1     skrll 	case N_SO:
    295      1.1     skrll 	case N_SOL:
    296      1.1     skrll 	  listing_source_file (string);
    297      1.1     skrll 	  break;
    298      1.1     skrll 	}
    299      1.1     skrll     }
    300      1.1     skrll #endif /* ! NO_LISTING */
    301      1.1     skrll 
    302      1.1     skrll   /* We have now gathered the type, other, and desc information.  For
    303      1.1     skrll      .stabs or .stabn, input_line_pointer is now pointing at the
    304      1.1     skrll      value.  */
    305      1.1     skrll 
    306      1.1     skrll   if (SEPARATE_STAB_SECTIONS)
    307      1.1     skrll     /* Output the stab information in a separate section.  This is used
    308      1.1     skrll        at least for COFF and ELF.  */
    309      1.1     skrll     {
    310      1.1     skrll       segT saved_seg = now_seg;
    311      1.1     skrll       subsegT saved_subseg = now_subseg;
    312      1.1     skrll       fragS *saved_frag = frag_now;
    313      1.1     skrll       valueT dot;
    314      1.1     skrll       segT seg;
    315      1.1     skrll       unsigned int stroff;
    316      1.1     skrll       char *p;
    317      1.1     skrll 
    318      1.1     skrll       static segT cached_sec;
    319      1.1     skrll 
    320      1.1     skrll       dot = frag_now_fix ();
    321      1.1     skrll 
    322      1.1     skrll #ifdef md_flush_pending_output
    323      1.1     skrll       md_flush_pending_output ();
    324      1.1     skrll #endif
    325      1.1     skrll 
    326  1.1.1.8  christos       if (cached_sec && strcmp (cached_sec->name, stab_secname) == 0)
    327      1.1     skrll 	{
    328      1.1     skrll 	  seg = cached_sec;
    329      1.1     skrll 	  subseg_set (seg, 0);
    330      1.1     skrll 	}
    331      1.1     skrll       else
    332      1.1     skrll 	{
    333      1.1     skrll 	  seg = subseg_new (stab_secname, 0);
    334      1.1     skrll 	  cached_sec = seg;
    335      1.1     skrll 	}
    336      1.1     skrll 
    337      1.1     skrll       if (! seg_info (seg)->hadone)
    338      1.1     skrll 	{
    339  1.1.1.8  christos 	  bfd_set_section_flags (seg,
    340      1.1     skrll 				 SEC_READONLY | SEC_RELOC | SEC_DEBUGGING);
    341      1.1     skrll #ifdef INIT_STAB_SECTION
    342      1.1     skrll 	  INIT_STAB_SECTION (seg);
    343      1.1     skrll #endif
    344      1.1     skrll 	  seg_info (seg)->hadone = 1;
    345      1.1     skrll 	}
    346      1.1     skrll 
    347  1.1.1.8  christos       stroff = get_stab_string_offset (string, stabstr_secname,
    348  1.1.1.8  christos 				       stab_secname_obstack_end != NULL);
    349  1.1.1.8  christos 
    350  1.1.1.8  christos       /* Release the string, if nobody else has used the obstack.  */
    351  1.1.1.8  christos       if (saved_string_obstack_end != NULL
    352  1.1.1.8  christos 	  && saved_string_obstack_end == obstack_next_free (&notes))
    353  1.1.1.8  christos 	obstack_free (&notes, string);
    354  1.1.1.8  christos       /* Similarly for the section name.  This must be done before
    355  1.1.1.8  christos 	 creating symbols below, which uses the notes obstack.  */
    356  1.1.1.8  christos       if (seg->name != stab_secname
    357  1.1.1.8  christos 	  && stab_secname_obstack_end != NULL
    358  1.1.1.8  christos 	  && stab_secname_obstack_end == obstack_next_free (&notes))
    359  1.1.1.8  christos 	obstack_free (&notes, stab_secname);
    360      1.1     skrll 
    361      1.1     skrll       /* At least for now, stabs in a special stab section are always
    362      1.1     skrll 	 output as 12 byte blocks of information.  */
    363      1.1     skrll       p = frag_more (8);
    364      1.1     skrll       md_number_to_chars (p, (valueT) stroff, 4);
    365      1.1     skrll       md_number_to_chars (p + 4, (valueT) type, 1);
    366      1.1     skrll       md_number_to_chars (p + 5, (valueT) other, 1);
    367      1.1     skrll       md_number_to_chars (p + 6, (valueT) desc, 2);
    368      1.1     skrll 
    369      1.1     skrll       if (what == 's' || what == 'n')
    370      1.1     skrll 	{
    371      1.1     skrll 	  /* Pick up the value from the input line.  */
    372      1.1     skrll 	  cons (4);
    373      1.1     skrll 	  input_line_pointer--;
    374      1.1     skrll 	}
    375      1.1     skrll       else
    376      1.1     skrll 	{
    377      1.1     skrll 	  symbolS *symbol;
    378      1.1     skrll 	  expressionS exp;
    379      1.1     skrll 
    380      1.1     skrll 	  /* Arrange for a value representing the current location.  */
    381      1.1     skrll 	  symbol = symbol_temp_new (saved_seg, dot, saved_frag);
    382      1.1     skrll 
    383      1.1     skrll 	  exp.X_op = O_symbol;
    384      1.1     skrll 	  exp.X_add_symbol = symbol;
    385      1.1     skrll 	  exp.X_add_number = 0;
    386      1.1     skrll 
    387      1.1     skrll 	  emit_expr (&exp, 4);
    388      1.1     skrll 	}
    389      1.1     skrll 
    390      1.1     skrll #ifdef OBJ_PROCESS_STAB
    391      1.1     skrll       OBJ_PROCESS_STAB (seg, what, string, type, other, desc);
    392      1.1     skrll #endif
    393      1.1     skrll 
    394      1.1     skrll       subseg_set (saved_seg, saved_subseg);
    395      1.1     skrll     }
    396      1.1     skrll   else
    397      1.1     skrll     {
    398  1.1.1.8  christos       if (stab_secname_obstack_end != NULL)
    399  1.1.1.8  christos 	{
    400  1.1.1.8  christos 	  free ((char *) stabstr_secname);
    401  1.1.1.8  christos 	  if (stab_secname_obstack_end == obstack_next_free (&notes))
    402  1.1.1.8  christos 	    obstack_free (&notes, stab_secname);
    403  1.1.1.8  christos 	}
    404      1.1     skrll #ifdef OBJ_PROCESS_STAB
    405      1.1     skrll       OBJ_PROCESS_STAB (0, what, string, type, other, desc);
    406      1.1     skrll #else
    407      1.1     skrll       abort ();
    408      1.1     skrll #endif
    409      1.1     skrll     }
    410      1.1     skrll 
    411      1.1     skrll   demand_empty_rest_of_line ();
    412      1.1     skrll }
    413      1.1     skrll 
    414      1.1     skrll /* Regular stab directive.  */
    415      1.1     skrll 
    416      1.1     skrll void
    417      1.1     skrll s_stab (int what)
    418      1.1     skrll {
    419  1.1.1.8  christos   s_stab_generic (what, STAB_SECTION_NAME, STAB_STRING_SECTION_NAME, NULL);
    420      1.1     skrll }
    421      1.1     skrll 
    422      1.1     skrll /* "Extended stabs", used in Solaris only now.  */
    423      1.1     skrll 
    424      1.1     skrll void
    425      1.1     skrll s_xstab (int what)
    426      1.1     skrll {
    427      1.1     skrll   int length;
    428  1.1.1.8  christos   char *stab_secname, *stabstr_secname, *stab_secname_obstack_end;
    429      1.1     skrll 
    430      1.1     skrll   stab_secname = demand_copy_C_string (&length);
    431  1.1.1.8  christos   stab_secname_obstack_end = obstack_next_free (&notes);
    432      1.1     skrll   SKIP_WHITESPACE ();
    433      1.1     skrll   if (*input_line_pointer == ',')
    434      1.1     skrll     input_line_pointer++;
    435      1.1     skrll   else
    436      1.1     skrll     {
    437      1.1     skrll       as_bad (_("comma missing in .xstabs"));
    438      1.1     skrll       ignore_rest_of_line ();
    439      1.1     skrll       return;
    440      1.1     skrll     }
    441      1.1     skrll 
    442      1.1     skrll   /* To get the name of the stab string section, simply add "str" to
    443      1.1     skrll      the stab section name.  */
    444  1.1.1.8  christos   stabstr_secname = concat (stab_secname, "str", (char *) NULL);
    445  1.1.1.8  christos   s_stab_generic (what, stab_secname, stabstr_secname,
    446  1.1.1.8  christos 		  stab_secname_obstack_end);
    447      1.1     skrll }
    448      1.1     skrll 
    449      1.1     skrll #ifdef S_SET_DESC
    450      1.1     skrll 
    451      1.1     skrll /* Frob invented at RMS' request. Set the n_desc of a symbol.  */
    452      1.1     skrll 
    453      1.1     skrll void
    454  1.1.1.5  christos s_desc (int ignore ATTRIBUTE_UNUSED)
    455      1.1     skrll {
    456      1.1     skrll   char *name;
    457      1.1     skrll   char c;
    458      1.1     skrll   char *p;
    459      1.1     skrll   symbolS *symbolP;
    460      1.1     skrll   int temp;
    461      1.1     skrll 
    462  1.1.1.4  christos   c = get_symbol_name (&name);
    463      1.1     skrll   p = input_line_pointer;
    464      1.1     skrll   *p = c;
    465  1.1.1.4  christos   SKIP_WHITESPACE_AFTER_NAME ();
    466      1.1     skrll   if (*input_line_pointer != ',')
    467      1.1     skrll     {
    468      1.1     skrll       *p = 0;
    469      1.1     skrll       as_bad (_("expected comma after \"%s\""), name);
    470      1.1     skrll       *p = c;
    471      1.1     skrll       ignore_rest_of_line ();
    472      1.1     skrll     }
    473      1.1     skrll   else
    474      1.1     skrll     {
    475      1.1     skrll       input_line_pointer++;
    476      1.1     skrll       temp = get_absolute_expression ();
    477      1.1     skrll       *p = 0;
    478      1.1     skrll       symbolP = symbol_find_or_make (name);
    479      1.1     skrll       *p = c;
    480      1.1     skrll       S_SET_DESC (symbolP, temp);
    481      1.1     skrll     }
    482      1.1     skrll   demand_empty_rest_of_line ();
    483      1.1     skrll }				/* s_desc() */
    484      1.1     skrll 
    485      1.1     skrll #endif /* defined (S_SET_DESC) */
    486      1.1     skrll 
    487      1.1     skrll /* Generate stabs debugging information to denote the main source file.  */
    488      1.1     skrll 
    489      1.1     skrll void
    490      1.1     skrll stabs_generate_asm_file (void)
    491      1.1     skrll {
    492  1.1.1.5  christos   const char *file;
    493      1.1     skrll   unsigned int lineno;
    494      1.1     skrll 
    495  1.1.1.5  christos   file = as_where (&lineno);
    496      1.1     skrll   if (use_gnu_debug_info_extensions)
    497      1.1     skrll     {
    498      1.1     skrll       const char *dir;
    499      1.1     skrll       char *dir2;
    500      1.1     skrll 
    501      1.1     skrll       dir = remap_debug_filename (getpwd ());
    502  1.1.1.5  christos       dir2 = concat (dir, "/", NULL);
    503      1.1     skrll       generate_asm_file (N_SO, dir2);
    504  1.1.1.5  christos       free (dir2);
    505  1.1.1.3  christos       xfree ((char *) dir);
    506      1.1     skrll     }
    507      1.1     skrll   generate_asm_file (N_SO, file);
    508      1.1     skrll }
    509      1.1     skrll 
    510      1.1     skrll /* Generate stabs debugging information to denote the source file.
    511      1.1     skrll    TYPE is one of N_SO, N_SOL.  */
    512      1.1     skrll 
    513      1.1     skrll static void
    514  1.1.1.5  christos generate_asm_file (int type, const char *file)
    515      1.1     skrll {
    516      1.1     skrll   static char *last_file;
    517      1.1     skrll   static int label_count;
    518      1.1     skrll   char sym[30];
    519      1.1     skrll   char *buf;
    520  1.1.1.5  christos   const char *tmp = file;
    521  1.1.1.5  christos   const char *file_endp = file + strlen (file);
    522      1.1     skrll   char *bufp;
    523      1.1     skrll 
    524      1.1     skrll   if (last_file != NULL
    525  1.1.1.3  christos       && filename_cmp (last_file, file) == 0)
    526      1.1     skrll     return;
    527      1.1     skrll 
    528      1.1     skrll   /* Rather than try to do this in some efficient fashion, we just
    529      1.1     skrll      generate a string and then parse it again.  That lets us use the
    530      1.1     skrll      existing stabs hook, which expect to see a string, rather than
    531      1.1     skrll      inventing new ones.  */
    532      1.1     skrll   sprintf (sym, "%sF%d", FAKE_LABEL_NAME, label_count);
    533      1.1     skrll   ++label_count;
    534      1.1     skrll 
    535      1.1     skrll   /* Allocate enough space for the file name (possibly extended with
    536      1.1     skrll      doubled up backslashes), the symbol name, and the other characters
    537      1.1     skrll      that make up a stabs file directive.  */
    538  1.1.1.5  christos   bufp = buf = XNEWVEC (char, 2 * strlen (file) + strlen (sym) + 12);
    539      1.1     skrll 
    540      1.1     skrll   *bufp++ = '"';
    541      1.1     skrll 
    542  1.1.1.2  christos   while (tmp < file_endp)
    543      1.1     skrll     {
    544  1.1.1.5  christos       const char *bslash = strchr (tmp, '\\');
    545  1.1.1.7  christos       size_t len = bslash != NULL ? bslash - tmp + 1 : file_endp - tmp;
    546      1.1     skrll 
    547      1.1     skrll       /* Double all backslashes, since demand_copy_C_string (used by
    548      1.1     skrll 	 s_stab to extract the part in quotes) will try to replace them as
    549      1.1     skrll 	 escape sequences.  backslash may appear in a filespec.  */
    550  1.1.1.7  christos       memcpy (bufp, tmp, len);
    551      1.1     skrll 
    552      1.1     skrll       tmp += len;
    553      1.1     skrll       bufp += len;
    554      1.1     skrll 
    555      1.1     skrll       if (bslash != NULL)
    556      1.1     skrll 	*bufp++ = '\\';
    557      1.1     skrll     }
    558      1.1     skrll 
    559      1.1     skrll   sprintf (bufp, "\",%d,0,0,%s\n", type, sym);
    560      1.1     skrll 
    561  1.1.1.6  christos   temp_ilp (buf);
    562      1.1     skrll   s_stab ('s');
    563  1.1.1.6  christos   restore_ilp ();
    564  1.1.1.6  christos 
    565      1.1     skrll   colon (sym);
    566      1.1     skrll 
    567      1.1     skrll   if (last_file != NULL)
    568      1.1     skrll     free (last_file);
    569      1.1     skrll   last_file = xstrdup (file);
    570      1.1     skrll 
    571      1.1     skrll   free (buf);
    572      1.1     skrll }
    573      1.1     skrll 
    574      1.1     skrll /* Generate stabs debugging information for the current line.  This is
    575      1.1     skrll    used to produce debugging information for an assembler file.  */
    576      1.1     skrll 
    577      1.1     skrll void
    578      1.1     skrll stabs_generate_asm_lineno (void)
    579      1.1     skrll {
    580      1.1     skrll   static int label_count;
    581  1.1.1.5  christos   const char *file;
    582      1.1     skrll   unsigned int lineno;
    583      1.1     skrll   char *buf;
    584      1.1     skrll   char sym[30];
    585      1.1     skrll   /* Remember the last file/line and avoid duplicates.  */
    586      1.1     skrll   static unsigned int prev_lineno = -1;
    587      1.1     skrll   static char *prev_file = NULL;
    588      1.1     skrll 
    589      1.1     skrll   /* Rather than try to do this in some efficient fashion, we just
    590      1.1     skrll      generate a string and then parse it again.  That lets us use the
    591      1.1     skrll      existing stabs hook, which expect to see a string, rather than
    592      1.1     skrll      inventing new ones.  */
    593      1.1     skrll 
    594  1.1.1.5  christos   file = as_where (&lineno);
    595      1.1     skrll 
    596      1.1     skrll   /* Don't emit sequences of stabs for the same line.  */
    597      1.1     skrll   if (prev_file == NULL)
    598      1.1     skrll     {
    599  1.1.1.6  christos       /* First time through.  */
    600      1.1     skrll       prev_file = xstrdup (file);
    601      1.1     skrll       prev_lineno = lineno;
    602      1.1     skrll     }
    603      1.1     skrll   else if (lineno == prev_lineno
    604  1.1.1.3  christos 	   && filename_cmp (file, prev_file) == 0)
    605      1.1     skrll     {
    606      1.1     skrll       /* Same file/line as last time.  */
    607      1.1     skrll       return;
    608      1.1     skrll     }
    609      1.1     skrll   else
    610      1.1     skrll     {
    611      1.1     skrll       /* Remember file/line for next time.  */
    612      1.1     skrll       prev_lineno = lineno;
    613  1.1.1.3  christos       if (filename_cmp (file, prev_file) != 0)
    614      1.1     skrll 	{
    615      1.1     skrll 	  free (prev_file);
    616      1.1     skrll 	  prev_file = xstrdup (file);
    617      1.1     skrll 	}
    618      1.1     skrll     }
    619      1.1     skrll 
    620      1.1     skrll   /* Let the world know that we are in the middle of generating a
    621      1.1     skrll      piece of stabs line debugging information.  */
    622      1.1     skrll   outputting_stabs_line_debug = 1;
    623      1.1     skrll 
    624      1.1     skrll   generate_asm_file (N_SOL, file);
    625      1.1     skrll 
    626      1.1     skrll   sprintf (sym, "%sL%d", FAKE_LABEL_NAME, label_count);
    627      1.1     skrll   ++label_count;
    628      1.1     skrll 
    629      1.1     skrll   if (in_dot_func_p)
    630      1.1     skrll     {
    631  1.1.1.5  christos       buf = XNEWVEC (char, 100 + strlen (current_function_label));
    632      1.1     skrll       sprintf (buf, "%d,0,%d,%s-%s\n", N_SLINE, lineno,
    633      1.1     skrll 	       sym, current_function_label);
    634      1.1     skrll     }
    635      1.1     skrll   else
    636      1.1     skrll     {
    637  1.1.1.5  christos       buf = XNEWVEC (char, 100);
    638      1.1     skrll       sprintf (buf, "%d,0,%d,%s\n", N_SLINE, lineno, sym);
    639      1.1     skrll     }
    640  1.1.1.6  christos 
    641  1.1.1.6  christos   temp_ilp (buf);
    642      1.1     skrll   s_stab ('n');
    643  1.1.1.6  christos   restore_ilp ();
    644  1.1.1.6  christos 
    645      1.1     skrll   colon (sym);
    646      1.1     skrll 
    647      1.1     skrll   outputting_stabs_line_debug = 0;
    648  1.1.1.5  christos   free (buf);
    649      1.1     skrll }
    650      1.1     skrll 
    651      1.1     skrll /* Emit a function stab.
    652      1.1     skrll    All assembler functions are assumed to have return type `void'.  */
    653      1.1     skrll 
    654      1.1     skrll void
    655      1.1     skrll stabs_generate_asm_func (const char *funcname, const char *startlabname)
    656      1.1     skrll {
    657  1.1.1.6  christos   static bfd_boolean void_emitted_p = FALSE;
    658      1.1     skrll   char *buf;
    659      1.1     skrll   unsigned int lineno;
    660      1.1     skrll 
    661      1.1     skrll   if (! void_emitted_p)
    662      1.1     skrll     {
    663  1.1.1.6  christos       temp_ilp ((char *) "\"void:t1=1\",128,0,0,0");
    664      1.1     skrll       s_stab ('s');
    665  1.1.1.6  christos       restore_ilp ();
    666  1.1.1.6  christos       void_emitted_p = TRUE;
    667      1.1     skrll     }
    668      1.1     skrll 
    669  1.1.1.5  christos   as_where (&lineno);
    670      1.1     skrll   if (asprintf (&buf, "\"%s:F1\",%d,0,%d,%s",
    671      1.1     skrll 		funcname, N_FUN, lineno + 1, startlabname) == -1)
    672      1.1     skrll     as_fatal ("%s", xstrerror (errno));
    673  1.1.1.6  christos 
    674  1.1.1.6  christos   temp_ilp (buf);
    675      1.1     skrll   s_stab ('s');
    676  1.1.1.6  christos   restore_ilp ();
    677      1.1     skrll   free (buf);
    678      1.1     skrll 
    679      1.1     skrll   current_function_label = xstrdup (startlabname);
    680  1.1.1.6  christos   in_dot_func_p = TRUE;
    681      1.1     skrll }
    682      1.1     skrll 
    683      1.1     skrll /* Emit a stab to record the end of a function.  */
    684      1.1     skrll 
    685      1.1     skrll void
    686      1.1     skrll stabs_generate_asm_endfunc (const char *funcname ATTRIBUTE_UNUSED,
    687      1.1     skrll 			    const char *startlabname)
    688      1.1     skrll {
    689      1.1     skrll   static int label_count;
    690      1.1     skrll   char *buf;
    691      1.1     skrll   char sym[30];
    692      1.1     skrll 
    693      1.1     skrll   sprintf (sym, "%sendfunc%d", FAKE_LABEL_NAME, label_count);
    694      1.1     skrll   ++label_count;
    695      1.1     skrll   colon (sym);
    696      1.1     skrll 
    697      1.1     skrll   if (asprintf (&buf, "\"\",%d,0,0,%s-%s", N_FUN, sym, startlabname) == -1)
    698      1.1     skrll     as_fatal ("%s", xstrerror (errno));
    699  1.1.1.6  christos 
    700  1.1.1.6  christos   temp_ilp (buf);
    701      1.1     skrll   s_stab ('s');
    702  1.1.1.6  christos   restore_ilp ();
    703      1.1     skrll   free (buf);
    704      1.1     skrll 
    705  1.1.1.6  christos   in_dot_func_p = FALSE;
    706      1.1     skrll   current_function_label = NULL;
    707      1.1     skrll }
    708