OSDN Git Service

* dwarf2dbg.c (dwarf2_emit_insn): Simplify test before dwarf2_where
[pf3gnuchains/pf3gnuchains4x.git] / gas / dwarf2dbg.c
1 /* dwarf2dbg.c - DWARF2 debug support
2    Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3    Free Software Foundation, Inc.
4    Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
5
6    This file is part of GAS, the GNU Assembler.
7
8    GAS is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3, or (at your option)
11    any later version.
12
13    GAS is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with GAS; see the file COPYING.  If not, write to the Free
20    Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21    02110-1301, USA.  */
22
23 /* Logical line numbers can be controlled by the compiler via the
24    following directives:
25
26         .file FILENO "file.c"
27         .loc  FILENO LINENO [COLUMN] [basic_block] [prologue_end] \
28               [epilogue_begin] [is_stmt VALUE] [isa VALUE]
29 */
30
31 #include "as.h"
32 #include "safe-ctype.h"
33
34 #ifdef HAVE_LIMITS_H
35 #include <limits.h>
36 #else
37 #ifdef HAVE_SYS_PARAM_H
38 #include <sys/param.h>
39 #endif
40 #ifndef INT_MAX
41 #define INT_MAX (int) (((unsigned) (-1)) >> 1)
42 #endif
43 #endif
44
45 #include "dwarf2dbg.h"
46 #include <filenames.h>
47
48 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
49 /* We need to decide which character to use as a directory separator.
50    Just because HAVE_DOS_BASED_FILE_SYSTEM is defined, it does not
51    necessarily mean that the backslash character is the one to use.
52    Some environments, eg Cygwin, can support both naming conventions.
53    So we use the heuristic that we only need to use the backslash if
54    the path is an absolute path starting with a DOS style drive
55    selector.  eg C: or D:  */
56 # define INSERT_DIR_SEPARATOR(string, offset) \
57   do \
58     { \
59       if (offset > 1 \
60           && string[0] != 0 \
61           && string[1] == ':') \
62        string [offset] = '\\'; \
63       else \
64        string [offset] = '/'; \
65     } \
66   while (0)
67 #else
68 # define INSERT_DIR_SEPARATOR(string, offset) string[offset] = '/'
69 #endif
70
71 #ifndef DWARF2_FORMAT
72 # define DWARF2_FORMAT() dwarf2_format_32bit
73 #endif
74
75 #ifndef DWARF2_ADDR_SIZE
76 # define DWARF2_ADDR_SIZE(bfd) (bfd_arch_bits_per_address (bfd) / 8)
77 #endif
78
79 #include "subsegs.h"
80
81 #include "elf/dwarf2.h"
82
83 /* Since we can't generate the prolog until the body is complete, we
84    use three different subsegments for .debug_line: one holding the
85    prolog, one for the directory and filename info, and one for the
86    body ("statement program").  */
87 #define DL_PROLOG       0
88 #define DL_FILES        1
89 #define DL_BODY         2
90
91 /* If linker relaxation might change offsets in the code, the DWARF special
92    opcodes and variable-length operands cannot be used.  If this macro is
93    nonzero, use the DW_LNS_fixed_advance_pc opcode instead.  */
94 #ifndef DWARF2_USE_FIXED_ADVANCE_PC
95 # define DWARF2_USE_FIXED_ADVANCE_PC    0
96 #endif
97
98 /* First special line opcde - leave room for the standard opcodes.
99    Note: If you want to change this, you'll have to update the
100    "standard_opcode_lengths" table that is emitted below in
101    out_debug_line().  */
102 #define DWARF2_LINE_OPCODE_BASE         13
103
104 #ifndef DWARF2_LINE_BASE
105   /* Minimum line offset in a special line info. opcode.  This value
106      was chosen to give a reasonable range of values.  */
107 # define DWARF2_LINE_BASE               -5
108 #endif
109
110 /* Range of line offsets in a special line info. opcode.  */
111 #ifndef DWARF2_LINE_RANGE
112 # define DWARF2_LINE_RANGE              14
113 #endif
114
115 #ifndef DWARF2_LINE_MIN_INSN_LENGTH
116   /* Define the architecture-dependent minimum instruction length (in
117      bytes).  This value should be rather too small than too big.  */
118 # define DWARF2_LINE_MIN_INSN_LENGTH    1
119 #endif
120
121 /* Flag that indicates the initial value of the is_stmt_start flag.  */
122 #define DWARF2_LINE_DEFAULT_IS_STMT     1
123
124 /* Given a special op, return the line skip amount.  */
125 #define SPECIAL_LINE(op) \
126         (((op) - DWARF2_LINE_OPCODE_BASE)%DWARF2_LINE_RANGE + DWARF2_LINE_BASE)
127
128 /* Given a special op, return the address skip amount (in units of
129    DWARF2_LINE_MIN_INSN_LENGTH.  */
130 #define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
131
132 /* The maximum address skip amount that can be encoded with a special op.  */
133 #define MAX_SPECIAL_ADDR_DELTA          SPECIAL_ADDR(255)
134
135 struct line_entry {
136   struct line_entry *next;
137   symbolS *label;
138   struct dwarf2_line_info loc;
139 };
140
141 struct line_subseg {
142   struct line_subseg *next;
143   subsegT subseg;
144   struct line_entry *head;
145   struct line_entry **ptail;
146 };
147
148 struct line_seg {
149   struct line_seg *next;
150   segT seg;
151   struct line_subseg *head;
152   symbolS *text_start;
153   symbolS *text_end;
154 };
155
156 /* Collects data for all line table entries during assembly.  */
157 static struct line_seg *all_segs;
158
159 struct file_entry {
160   const char *filename;
161   unsigned int dir;
162 };
163
164 /* Table of files used by .debug_line.  */
165 static struct file_entry *files;
166 static unsigned int files_in_use;
167 static unsigned int files_allocated;
168
169 /* Table of directories used by .debug_line.  */
170 static char **dirs;
171 static unsigned int dirs_in_use;
172 static unsigned int dirs_allocated;
173
174 /* TRUE when we've seen a .loc directive recently.  Used to avoid
175    doing work when there's nothing to do.  */
176 bfd_boolean dwarf2_loc_directive_seen;
177
178 /* TRUE when we're supposed to set the basic block mark whenever a
179    label is seen.  */
180 bfd_boolean dwarf2_loc_mark_labels;
181
182 /* Current location as indicated by the most recent .loc directive.  */
183 static struct dwarf2_line_info current = {
184   1, 1, 0, 0,
185   DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0
186 };
187
188 /* The size of an address on the target.  */
189 static unsigned int sizeof_address;
190 \f
191 static struct line_subseg *get_line_subseg (segT, subsegT);
192 static unsigned int get_filenum (const char *, unsigned int);
193 static struct frag *first_frag_for_seg (segT);
194 static struct frag *last_frag_for_seg (segT);
195 static void out_byte (int);
196 static void out_opcode (int);
197 static void out_two (int);
198 static void out_four (int);
199 static void out_abbrev (int, int);
200 static void out_uleb128 (addressT);
201 static offsetT get_frag_fix (fragS *, segT);
202 static void out_set_addr (symbolS *);
203 static int size_inc_line_addr (int, addressT);
204 static void emit_inc_line_addr (int, addressT, char *, int);
205 static int size_fixed_inc_line_addr (int, addressT);
206 static void emit_fixed_inc_line_addr (int, addressT, fragS *, char *, int);
207 static void out_inc_line_addr (int, addressT);
208 static void relax_inc_line_addr (int, symbolS *, symbolS *);
209 static void process_entries (segT, struct line_entry *);
210 static void out_file_list (void);
211 static void out_debug_line (segT);
212 static void out_debug_aranges (segT, segT);
213 static void out_debug_abbrev (segT);
214 \f
215 #ifndef TC_DWARF2_EMIT_OFFSET
216 #define TC_DWARF2_EMIT_OFFSET  generic_dwarf2_emit_offset
217
218 /* Create an offset to .dwarf2_*.  */
219
220 static void
221 generic_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
222 {
223   expressionS expr;
224
225   expr.X_op = O_symbol;
226   expr.X_add_symbol = symbol;
227   expr.X_add_number = 0;
228   emit_expr (&expr, size);
229 }
230 #endif
231
232 /* Find or create an entry for SEG+SUBSEG in ALL_SEGS.  */
233
234 static struct line_subseg *
235 get_line_subseg (segT seg, subsegT subseg)
236 {
237   static segT last_seg;
238   static subsegT last_subseg;
239   static struct line_subseg *last_line_subseg;
240
241   struct line_seg **ps, *s;
242   struct line_subseg **pss, *ss;
243
244   if (seg == last_seg && subseg == last_subseg)
245     return last_line_subseg;
246
247   for (ps = &all_segs; (s = *ps) != NULL; ps = &s->next)
248     if (s->seg == seg)
249       goto found_seg;
250
251   s = (struct line_seg *) xmalloc (sizeof (*s));
252   s->next = NULL;
253   s->seg = seg;
254   s->head = NULL;
255   *ps = s;
256
257  found_seg:
258   for (pss = &s->head; (ss = *pss) != NULL ; pss = &ss->next)
259     {
260       if (ss->subseg == subseg)
261         goto found_subseg;
262       if (ss->subseg > subseg)
263         break;
264     }
265
266   ss = (struct line_subseg *) xmalloc (sizeof (*ss));
267   ss->next = *pss;
268   ss->subseg = subseg;
269   ss->head = NULL;
270   ss->ptail = &ss->head;
271   *pss = ss;
272
273  found_subseg:
274   last_seg = seg;
275   last_subseg = subseg;
276   last_line_subseg = ss;
277
278   return ss;
279 }
280
281 /* Record an entry for LOC occurring at LABEL.  */
282
283 static void
284 dwarf2_gen_line_info_1 (symbolS *label, struct dwarf2_line_info *loc)
285 {
286   struct line_subseg *ss;
287   struct line_entry *e;
288
289   e = (struct line_entry *) xmalloc (sizeof (*e));
290   e->next = NULL;
291   e->label = label;
292   e->loc = *loc;
293
294   ss = get_line_subseg (now_seg, now_subseg);
295   *ss->ptail = e;
296   ss->ptail = &e->next;
297 }
298
299 /* Record an entry for LOC occurring at OFS within the current fragment.  */
300
301 void
302 dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
303 {
304   static unsigned int line = -1;
305   static unsigned int filenum = -1;
306
307   symbolS *sym;
308
309   /* Early out for as-yet incomplete location information.  */
310   if (loc->filenum == 0 || loc->line == 0)
311     return;
312
313   /* Don't emit sequences of line symbols for the same line when the
314      symbols apply to assembler code.  It is necessary to emit
315      duplicate line symbols when a compiler asks for them, because GDB
316      uses them to determine the end of the prologue.  */
317   if (debug_type == DEBUG_DWARF2
318       && line == loc->line && filenum == loc->filenum)
319     return;
320
321   line = loc->line;
322   filenum = loc->filenum;
323
324   sym = symbol_temp_new (now_seg, ofs, frag_now);
325   dwarf2_gen_line_info_1 (sym, loc);
326 }
327
328 /* Returns the current source information.  If .file directives have
329    been encountered, the info for the corresponding source file is
330    returned.  Otherwise, the info for the assembly source file is
331    returned.  */
332
333 void
334 dwarf2_where (struct dwarf2_line_info *line)
335 {
336   if (debug_type == DEBUG_DWARF2)
337     {
338       char *filename;
339       as_where (&filename, &line->line);
340       line->filenum = get_filenum (filename, 0);
341       line->column = 0;
342       line->flags = DWARF2_FLAG_IS_STMT;
343       line->isa = current.isa;
344     }
345   else
346     *line = current;
347 }
348
349 /* A hook to allow the target backend to inform the line number state
350    machine of isa changes when assembler debug info is enabled.  */
351
352 void
353 dwarf2_set_isa (unsigned int isa)
354 {
355   current.isa = isa;
356 }
357
358 /* Called for each machine instruction, or relatively atomic group of
359    machine instructions (ie built-in macro).  The instruction or group
360    is SIZE bytes in length.  If dwarf2 line number generation is called
361    for, emit a line statement appropriately.  */
362
363 void
364 dwarf2_emit_insn (int size)
365 {
366   struct dwarf2_line_info loc;
367
368   if (!dwarf2_loc_directive_seen && debug_type != DEBUG_DWARF2)
369     return;
370
371   dwarf2_where (&loc);
372
373   dwarf2_gen_line_info (frag_now_fix () - size, &loc);
374   dwarf2_consume_line_info ();
375 }
376
377 /* Called after the current line information has been either used with
378    dwarf2_gen_line_info or saved with a machine instruction for later use.
379    This resets the state of the line number information to reflect that
380    it has been used.  */
381
382 void
383 dwarf2_consume_line_info (void)
384 {
385   /* Unless we generate DWARF2 debugging information for each
386      assembler line, we only emit one line symbol for one LOC.  */
387   dwarf2_loc_directive_seen = FALSE;
388
389   current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK
390                      | DWARF2_FLAG_PROLOGUE_END
391                      | DWARF2_FLAG_EPILOGUE_BEGIN);
392 }
393
394 /* Called for each (preferably code) label.  If dwarf2_loc_mark_labels
395    is enabled, emit a basic block marker.  */
396
397 void
398 dwarf2_emit_label (symbolS *label)
399 {
400   struct dwarf2_line_info loc;
401
402   if (!dwarf2_loc_mark_labels)
403     return;
404   if (S_GET_SEGMENT (label) != now_seg)
405     return;
406   if (!(bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE))
407     return;
408   if (files_in_use == 0 && debug_type != DEBUG_DWARF2)
409     return;
410
411   dwarf2_where (&loc);
412
413   loc.flags |= DWARF2_FLAG_BASIC_BLOCK;
414
415   dwarf2_gen_line_info_1 (label, &loc);
416   dwarf2_consume_line_info ();
417 }
418
419 /* Get a .debug_line file number for FILENAME.  If NUM is nonzero,
420    allocate it on that file table slot, otherwise return the first
421    empty one.  */
422
423 static unsigned int
424 get_filenum (const char *filename, unsigned int num)
425 {
426   static unsigned int last_used, last_used_dir_len;
427   const char *file;
428   size_t dir_len;
429   unsigned int i, dir;
430
431   if (num == 0 && last_used)
432     {
433       if (! files[last_used].dir
434           && strcmp (filename, files[last_used].filename) == 0)
435         return last_used;
436       if (files[last_used].dir
437           && strncmp (filename, dirs[files[last_used].dir],
438                       last_used_dir_len) == 0
439           && IS_DIR_SEPARATOR (filename [last_used_dir_len])
440           && strcmp (filename + last_used_dir_len + 1,
441                      files[last_used].filename) == 0)
442         return last_used;
443     }
444
445   file = lbasename (filename);
446   /* Don't make empty string from / or A: from A:/ .  */
447 #ifdef HAVE_DOS_BASED_FILE_SYSTEM
448   if (file <= filename + 3)
449     file = filename;
450 #else
451   if (file == filename + 1)
452     file = filename;
453 #endif
454   dir_len = file - filename;
455
456   dir = 0;
457   if (dir_len)
458     {
459       --dir_len;
460       for (dir = 1; dir < dirs_in_use; ++dir)
461         if (strncmp (filename, dirs[dir], dir_len) == 0
462             && dirs[dir][dir_len] == '\0')
463           break;
464
465       if (dir >= dirs_in_use)
466         {
467           if (dir >= dirs_allocated)
468             {
469               dirs_allocated = dir + 32;
470               dirs = (char **)
471                      xrealloc (dirs, (dir + 32) * sizeof (const char *));
472             }
473
474           dirs[dir] = xmalloc (dir_len + 1);
475           memcpy (dirs[dir], filename, dir_len);
476           dirs[dir][dir_len] = '\0';
477           dirs_in_use = dir + 1;
478         }
479     }
480
481   if (num == 0)
482     {
483       for (i = 1; i < files_in_use; ++i)
484         if (files[i].dir == dir
485             && files[i].filename
486             && strcmp (file, files[i].filename) == 0)
487           {
488             last_used = i;
489             last_used_dir_len = dir_len;
490             return i;
491           }
492     }
493   else
494     i = num;
495
496   if (i >= files_allocated)
497     {
498       unsigned int old = files_allocated;
499
500       files_allocated = i + 32;
501       files = (struct file_entry *)
502         xrealloc (files, (i + 32) * sizeof (struct file_entry));
503
504       memset (files + old, 0, (i + 32 - old) * sizeof (struct file_entry));
505     }
506
507   files[i].filename = num ? file : xstrdup (file);
508   files[i].dir = dir;
509   if (files_in_use < i + 1)
510     files_in_use = i + 1;
511   last_used = i;
512   last_used_dir_len = dir_len;
513
514   return i;
515 }
516
517 /* Handle two forms of .file directive:
518    - Pass .file "source.c" to s_app_file
519    - Handle .file 1 "source.c" by adding an entry to the DWARF-2 file table
520
521    If an entry is added to the file table, return a pointer to the filename. */
522
523 char *
524 dwarf2_directive_file (int dummy ATTRIBUTE_UNUSED)
525 {
526   offsetT num;
527   char *filename;
528   int filename_len;
529
530   /* Continue to accept a bare string and pass it off.  */
531   SKIP_WHITESPACE ();
532   if (*input_line_pointer == '"')
533     {
534       s_app_file (0);
535       return NULL;
536     }
537
538   num = get_absolute_expression ();
539   filename = demand_copy_C_string (&filename_len);
540   if (filename == NULL)
541     return NULL;
542   demand_empty_rest_of_line ();
543
544   if (num < 1)
545     {
546       as_bad (_("file number less than one"));
547       return NULL;
548     }
549
550   if (num < (int) files_in_use && files[num].filename != 0)
551     {
552       as_bad (_("file number %ld already allocated"), (long) num);
553       return NULL;
554     }
555
556   get_filenum (filename, num);
557
558   return filename;
559 }
560
561 void
562 dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
563 {
564   offsetT filenum, line;
565
566   /* If we see two .loc directives in a row, force the first one to be
567      output now.  */
568   if (dwarf2_loc_directive_seen && debug_type != DEBUG_DWARF2)
569     dwarf2_emit_insn (0);
570
571   filenum = get_absolute_expression ();
572   SKIP_WHITESPACE ();
573   line = get_absolute_expression ();
574
575   if (filenum < 1)
576     {
577       as_bad (_("file number less than one"));
578       return;
579     }
580   if (filenum >= (int) files_in_use || files[filenum].filename == 0)
581     {
582       as_bad (_("unassigned file number %ld"), (long) filenum);
583       return;
584     }
585
586   current.filenum = filenum;
587   current.line = line;
588
589 #ifndef NO_LISTING
590   if (listing)
591     {
592       if (files[filenum].dir)
593         {
594           size_t dir_len = strlen (dirs[files[filenum].dir]);
595           size_t file_len = strlen (files[filenum].filename);
596           char *cp = (char *) alloca (dir_len + 1 + file_len + 1);
597
598           memcpy (cp, dirs[files[filenum].dir], dir_len);
599           INSERT_DIR_SEPARATOR (cp, dir_len);
600           memcpy (cp + dir_len + 1, files[filenum].filename, file_len);
601           cp[dir_len + file_len + 1] = '\0';
602           listing_source_file (cp);
603         }
604       else
605         listing_source_file (files[filenum].filename);
606       listing_source_line (line);
607     }
608 #endif
609
610   SKIP_WHITESPACE ();
611   if (ISDIGIT (*input_line_pointer))
612     {
613       current.column = get_absolute_expression ();
614       SKIP_WHITESPACE ();
615     }
616
617   while (ISALPHA (*input_line_pointer))
618     {
619       char *p, c;
620       offsetT value;
621
622       p = input_line_pointer;
623       c = get_symbol_end ();
624
625       if (strcmp (p, "basic_block") == 0)
626         {
627           current.flags |= DWARF2_FLAG_BASIC_BLOCK;
628           *input_line_pointer = c;
629         }
630       else if (strcmp (p, "prologue_end") == 0)
631         {
632           current.flags |= DWARF2_FLAG_PROLOGUE_END;
633           *input_line_pointer = c;
634         }
635       else if (strcmp (p, "epilogue_begin") == 0)
636         {
637           current.flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
638           *input_line_pointer = c;
639         }
640       else if (strcmp (p, "is_stmt") == 0)
641         {
642           *input_line_pointer = c;
643           value = get_absolute_expression ();
644           if (value == 0)
645             current.flags &= ~DWARF2_FLAG_IS_STMT;
646           else if (value == 1)
647             current.flags |= DWARF2_FLAG_IS_STMT;
648           else
649             {
650               as_bad (_("is_stmt value not 0 or 1"));
651               return;
652             }
653         }
654       else if (strcmp (p, "isa") == 0)
655         {
656           *input_line_pointer = c;
657           value = get_absolute_expression ();
658           if (value >= 0)
659             current.isa = value;
660           else
661             {
662               as_bad (_("isa number less than zero"));
663               return;
664             }
665         }
666       else
667         {
668           as_bad (_("unknown .loc sub-directive `%s'"), p);
669           *input_line_pointer = c;
670           return;
671         }
672
673       SKIP_WHITESPACE ();
674     }
675
676   demand_empty_rest_of_line ();
677   dwarf2_loc_directive_seen = TRUE;
678 }
679
680 void
681 dwarf2_directive_loc_mark_labels (int dummy ATTRIBUTE_UNUSED)
682 {
683   offsetT value = get_absolute_expression ();
684
685   if (value != 0 && value != 1)
686     {
687       as_bad (_("expected 0 or 1"));
688       ignore_rest_of_line ();
689     }
690   else
691     {
692       dwarf2_loc_mark_labels = value != 0;
693       demand_empty_rest_of_line ();
694     }
695 }
696 \f
697 static struct frag *
698 first_frag_for_seg (segT seg)
699 {
700   return seg_info (seg)->frchainP->frch_root;
701 }
702
703 static struct frag *
704 last_frag_for_seg (segT seg)
705 {
706   frchainS *f = seg_info (seg)->frchainP;
707
708   while (f->frch_next != NULL)
709     f = f->frch_next;
710
711   return f->frch_last;
712 }
713 \f
714 /* Emit a single byte into the current segment.  */
715
716 static inline void
717 out_byte (int byte)
718 {
719   FRAG_APPEND_1_CHAR (byte);
720 }
721
722 /* Emit a statement program opcode into the current segment.  */
723
724 static inline void
725 out_opcode (int opc)
726 {
727   out_byte (opc);
728 }
729
730 /* Emit a two-byte word into the current segment.  */
731
732 static inline void
733 out_two (int data)
734 {
735   md_number_to_chars (frag_more (2), data, 2);
736 }
737
738 /* Emit a four byte word into the current segment.  */
739
740 static inline void
741 out_four (int data)
742 {
743   md_number_to_chars (frag_more (4), data, 4);
744 }
745
746 /* Emit an unsigned "little-endian base 128" number.  */
747
748 static void
749 out_uleb128 (addressT value)
750 {
751   output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0);
752 }
753
754 /* Emit a tuple for .debug_abbrev.  */
755
756 static inline void
757 out_abbrev (int name, int form)
758 {
759   out_uleb128 (name);
760   out_uleb128 (form);
761 }
762
763 /* Get the size of a fragment.  */
764
765 static offsetT
766 get_frag_fix (fragS *frag, segT seg)
767 {
768   frchainS *fr;
769
770   if (frag->fr_next)
771     return frag->fr_fix;
772
773   /* If a fragment is the last in the chain, special measures must be
774      taken to find its size before relaxation, since it may be pending
775      on some subsegment chain.  */
776   for (fr = seg_info (seg)->frchainP; fr; fr = fr->frch_next)
777     if (fr->frch_last == frag)
778       return (char *) obstack_next_free (&fr->frch_obstack) - frag->fr_literal;
779
780   abort ();
781 }
782
783 /* Set an absolute address (may result in a relocation entry).  */
784
785 static void
786 out_set_addr (symbolS *sym)
787 {
788   expressionS expr;
789
790   out_opcode (DW_LNS_extended_op);
791   out_uleb128 (sizeof_address + 1);
792
793   out_opcode (DW_LNE_set_address);
794   expr.X_op = O_symbol;
795   expr.X_add_symbol = sym;
796   expr.X_add_number = 0;
797   emit_expr (&expr, sizeof_address);
798 }
799
800 #if DWARF2_LINE_MIN_INSN_LENGTH > 1
801 static void scale_addr_delta (addressT *);
802
803 static void
804 scale_addr_delta (addressT *addr_delta)
805 {
806   static int printed_this = 0;
807   if (*addr_delta % DWARF2_LINE_MIN_INSN_LENGTH != 0)
808     {
809       if (!printed_this)
810         as_bad("unaligned opcodes detected in executable segment");
811       printed_this = 1;
812     }
813   *addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
814 }
815 #else
816 #define scale_addr_delta(A)
817 #endif
818
819 /* Encode a pair of line and address skips as efficiently as possible.
820    Note that the line skip is signed, whereas the address skip is unsigned.
821
822    The following two routines *must* be kept in sync.  This is
823    enforced by making emit_inc_line_addr abort if we do not emit
824    exactly the expected number of bytes.  */
825
826 static int
827 size_inc_line_addr (int line_delta, addressT addr_delta)
828 {
829   unsigned int tmp, opcode;
830   int len = 0;
831
832   /* Scale the address delta by the minimum instruction length.  */
833   scale_addr_delta (&addr_delta);
834
835   /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
836      We cannot use special opcodes here, since we want the end_sequence
837      to emit the matrix entry.  */
838   if (line_delta == INT_MAX)
839     {
840       if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
841         len = 1;
842       else
843         len = 1 + sizeof_leb128 (addr_delta, 0);
844       return len + 3;
845     }
846
847   /* Bias the line delta by the base.  */
848   tmp = line_delta - DWARF2_LINE_BASE;
849
850   /* If the line increment is out of range of a special opcode, we
851      must encode it with DW_LNS_advance_line.  */
852   if (tmp >= DWARF2_LINE_RANGE)
853     {
854       len = 1 + sizeof_leb128 (line_delta, 1);
855       line_delta = 0;
856       tmp = 0 - DWARF2_LINE_BASE;
857     }
858
859   /* Bias the opcode by the special opcode base.  */
860   tmp += DWARF2_LINE_OPCODE_BASE;
861
862   /* Avoid overflow when addr_delta is large.  */
863   if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
864     {
865       /* Try using a special opcode.  */
866       opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
867       if (opcode <= 255)
868         return len + 1;
869
870       /* Try using DW_LNS_const_add_pc followed by special op.  */
871       opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
872       if (opcode <= 255)
873         return len + 2;
874     }
875
876   /* Otherwise use DW_LNS_advance_pc.  */
877   len += 1 + sizeof_leb128 (addr_delta, 0);
878
879   /* DW_LNS_copy or special opcode.  */
880   len += 1;
881
882   return len;
883 }
884
885 static void
886 emit_inc_line_addr (int line_delta, addressT addr_delta, char *p, int len)
887 {
888   unsigned int tmp, opcode;
889   int need_copy = 0;
890   char *end = p + len;
891
892   /* Line number sequences cannot go backward in addresses.  This means
893      we've incorrectly ordered the statements in the sequence.  */
894   assert ((offsetT) addr_delta >= 0);
895
896   /* Scale the address delta by the minimum instruction length.  */
897   scale_addr_delta (&addr_delta);
898
899   /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
900      We cannot use special opcodes here, since we want the end_sequence
901      to emit the matrix entry.  */
902   if (line_delta == INT_MAX)
903     {
904       if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
905         *p++ = DW_LNS_const_add_pc;
906       else
907         {
908           *p++ = DW_LNS_advance_pc;
909           p += output_leb128 (p, addr_delta, 0);
910         }
911
912       *p++ = DW_LNS_extended_op;
913       *p++ = 1;
914       *p++ = DW_LNE_end_sequence;
915       goto done;
916     }
917
918   /* Bias the line delta by the base.  */
919   tmp = line_delta - DWARF2_LINE_BASE;
920
921   /* If the line increment is out of range of a special opcode, we
922      must encode it with DW_LNS_advance_line.  */
923   if (tmp >= DWARF2_LINE_RANGE)
924     {
925       *p++ = DW_LNS_advance_line;
926       p += output_leb128 (p, line_delta, 1);
927
928       line_delta = 0;
929       tmp = 0 - DWARF2_LINE_BASE;
930       need_copy = 1;
931     }
932
933   /* Prettier, I think, to use DW_LNS_copy instead of a "line +0, addr +0"
934      special opcode.  */
935   if (line_delta == 0 && addr_delta == 0)
936     {
937       *p++ = DW_LNS_copy;
938       goto done;
939     }
940
941   /* Bias the opcode by the special opcode base.  */
942   tmp += DWARF2_LINE_OPCODE_BASE;
943
944   /* Avoid overflow when addr_delta is large.  */
945   if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
946     {
947       /* Try using a special opcode.  */
948       opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
949       if (opcode <= 255)
950         {
951           *p++ = opcode;
952           goto done;
953         }
954
955       /* Try using DW_LNS_const_add_pc followed by special op.  */
956       opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
957       if (opcode <= 255)
958         {
959           *p++ = DW_LNS_const_add_pc;
960           *p++ = opcode;
961           goto done;
962         }
963     }
964
965   /* Otherwise use DW_LNS_advance_pc.  */
966   *p++ = DW_LNS_advance_pc;
967   p += output_leb128 (p, addr_delta, 0);
968
969   if (need_copy)
970     *p++ = DW_LNS_copy;
971   else
972     *p++ = tmp;
973
974  done:
975   assert (p == end);
976 }
977
978 /* Handy routine to combine calls to the above two routines.  */
979
980 static void
981 out_inc_line_addr (int line_delta, addressT addr_delta)
982 {
983   int len = size_inc_line_addr (line_delta, addr_delta);
984   emit_inc_line_addr (line_delta, addr_delta, frag_more (len), len);
985 }
986
987 /* Write out an alternative form of line and address skips using
988    DW_LNS_fixed_advance_pc opcodes.  This uses more space than the default
989    line and address information, but it is required if linker relaxation
990    could change the code offsets.  The following two routines *must* be
991    kept in sync.  */
992
993 static int
994 size_fixed_inc_line_addr (int line_delta, addressT addr_delta)
995 {
996   int len = 0;
997
998   /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.  */
999   if (line_delta != INT_MAX)
1000     len = 1 + sizeof_leb128 (line_delta, 1);
1001
1002   if (addr_delta > 50000)
1003     {
1004       /* DW_LNS_extended_op */
1005       len += 1 + sizeof_leb128 (sizeof_address + 1, 0);
1006       /* DW_LNE_set_address */
1007       len += 1 + sizeof_address;
1008     }
1009   else
1010     /* DW_LNS_fixed_advance_pc */
1011     len += 3;
1012
1013   if (line_delta == INT_MAX)
1014     /* DW_LNS_extended_op + DW_LNE_end_sequence */
1015     len += 3;
1016   else
1017     /* DW_LNS_copy */
1018     len += 1;
1019
1020   return len;
1021 }
1022
1023 static void
1024 emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
1025                           char *p, int len)
1026 {
1027   expressionS *exp;
1028   segT line_seg;
1029   char *end = p + len;
1030
1031   /* Line number sequences cannot go backward in addresses.  This means
1032      we've incorrectly ordered the statements in the sequence.  */
1033   assert ((offsetT) addr_delta >= 0);
1034
1035   /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.  */
1036   if (line_delta != INT_MAX)
1037     {
1038       *p++ = DW_LNS_advance_line;
1039       p += output_leb128 (p, line_delta, 1);
1040     }
1041
1042   exp = symbol_get_value_expression (frag->fr_symbol);
1043   line_seg = subseg_get (".debug_line", 0);
1044
1045   /* The DW_LNS_fixed_advance_pc opcode has a 2-byte operand so it can
1046      advance the address by at most 64K.  Linker relaxation (without
1047      which this function would not be used) could change the operand by
1048      an unknown amount.  If the address increment is getting close to
1049      the limit, just reset the address.  */
1050   if (addr_delta > 50000)
1051     {
1052       symbolS *to_sym;
1053       expressionS expr;
1054
1055       assert (exp->X_op = O_subtract);
1056       to_sym = exp->X_add_symbol;
1057
1058       *p++ = DW_LNS_extended_op;
1059       p += output_leb128 (p, sizeof_address + 1, 0);
1060       *p++ = DW_LNE_set_address;
1061       expr.X_op = O_symbol;
1062       expr.X_add_symbol = to_sym;
1063       expr.X_add_number = 0;
1064       subseg_change (line_seg, 0);
1065       emit_expr_fix (&expr, sizeof_address, frag, p);
1066       p += sizeof_address;
1067     }
1068   else
1069     {
1070       *p++ = DW_LNS_fixed_advance_pc;
1071       subseg_change (line_seg, 0);
1072       emit_expr_fix (exp, 2, frag, p);
1073       p += 2;
1074     }
1075
1076   if (line_delta == INT_MAX)
1077     {
1078       *p++ = DW_LNS_extended_op;
1079       *p++ = 1;
1080       *p++ = DW_LNE_end_sequence;
1081     }
1082   else
1083     *p++ = DW_LNS_copy;
1084
1085   assert (p == end);
1086 }
1087
1088 /* Generate a variant frag that we can use to relax address/line
1089    increments between fragments of the target segment.  */
1090
1091 static void
1092 relax_inc_line_addr (int line_delta, symbolS *to_sym, symbolS *from_sym)
1093 {
1094   expressionS expr;
1095   int max_chars;
1096
1097   expr.X_op = O_subtract;
1098   expr.X_add_symbol = to_sym;
1099   expr.X_op_symbol = from_sym;
1100   expr.X_add_number = 0;
1101
1102   /* The maximum size of the frag is the line delta with a maximum
1103      sized address delta.  */
1104   if (DWARF2_USE_FIXED_ADVANCE_PC)
1105     max_chars = size_fixed_inc_line_addr (line_delta,
1106                                           -DWARF2_LINE_MIN_INSN_LENGTH);
1107   else
1108     max_chars = size_inc_line_addr (line_delta, -DWARF2_LINE_MIN_INSN_LENGTH);
1109
1110   frag_var (rs_dwarf2dbg, max_chars, max_chars, 1,
1111             make_expr_symbol (&expr), line_delta, NULL);
1112 }
1113
1114 /* The function estimates the size of a rs_dwarf2dbg variant frag
1115    based on the current values of the symbols.  It is called before
1116    the relaxation loop.  We set fr_subtype to the expected length.  */
1117
1118 int
1119 dwarf2dbg_estimate_size_before_relax (fragS *frag)
1120 {
1121   offsetT addr_delta;
1122   int size;
1123
1124   addr_delta = resolve_symbol_value (frag->fr_symbol);
1125   if (DWARF2_USE_FIXED_ADVANCE_PC)
1126     size = size_fixed_inc_line_addr (frag->fr_offset, addr_delta);
1127   else
1128     size = size_inc_line_addr (frag->fr_offset, addr_delta);
1129
1130   frag->fr_subtype = size;
1131
1132   return size;
1133 }
1134
1135 /* This function relaxes a rs_dwarf2dbg variant frag based on the
1136    current values of the symbols.  fr_subtype is the current length
1137    of the frag.  This returns the change in frag length.  */
1138
1139 int
1140 dwarf2dbg_relax_frag (fragS *frag)
1141 {
1142   int old_size, new_size;
1143
1144   old_size = frag->fr_subtype;
1145   new_size = dwarf2dbg_estimate_size_before_relax (frag);
1146
1147   return new_size - old_size;
1148 }
1149
1150 /* This function converts a rs_dwarf2dbg variant frag into a normal
1151    fill frag.  This is called after all relaxation has been done.
1152    fr_subtype will be the desired length of the frag.  */
1153
1154 void
1155 dwarf2dbg_convert_frag (fragS *frag)
1156 {
1157   offsetT addr_diff;
1158
1159   addr_diff = resolve_symbol_value (frag->fr_symbol);
1160
1161   /* fr_var carries the max_chars that we created the fragment with.
1162      fr_subtype carries the current expected length.  We must, of
1163      course, have allocated enough memory earlier.  */
1164   assert (frag->fr_var >= (int) frag->fr_subtype);
1165
1166   if (DWARF2_USE_FIXED_ADVANCE_PC)
1167     emit_fixed_inc_line_addr (frag->fr_offset, addr_diff, frag,
1168                               frag->fr_literal + frag->fr_fix,
1169                               frag->fr_subtype);
1170   else
1171     emit_inc_line_addr (frag->fr_offset, addr_diff,
1172                         frag->fr_literal + frag->fr_fix, frag->fr_subtype);
1173
1174   frag->fr_fix += frag->fr_subtype;
1175   frag->fr_type = rs_fill;
1176   frag->fr_var = 0;
1177   frag->fr_offset = 0;
1178 }
1179
1180 /* Generate .debug_line content for the chain of line number entries
1181    beginning at E, for segment SEG.  */
1182
1183 static void
1184 process_entries (segT seg, struct line_entry *e)
1185 {
1186   unsigned filenum = 1;
1187   unsigned line = 1;
1188   unsigned column = 0;
1189   unsigned isa = 0;
1190   unsigned flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
1191   fragS *last_frag = NULL, *frag;
1192   addressT last_frag_ofs = 0, frag_ofs;
1193   symbolS *last_lab = NULL, *lab;
1194   struct line_entry *next;
1195
1196   do
1197     {
1198       int line_delta;
1199
1200       if (filenum != e->loc.filenum)
1201         {
1202           filenum = e->loc.filenum;
1203           out_opcode (DW_LNS_set_file);
1204           out_uleb128 (filenum);
1205         }
1206
1207       if (column != e->loc.column)
1208         {
1209           column = e->loc.column;
1210           out_opcode (DW_LNS_set_column);
1211           out_uleb128 (column);
1212         }
1213
1214       if (isa != e->loc.isa)
1215         {
1216           isa = e->loc.isa;
1217           out_opcode (DW_LNS_set_isa);
1218           out_uleb128 (isa);
1219         }
1220
1221       if ((e->loc.flags ^ flags) & DWARF2_FLAG_IS_STMT)
1222         {
1223           flags = e->loc.flags;
1224           out_opcode (DW_LNS_negate_stmt);
1225         }
1226
1227       if (e->loc.flags & DWARF2_FLAG_BASIC_BLOCK)
1228         out_opcode (DW_LNS_set_basic_block);
1229
1230       if (e->loc.flags & DWARF2_FLAG_PROLOGUE_END)
1231         out_opcode (DW_LNS_set_prologue_end);
1232
1233       if (e->loc.flags & DWARF2_FLAG_EPILOGUE_BEGIN)
1234         out_opcode (DW_LNS_set_epilogue_begin);
1235
1236       /* Don't try to optimize away redundant entries; gdb wants two
1237          entries for a function where the code starts on the same line as
1238          the {, and there's no way to identify that case here.  Trust gcc
1239          to optimize appropriately.  */
1240       line_delta = e->loc.line - line;
1241       lab = e->label;
1242       frag = symbol_get_frag (lab);
1243       frag_ofs = S_GET_VALUE (lab);
1244
1245       if (last_frag == NULL)
1246         {
1247           out_set_addr (lab);
1248           out_inc_line_addr (line_delta, 0);
1249         }
1250       else if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
1251         out_inc_line_addr (line_delta, frag_ofs - last_frag_ofs);
1252       else
1253         relax_inc_line_addr (line_delta, lab, last_lab);
1254
1255       line = e->loc.line;
1256       last_lab = lab;
1257       last_frag = frag;
1258       last_frag_ofs = frag_ofs;
1259
1260       next = e->next;
1261       free (e);
1262       e = next;
1263     }
1264   while (e);
1265
1266   /* Emit a DW_LNE_end_sequence for the end of the section.  */
1267   frag = last_frag_for_seg (seg);
1268   frag_ofs = get_frag_fix (frag, seg);
1269   if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
1270     out_inc_line_addr (INT_MAX, frag_ofs - last_frag_ofs);
1271   else
1272     {
1273       lab = symbol_temp_new (seg, frag_ofs, frag);
1274       relax_inc_line_addr (INT_MAX, lab, last_lab);
1275     }
1276 }
1277
1278 /* Emit the directory and file tables for .debug_line.  */
1279
1280 static void
1281 out_file_list (void)
1282 {
1283   size_t size;
1284   const char *dir;
1285   char *cp;
1286   unsigned int i;
1287
1288   /* Emit directory list.  */
1289   for (i = 1; i < dirs_in_use; ++i)
1290     {
1291       dir = remap_debug_filename (dirs[i]);
1292       size = strlen (dir) + 1;
1293       cp = frag_more (size);
1294       memcpy (cp, dir, size);
1295     }
1296   /* Terminate it.  */
1297   out_byte ('\0');
1298
1299   for (i = 1; i < files_in_use; ++i)
1300     {
1301       if (files[i].filename == NULL)
1302         {
1303           as_bad (_("unassigned file number %ld"), (long) i);
1304           /* Prevent a crash later, particularly for file 1.  */
1305           files[i].filename = "";
1306           continue;
1307         }
1308
1309       size = strlen (files[i].filename) + 1;
1310       cp = frag_more (size);
1311       memcpy (cp, files[i].filename, size);
1312
1313       out_uleb128 (files[i].dir);       /* directory number */
1314       out_uleb128 (0);                  /* last modification timestamp */
1315       out_uleb128 (0);                  /* filesize */
1316     }
1317
1318   /* Terminate filename list.  */
1319   out_byte (0);
1320 }
1321
1322 /* Emit the collected .debug_line data.  */
1323
1324 static void
1325 out_debug_line (segT line_seg)
1326 {
1327   expressionS expr;
1328   symbolS *line_start;
1329   symbolS *prologue_end;
1330   symbolS *line_end;
1331   struct line_seg *s;
1332   enum dwarf2_format d2f;
1333   int sizeof_offset;
1334
1335   subseg_set (line_seg, 0);
1336
1337   line_start = symbol_temp_new_now ();
1338   prologue_end = symbol_temp_make ();
1339   line_end = symbol_temp_make ();
1340
1341   /* Total length of the information for this compilation unit.  */
1342   expr.X_op = O_subtract;
1343   expr.X_add_symbol = line_end;
1344   expr.X_op_symbol = line_start;
1345
1346   d2f = DWARF2_FORMAT ();
1347   if (d2f == dwarf2_format_32bit)
1348     {
1349       expr.X_add_number = -4;
1350       emit_expr (&expr, 4);
1351       sizeof_offset = 4;
1352     }
1353   else if (d2f == dwarf2_format_64bit)
1354     {
1355       expr.X_add_number = -12;
1356       out_four (-1);
1357       emit_expr (&expr, 8);
1358       sizeof_offset = 8;
1359     }
1360   else if (d2f == dwarf2_format_64bit_irix)
1361     {
1362       expr.X_add_number = -8;
1363       emit_expr (&expr, 8);
1364       sizeof_offset = 8;
1365     }
1366   else
1367     {
1368       as_fatal (_("internal error: unknown dwarf2 format"));
1369     }
1370
1371   /* Version.  */
1372   out_two (2);
1373
1374   /* Length of the prologue following this length.  */
1375   expr.X_op = O_subtract;
1376   expr.X_add_symbol = prologue_end;
1377   expr.X_op_symbol = line_start;
1378   expr.X_add_number = - (4 + 2 + 4);
1379   emit_expr (&expr, sizeof_offset);
1380
1381   /* Parameters of the state machine.  */
1382   out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
1383   out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
1384   out_byte (DWARF2_LINE_BASE);
1385   out_byte (DWARF2_LINE_RANGE);
1386   out_byte (DWARF2_LINE_OPCODE_BASE);
1387
1388   /* Standard opcode lengths.  */
1389   out_byte (0);                 /* DW_LNS_copy */
1390   out_byte (1);                 /* DW_LNS_advance_pc */
1391   out_byte (1);                 /* DW_LNS_advance_line */
1392   out_byte (1);                 /* DW_LNS_set_file */
1393   out_byte (1);                 /* DW_LNS_set_column */
1394   out_byte (0);                 /* DW_LNS_negate_stmt */
1395   out_byte (0);                 /* DW_LNS_set_basic_block */
1396   out_byte (0);                 /* DW_LNS_const_add_pc */
1397   out_byte (1);                 /* DW_LNS_fixed_advance_pc */
1398   out_byte (0);                 /* DW_LNS_set_prologue_end */
1399   out_byte (0);                 /* DW_LNS_set_epilogue_begin */
1400   out_byte (1);                 /* DW_LNS_set_isa */
1401
1402   out_file_list ();
1403
1404   symbol_set_value_now (prologue_end);
1405
1406   /* For each section, emit a statement program.  */
1407   for (s = all_segs; s; s = s->next)
1408     process_entries (s->seg, s->head->head);
1409
1410   symbol_set_value_now (line_end);
1411 }
1412
1413 static void
1414 out_debug_ranges (segT ranges_seg)
1415 {
1416   unsigned int addr_size = sizeof_address;
1417   struct line_seg *s;
1418   expressionS expr;
1419   unsigned int i;
1420
1421   subseg_set (ranges_seg, 0);
1422
1423   /* Base Address Entry.  */
1424   for (i = 0; i < addr_size; i++)
1425     out_byte (0xff);
1426   for (i = 0; i < addr_size; i++)
1427     out_byte (0);
1428
1429   /* Range List Entry.  */
1430   for (s = all_segs; s; s = s->next)
1431     {
1432       fragS *frag;
1433       symbolS *beg, *end;
1434
1435       frag = first_frag_for_seg (s->seg);
1436       beg = symbol_temp_new (s->seg, 0, frag);
1437       s->text_start = beg;
1438
1439       frag = last_frag_for_seg (s->seg);
1440       end = symbol_temp_new (s->seg, get_frag_fix (frag, s->seg), frag);
1441       s->text_end = end;
1442
1443       expr.X_op = O_symbol;
1444       expr.X_add_symbol = beg;
1445       expr.X_add_number = 0;
1446       emit_expr (&expr, addr_size);
1447
1448       expr.X_op = O_symbol;
1449       expr.X_add_symbol = end;
1450       expr.X_add_number = 0;
1451       emit_expr (&expr, addr_size);
1452     }
1453
1454   /* End of Range Entry.   */
1455   for (i = 0; i < addr_size; i++)
1456     out_byte (0);
1457   for (i = 0; i < addr_size; i++)
1458     out_byte (0);
1459 }
1460
1461 /* Emit data for .debug_aranges.  */
1462
1463 static void
1464 out_debug_aranges (segT aranges_seg, segT info_seg)
1465 {
1466   unsigned int addr_size = sizeof_address;
1467   addressT size, skip;
1468   struct line_seg *s;
1469   expressionS expr;
1470   char *p;
1471
1472   size = 4 + 2 + 4 + 1 + 1;
1473
1474   skip = 2 * addr_size - (size & (2 * addr_size - 1));
1475   if (skip == 2 * addr_size)
1476     skip = 0;
1477   size += skip;
1478
1479   for (s = all_segs; s; s = s->next)
1480     size += 2 * addr_size;
1481
1482   size += 2 * addr_size;
1483
1484   subseg_set (aranges_seg, 0);
1485
1486   /* Length of the compilation unit.  */
1487   out_four (size - 4);
1488
1489   /* Version.  */
1490   out_two (2);
1491
1492   /* Offset to .debug_info.  */
1493   /* ??? sizeof_offset */
1494   TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), 4);
1495
1496   /* Size of an address (offset portion).  */
1497   out_byte (addr_size);
1498
1499   /* Size of a segment descriptor.  */
1500   out_byte (0);
1501
1502   /* Align the header.  */
1503   if (skip)
1504     frag_align (ffs (2 * addr_size) - 1, 0, 0);
1505
1506   for (s = all_segs; s; s = s->next)
1507     {
1508       fragS *frag;
1509       symbolS *beg, *end;
1510
1511       frag = first_frag_for_seg (s->seg);
1512       beg = symbol_temp_new (s->seg, 0, frag);
1513       s->text_start = beg;
1514
1515       frag = last_frag_for_seg (s->seg);
1516       end = symbol_temp_new (s->seg, get_frag_fix (frag, s->seg), frag);
1517       s->text_end = end;
1518
1519       expr.X_op = O_symbol;
1520       expr.X_add_symbol = beg;
1521       expr.X_add_number = 0;
1522       emit_expr (&expr, addr_size);
1523
1524       expr.X_op = O_subtract;
1525       expr.X_add_symbol = end;
1526       expr.X_op_symbol = beg;
1527       expr.X_add_number = 0;
1528       emit_expr (&expr, addr_size);
1529     }
1530
1531   p = frag_more (2 * addr_size);
1532   md_number_to_chars (p, 0, addr_size);
1533   md_number_to_chars (p + addr_size, 0, addr_size);
1534 }
1535
1536 /* Emit data for .debug_abbrev.  Note that this must be kept in
1537    sync with out_debug_info below.  */
1538
1539 static void
1540 out_debug_abbrev (segT abbrev_seg)
1541 {
1542   subseg_set (abbrev_seg, 0);
1543
1544   out_uleb128 (1);
1545   out_uleb128 (DW_TAG_compile_unit);
1546   out_byte (DW_CHILDREN_no);
1547   out_abbrev (DW_AT_stmt_list, DW_FORM_data4);
1548   if (all_segs->next == NULL)
1549     {
1550       out_abbrev (DW_AT_low_pc, DW_FORM_addr);
1551       out_abbrev (DW_AT_high_pc, DW_FORM_addr);
1552     }
1553   else
1554     {
1555       if (DWARF2_FORMAT () == dwarf2_format_32bit)
1556         out_abbrev (DW_AT_ranges, DW_FORM_data4);
1557       else
1558         out_abbrev (DW_AT_ranges, DW_FORM_data8);
1559     }
1560   out_abbrev (DW_AT_name, DW_FORM_string);
1561   out_abbrev (DW_AT_comp_dir, DW_FORM_string);
1562   out_abbrev (DW_AT_producer, DW_FORM_string);
1563   out_abbrev (DW_AT_language, DW_FORM_data2);
1564   out_abbrev (0, 0);
1565
1566   /* Terminate the abbreviations for this compilation unit.  */
1567   out_byte (0);
1568 }
1569
1570 /* Emit a description of this compilation unit for .debug_info.  */
1571
1572 static void
1573 out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT ranges_seg)
1574 {
1575   char producer[128];
1576   const char *comp_dir;
1577   const char *dirname;
1578   expressionS expr;
1579   symbolS *info_start;
1580   symbolS *info_end;
1581   char *p;
1582   int len;
1583   enum dwarf2_format d2f;
1584   int sizeof_offset;
1585
1586   subseg_set (info_seg, 0);
1587
1588   info_start = symbol_temp_new_now ();
1589   info_end = symbol_temp_make ();
1590
1591   /* Compilation Unit length.  */
1592   expr.X_op = O_subtract;
1593   expr.X_add_symbol = info_end;
1594   expr.X_op_symbol = info_start;
1595
1596   d2f = DWARF2_FORMAT ();
1597   if (d2f == dwarf2_format_32bit)
1598     {
1599       expr.X_add_number = -4;
1600       emit_expr (&expr, 4);
1601       sizeof_offset = 4;
1602     }
1603   else if (d2f == dwarf2_format_64bit)
1604     {
1605       expr.X_add_number = -12;
1606       out_four (-1);
1607       emit_expr (&expr, 8);
1608       sizeof_offset = 8;
1609     }
1610   else if (d2f == dwarf2_format_64bit_irix)
1611     {
1612       expr.X_add_number = -8;
1613       emit_expr (&expr, 8);
1614       sizeof_offset = 8;
1615     }
1616   else
1617     {
1618       as_fatal (_("internal error: unknown dwarf2 format"));
1619     }
1620
1621   /* DWARF version.  */
1622   out_two (2);
1623
1624   /* .debug_abbrev offset */
1625   TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
1626
1627   /* Target address size.  */
1628   out_byte (sizeof_address);
1629
1630   /* DW_TAG_compile_unit DIE abbrev */
1631   out_uleb128 (1);
1632
1633   /* DW_AT_stmt_list */
1634   /* ??? sizeof_offset */
1635   TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg), 4);
1636
1637   /* These two attributes are emitted if all of the code is contiguous.  */
1638   if (all_segs->next == NULL)
1639     {
1640       /* DW_AT_low_pc */
1641       expr.X_op = O_symbol;
1642       expr.X_add_symbol = all_segs->text_start;
1643       expr.X_add_number = 0;
1644       emit_expr (&expr, sizeof_address);
1645
1646       /* DW_AT_high_pc */
1647       expr.X_op = O_symbol;
1648       expr.X_add_symbol = all_segs->text_end;
1649       expr.X_add_number = 0;
1650       emit_expr (&expr, sizeof_address);
1651     }
1652   else
1653     {
1654       /* This attribute is emitted if the code is disjoint.  */
1655       /* DW_AT_ranges.  */
1656       TC_DWARF2_EMIT_OFFSET (section_symbol (ranges_seg), sizeof_offset);
1657     }
1658
1659   /* DW_AT_name.  We don't have the actual file name that was present
1660      on the command line, so assume files[1] is the main input file.
1661      We're not supposed to get called unless at least one line number
1662      entry was emitted, so this should always be defined.  */
1663   if (files_in_use == 0)
1664     abort ();
1665   if (files[1].dir)
1666     {
1667       dirname = remap_debug_filename (dirs[files[1].dir]);
1668       len = strlen (dirname);
1669       p = frag_more (len + 1);
1670       memcpy (p, dirname, len);
1671       INSERT_DIR_SEPARATOR (p, len);
1672     }
1673   len = strlen (files[1].filename) + 1;
1674   p = frag_more (len);
1675   memcpy (p, files[1].filename, len);
1676
1677   /* DW_AT_comp_dir */
1678   comp_dir = remap_debug_filename (getpwd ());
1679   len = strlen (comp_dir) + 1;
1680   p = frag_more (len);
1681   memcpy (p, comp_dir, len);
1682
1683   /* DW_AT_producer */
1684   sprintf (producer, "GNU AS %s", VERSION);
1685   len = strlen (producer) + 1;
1686   p = frag_more (len);
1687   memcpy (p, producer, len);
1688
1689   /* DW_AT_language.  Yes, this is probably not really MIPS, but the
1690      dwarf2 draft has no standard code for assembler.  */
1691   out_two (DW_LANG_Mips_Assembler);
1692
1693   symbol_set_value_now (info_end);
1694 }
1695
1696 /* Finish the dwarf2 debug sections.  We emit .debug.line if there
1697    were any .file/.loc directives, or --gdwarf2 was given, or if the
1698    file has a non-empty .debug_info section.  If we emit .debug_line,
1699    and the .debug_info section is empty, we also emit .debug_info,
1700    .debug_aranges and .debug_abbrev.  ALL_SEGS will be non-null if
1701    there were any .file/.loc directives, or --gdwarf2 was given and
1702    there were any located instructions emitted.  */
1703
1704 void
1705 dwarf2_finish (void)
1706 {
1707   segT line_seg;
1708   struct line_seg *s;
1709   segT info_seg;
1710   int emit_other_sections = 0;
1711
1712   info_seg = bfd_get_section_by_name (stdoutput, ".debug_info");
1713   emit_other_sections = info_seg == NULL || !seg_not_empty_p (info_seg);
1714
1715   if (!all_segs && emit_other_sections)
1716     /* There is no line information and no non-empty .debug_info
1717        section.  */
1718     return;
1719
1720   /* Calculate the size of an address for the target machine.  */
1721   sizeof_address = DWARF2_ADDR_SIZE (stdoutput);
1722
1723   /* Create and switch to the line number section.  */
1724   line_seg = subseg_new (".debug_line", 0);
1725   bfd_set_section_flags (stdoutput, line_seg, SEC_READONLY | SEC_DEBUGGING);
1726
1727   /* For each subsection, chain the debug entries together.  */
1728   for (s = all_segs; s; s = s->next)
1729     {
1730       struct line_subseg *ss = s->head;
1731       struct line_entry **ptail = ss->ptail;
1732
1733       while ((ss = ss->next) != NULL)
1734         {
1735           *ptail = ss->head;
1736           ptail = ss->ptail;
1737         }
1738     }
1739
1740   out_debug_line (line_seg);
1741
1742   /* If this is assembler generated line info, and there is no
1743      debug_info already, we need .debug_info and .debug_abbrev
1744      sections as well.  */
1745   if (emit_other_sections)
1746     {
1747       segT abbrev_seg;
1748       segT aranges_seg;
1749       segT ranges_seg;
1750
1751       assert (all_segs);
1752
1753       info_seg = subseg_new (".debug_info", 0);
1754       abbrev_seg = subseg_new (".debug_abbrev", 0);
1755       aranges_seg = subseg_new (".debug_aranges", 0);
1756
1757       bfd_set_section_flags (stdoutput, info_seg,
1758                              SEC_READONLY | SEC_DEBUGGING);
1759       bfd_set_section_flags (stdoutput, abbrev_seg,
1760                              SEC_READONLY | SEC_DEBUGGING);
1761       bfd_set_section_flags (stdoutput, aranges_seg,
1762                              SEC_READONLY | SEC_DEBUGGING);
1763
1764       record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
1765
1766       if (all_segs->next == NULL)
1767         ranges_seg = NULL;
1768       else
1769         {
1770           ranges_seg = subseg_new (".debug_ranges", 0);
1771           bfd_set_section_flags (stdoutput, ranges_seg,
1772                                  SEC_READONLY | SEC_DEBUGGING);
1773           record_alignment (ranges_seg, ffs (2 * sizeof_address) - 1);
1774           out_debug_ranges (ranges_seg);
1775         }
1776
1777       out_debug_aranges (aranges_seg, info_seg);
1778       out_debug_abbrev (abbrev_seg);
1779       out_debug_info (info_seg, abbrev_seg, line_seg, ranges_seg);
1780     }
1781 }