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