#include <limits.h> only if it exists.
[deliverable/binutils-gdb.git] / gas / dwarf2dbg.c
CommitLineData
fac0d250 1/* dwarf2dbg.c - DWARF2 debug support
52454417 2 Copyright (C) 1999, 2000 Free Software Foundation, Inc.
fac0d250
RH
3 Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
4
5 This file is part of GAS, the GNU Assembler.
6
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
89b66cde 20 02111-1307, USA. */
fac0d250 21
89b66cde 22/* Logical line numbers can be controlled by the compiler via the
fac0d250
RH
23 following two directives:
24
25 .file FILENO "file.c"
26 .loc FILENO LINENO [COLUMN]
27
28 FILENO is the filenumber. */
29
30#include "ansidecl.h"
fac0d250 31#include "as.h"
92eb7b32 32
42dbf88c
NC
33#ifdef HAVE_LIMITS_H
34#include <limits.h>
35#endif
36
92eb7b32
L
37#ifdef BFD_ASSEMBLER
38
fac0d250
RH
39#include "dwarf2dbg.h"
40#include "subsegs.h"
41
d9ac5a3b 42#include "elf/dwarf2.h"
fac0d250 43
fac0d250
RH
44/* Since we can't generate the prolog until the body is complete, we
45 use three different subsegments for .debug_line: one holding the
46 prolog, one for the directory and filename info, and one for the
47 body ("statement program"). */
48#define DL_PROLOG 0
49#define DL_FILES 1
50#define DL_BODY 2
51
52/* First special line opcde - leave room for the standard opcodes.
53 Note: If you want to change this, you'll have to update the
54 "standard_opcode_lengths" table that is emitted below in
55 dwarf2_finish(). */
56#define DWARF2_LINE_OPCODE_BASE 10
57
58#ifndef DWARF2_LINE_BASE
59 /* Minimum line offset in a special line info. opcode. This value
60 was chosen to give a reasonable range of values. */
61# define DWARF2_LINE_BASE -5
62#endif
63
64/* Range of line offsets in a special line info. opcode. */
65#ifndef DWARF2_LINE_RANGE
66# define DWARF2_LINE_RANGE 14
67#endif
68
69#ifndef DWARF2_LINE_MIN_INSN_LENGTH
70 /* Define the architecture-dependent minimum instruction length (in
71 bytes). This value should be rather too small than too big. */
4dc7ead9 72# define DWARF2_LINE_MIN_INSN_LENGTH 1
fac0d250
RH
73#endif
74
75/* Flag that indicates the initial value of the is_stmt_start flag.
76 In the present implementation, we do not mark any lines as
77 the beginning of a source statement, because that information
78 is not made available by the GCC front-end. */
79#define DWARF2_LINE_DEFAULT_IS_STMT 1
80
cb30237e 81/* Given a special op, return the line skip amount. */
fac0d250
RH
82#define SPECIAL_LINE(op) \
83 (((op) - DWARF2_LINE_OPCODE_BASE)%DWARF2_LINE_RANGE + DWARF2_LINE_BASE)
84
85/* Given a special op, return the address skip amount (in units of
86 DWARF2_LINE_MIN_INSN_LENGTH. */
87#define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
88
cb30237e 89/* The maximum address skip amount that can be encoded with a special op. */
fac0d250
RH
90#define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
91
220e750f
RH
92
93struct line_entry
94{
95 struct line_entry *next;
96 fragS *frag;
97 addressT frag_ofs;
98 struct dwarf2_line_info loc;
e6c774b4 99};
fac0d250 100
220e750f
RH
101struct line_subseg
102{
103 struct line_subseg *next;
104 subsegT subseg;
105 struct line_entry *head;
106 struct line_entry **ptail;
107};
353e2c69 108
220e750f 109struct line_seg
fac0d250 110{
220e750f
RH
111 struct line_seg *next;
112 segT seg;
113 struct line_subseg *head;
114 symbolS *text_start;
115 symbolS *text_end;
116};
117
118/* Collects data for all line table entries during assembly. */
119static struct line_seg *all_segs;
120
121struct file_entry
122{
123 char *filename;
124 unsigned int dir;
125};
126
127/* Table of files used by .debug_line. */
128static struct file_entry *files;
129static unsigned int files_in_use;
130static unsigned int files_allocated;
131
132/* Correlate file numbers as given by the user in .file/.loc directives
133 with the file numbers used in the output debug info. */
134static unsigned int *user_filenum;
135static unsigned int user_filenum_allocated;
136
137/* True when we've seen a .loc directive recently. Used to avoid
138 doing work when there's nothing to do. */
139static boolean loc_directive_seen;
140
141/* Current location as indicated by the most recent .loc directive. */
142static struct dwarf2_line_info current;
143
144/* Fake label name. */
145static char const fake_label_name[] = ".L0\001";
146
147/* The size of an address on the target. */
148static unsigned int sizeof_address;
149\f
150static struct line_subseg *get_line_subseg PARAMS ((segT, subsegT));
151static unsigned int get_filenum PARAMS ((const char *));
152static struct frag *first_frag_for_seg PARAMS ((segT));
153static struct frag *last_frag_for_seg PARAMS ((segT));
154static void out_byte PARAMS ((int));
155static void out_opcode PARAMS ((int));
156static void out_two PARAMS ((int));
157static void out_four PARAMS ((int));
158static void out_abbrev PARAMS ((int, int));
159static void out_uleb128 PARAMS ((addressT));
160static symbolS *symbol_new_now PARAMS ((void));
161static void set_symbol_value_now PARAMS ((symbolS *));
162static offsetT get_frag_fix PARAMS ((fragS *));
163static void out_set_addr PARAMS ((segT, fragS *, addressT));
164static int size_inc_line_addr PARAMS ((int, addressT));
165static void emit_inc_line_addr PARAMS ((int, addressT, char *, int));
166static void out_inc_line_addr PARAMS ((int, addressT));
167static void relax_inc_line_addr PARAMS ((int, segT, fragS *, addressT,
168 fragS *, addressT));
169static void process_entries PARAMS ((segT, struct line_entry *));
170static void out_file_list PARAMS ((void));
171static void out_debug_line PARAMS ((segT));
172static void out_debug_aranges PARAMS ((segT, segT));
173static void out_debug_abbrev PARAMS ((segT));
174static void out_debug_info PARAMS ((segT, segT, segT));
175\f
176/* Find or create an entry for SEG+SUBSEG in ALL_SEGS. */
177
178static struct line_subseg *
179get_line_subseg (seg, subseg)
180 segT seg;
181 subsegT subseg;
182{
183 static segT last_seg;
184 static subsegT last_subseg;
185 static struct line_subseg *last_line_subseg;
186
187 struct line_seg *s;
188 struct line_subseg **pss, *ss;
fac0d250 189
220e750f
RH
190 if (seg == last_seg && subseg == last_subseg)
191 return last_line_subseg;
192
193 for (s = all_segs; s ; s = s->next)
194 if (s->seg == seg)
195 goto found_seg;
196
197 s = (struct line_seg *) xmalloc (sizeof (*s));
198 s->next = all_segs;
199 s->seg = seg;
200 s->head = NULL;
201 all_segs = s;
202
203 found_seg:
204 for (pss = &s->head; (ss = *pss) != NULL ; pss = &ss->next)
fac0d250 205 {
220e750f
RH
206 if (ss->subseg == subseg)
207 goto found_subseg;
208 if (ss->subseg > subseg)
209 break;
fac0d250 210 }
220e750f
RH
211
212 ss = (struct line_subseg *) xmalloc (sizeof (*ss));
213 ss->next = *pss;
214 ss->subseg = subseg;
215 ss->head = NULL;
216 ss->ptail = &ss->head;
217 *pss = ss;
218
219 found_subseg:
220 last_seg = seg;
221 last_subseg = subseg;
222 last_line_subseg = ss;
223
224 return ss;
fac0d250
RH
225}
226
220e750f 227/* Record an entry for LOC ocurring at OFS within the current fragment. */
353e2c69 228
220e750f
RH
229void
230dwarf2_gen_line_info (ofs, loc)
231 addressT ofs;
232 struct dwarf2_line_info *loc;
fac0d250 233{
220e750f
RH
234 struct line_subseg *ss;
235 struct line_entry *e;
236
237 /* Early out for as-yet incomplete location information. */
238 if (loc->filenum == 0 || loc->line == 0)
239 return;
240
241 e = (struct line_entry *) xmalloc (sizeof (*e));
242 e->next = NULL;
243 e->frag = frag_now;
244 e->frag_ofs = ofs;
245 e->loc = *loc;
246
247 ss = get_line_subseg (now_seg, now_subseg);
248 *ss->ptail = e;
249 ss->ptail = &e->next;
250}
fac0d250 251
220e750f
RH
252void
253dwarf2_where (line)
254 struct dwarf2_line_info *line;
255{
256 if (debug_type == DEBUG_DWARF2)
fac0d250 257 {
220e750f
RH
258 char *filename;
259 as_where (&filename, &line->line);
260 line->filenum = get_filenum (filename);
261 line->column = 0;
262 line->flags = DWARF2_FLAG_BEGIN_STMT;
fac0d250 263 }
220e750f
RH
264 else
265 *line = current;
fac0d250
RH
266}
267
220e750f
RH
268/* Called for each machine instruction, or relatively atomic group of
269 machine instructions (ie built-in macro). The instruction or group
270 is SIZE bytes in length. If dwarf2 line number generation is called
271 for, emit a line statement appropriately. */
353e2c69 272
220e750f
RH
273void
274dwarf2_emit_insn (size)
275 int size;
fac0d250 276{
220e750f 277 struct dwarf2_line_info loc;
fac0d250 278
220e750f
RH
279 if (debug_type != DEBUG_DWARF2 && ! loc_directive_seen)
280 return;
281 loc_directive_seen = false;
282
283 dwarf2_where (&loc);
284 dwarf2_gen_line_info (frag_now_fix () - size, &loc);
285}
fac0d250 286
220e750f
RH
287/* Get a .debug_line file number for FILENAME. */
288
289static unsigned int
290get_filenum (filename)
291 const char *filename;
292{
293 static unsigned int last_used;
294 unsigned int i;
295
296 if (last_used)
297 if (strcmp (filename, files[last_used].filename) == 0)
298 return last_used;
299
300 for (i = 1; i < files_in_use; ++i)
301 if (strcmp (filename, files[i].filename) == 0)
302 return i;
303
304 if (i >= files_allocated)
fac0d250 305 {
220e750f
RH
306 files_allocated = i + 32;
307 files = (struct file_entry *)
308 xrealloc (files, (i + 32) * sizeof(struct file_entry));
fac0d250
RH
309 }
310
220e750f
RH
311 files[i].filename = xstrdup(filename);
312 files[i].dir = 0;
313 files_in_use = i + 1;
314 last_used = i;
315
316 return i;
317}
fac0d250 318
220e750f
RH
319/* Handle the .file directive. */
320
321void
322dwarf2_directive_file (dummy)
323 int dummy ATTRIBUTE_UNUSED;
324{
325 offsetT num;
326 const char *filename;
327 int filename_len;
328
329 /* Continue to accept a bare string and pass it off. */
330 SKIP_WHITESPACE ();
331 if (*input_line_pointer == '"')
fac0d250 332 {
220e750f 333 s_app_file (0);
fac0d250
RH
334 return;
335 }
336
220e750f
RH
337 num = get_absolute_expression ();
338 filename = demand_copy_C_string (&filename_len);
339 demand_empty_rest_of_line ();
340
341 if (num < 0)
fac0d250 342 {
220e750f 343 as_bad (_("File number less than zero"));
fac0d250
RH
344 return;
345 }
346
bccba5f0 347 if (num >= (int) user_filenum_allocated)
220e750f
RH
348 {
349 unsigned int old = user_filenum_allocated;
350
351 user_filenum_allocated = num + 16;
352 user_filenum = (unsigned int *)
353 xrealloc (user_filenum, (num + 16) * sizeof (unsigned int));
fac0d250 354
220e750f
RH
355 /* Zero the new memory. */
356 memset (user_filenum + old, 0, (num + 16 - old) * sizeof(unsigned int));
357 }
358
359 user_filenum[num] = get_filenum (filename);
fac0d250
RH
360}
361
220e750f
RH
362void
363dwarf2_directive_loc (dummy)
364 int dummy ATTRIBUTE_UNUSED;
365{
366 offsetT filenum, line, column;
367
368 filenum = get_absolute_expression ();
369 SKIP_WHITESPACE ();
370 line = get_absolute_expression ();
371 SKIP_WHITESPACE ();
372 column = get_absolute_expression ();
373 demand_empty_rest_of_line ();
374
375 if (filenum < 0)
376 {
377 as_bad (_("File number less than zero"));
378 return;
379 }
bccba5f0 380 if (filenum >= (int) user_filenum_allocated
220e750f
RH
381 || user_filenum[filenum] == 0)
382 {
383 as_bad (_("Unassigned file number %ld"), (long) filenum);
384 return;
385 }
386
387 current.filenum = user_filenum[filenum];
388 current.line = line;
389 current.column = column;
390 current.flags = DWARF2_FLAG_BEGIN_STMT;
391
392 loc_directive_seen = true;
393
394#ifndef NO_LISTING
395 if (listing)
396 listing_source_line (line);
397#endif
398}
399
400\f
401static struct frag *
402first_frag_for_seg (seg)
403 segT seg;
404{
405 frchainS *f, *first = NULL;
406
407 for (f = frchain_root; f ; f = f->frch_next)
408 if (f->frch_seg == seg
409 && (! first || first->frch_subseg > f->frch_subseg))
410 first = f;
411
412 return first ? first->frch_root : NULL;
413}
414
415static struct frag *
416last_frag_for_seg (seg)
417 segT seg;
418{
419 frchainS *f, *last = NULL;
420
421 for (f = frchain_root; f ; f = f->frch_next)
422 if (f->frch_seg == seg
423 && (! last || last->frch_subseg < f->frch_subseg))
424 last= f;
425
426 return last ? last->frch_last : NULL;
427}
428\f
429/* Emit a single byte into the current segment. */
430
431static inline void
432out_byte (byte)
433 int byte;
434{
435 FRAG_APPEND_1_CHAR (byte);
436}
437
438/* Emit a statement program opcode into the current segment. */
439
440static inline void
441out_opcode (opc)
442 int opc;
443{
444 out_byte (opc);
445}
446
447/* Emit a two-byte word into the current segment. */
448
449static inline void
450out_two (data)
451 int data;
452{
453 md_number_to_chars (frag_more (2), data, 2);
454}
455
456/* Emit a four byte word into the current segment. */
457
458static inline void
459out_four (data)
460 int data;
461{
462 md_number_to_chars (frag_more (4), data, 4);
463}
464
465/* Emit an unsigned "little-endian base 128" number. */
466
fac0d250 467static void
220e750f
RH
468out_uleb128 (value)
469 addressT value;
470{
471 output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0);
472}
473
474/* Emit a tuple for .debug_abbrev. */
475
476static inline void
477out_abbrev (name, form)
478 int name, form;
fac0d250 479{
220e750f
RH
480 out_uleb128 (name);
481 out_uleb128 (form);
482}
fac0d250 483
220e750f
RH
484/* Create a new fake symbol whose value is the current position. */
485
486static symbolS *
487symbol_new_now ()
488{
489 return symbol_new (fake_label_name, now_seg, frag_now_fix (), frag_now);
fac0d250
RH
490}
491
220e750f 492/* Set the value of SYM to the current position in the current segment. */
353e2c69 493
fac0d250 494static void
220e750f
RH
495set_symbol_value_now (sym)
496 symbolS *sym;
fac0d250 497{
220e750f
RH
498 S_SET_SEGMENT (sym, now_seg);
499 S_SET_VALUE (sym, frag_now_fix ());
500 symbol_set_frag (sym, frag_now);
501}
502
503/* Get the size of a fragment. */
fac0d250 504
220e750f
RH
505static offsetT
506get_frag_fix (frag)
507 fragS *frag;
508{
509 frchainS *fr;
510
511 if (frag->fr_next)
512 return frag->fr_fix;
513
514 /* If a fragment is the last in the chain, special measures must be
515 taken to find its size before relaxation, since it may be pending
516 on some subsegment chain. */
517 for (fr = frchain_root; fr ; fr = fr->frch_next)
518 if (fr->frch_last == frag)
519 {
520 return ((char *) obstack_next_free (&fr->frch_obstack)
521 - frag->fr_literal);
522 }
523
524 abort ();
525}
fac0d250 526
220e750f 527/* Set an absolute address (may result in a relocation entry). */
fac0d250 528
220e750f
RH
529static void
530out_set_addr (seg, frag, ofs)
531 segT seg;
532 fragS *frag;
533 addressT ofs;
534{
535 expressionS expr;
536 symbolS *sym;
fac0d250 537
220e750f 538 sym = symbol_new (fake_label_name, seg, ofs, frag);
9e3af0e7 539
fac0d250 540 out_opcode (DW_LNS_extended_op);
220e750f 541 out_uleb128 (sizeof_address + 1);
fac0d250
RH
542
543 out_opcode (DW_LNE_set_address);
544 expr.X_op = O_symbol;
545 expr.X_add_symbol = sym;
546 expr.X_add_number = 0;
220e750f 547 emit_expr (&expr, sizeof_address);
fac0d250
RH
548}
549
220e750f
RH
550/* Encode a pair of line and address skips as efficiently as possible.
551 Note that the line skip is signed, whereas the address skip is unsigned.
353e2c69 552
220e750f
RH
553 The following two routines *must* be kept in sync. This is
554 enforced by making emit_inc_line_addr abort if we do not emit
555 exactly the expected number of bytes. */
556
557static int
558size_inc_line_addr (line_delta, addr_delta)
559 int line_delta;
560 addressT addr_delta;
fac0d250 561{
220e750f
RH
562 unsigned int tmp, opcode;
563 int len = 0;
fac0d250 564
220e750f 565 /* Scale the address delta by the minimum instruction length. */
bccba5f0 566#if DWARF2_LINE_MIN_INSN_LENGTH > 1
220e750f
RH
567 assert (addr_delta % DWARF2_LINE_MIN_INSN_LENGTH == 0);
568 addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
bccba5f0 569#endif
220e750f
RH
570
571 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
572 We cannot use special opcodes here, since we want the end_sequence
573 to emit the matrix entry. */
574 if (line_delta == INT_MAX)
fac0d250 575 {
220e750f
RH
576 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
577 len = 1;
fac0d250 578 else
220e750f
RH
579 len = 1 + sizeof_leb128 (addr_delta, 0);
580 return len + 3;
fac0d250 581 }
fac0d250 582
220e750f
RH
583 /* Bias the line delta by the base. */
584 tmp = line_delta - DWARF2_LINE_BASE;
fac0d250 585
220e750f
RH
586 /* If the line increment is out of range of a special opcode, we
587 must encode it with DW_LNS_advance_line. */
588 if (tmp >= DWARF2_LINE_RANGE)
589 {
590 len = 1 + sizeof_leb128 (line_delta, 1);
591 line_delta = 0;
592 tmp = 0 - DWARF2_LINE_BASE;
593 }
fac0d250 594
220e750f
RH
595 /* Bias the opcode by the special opcode base. */
596 tmp += DWARF2_LINE_OPCODE_BASE;
353e2c69 597
220e750f
RH
598 /* Avoid overflow when addr_delta is large. */
599 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
600 {
601 /* Try using a special opcode. */
602 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
603 if (opcode <= 255)
604 return len + 1;
605
606 /* Try using DW_LNS_const_add_pc followed by special op. */
607 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
608 if (opcode <= 255)
609 return len + 2;
610 }
611
612 /* Otherwise use DW_LNS_advance_pc. */
613 len += 1 + sizeof_leb128 (addr_delta, 0);
614
615 /* DW_LNS_copy or special opcode. */
616 len += 1;
617
618 return len;
619}
fac0d250 620
220e750f
RH
621static void
622emit_inc_line_addr (line_delta, addr_delta, p, len)
623 int line_delta;
624 addressT addr_delta;
625 char *p;
626 int len;
627{
628 unsigned int tmp, opcode;
629 int need_copy = 0;
630 char *end = p + len;
fac0d250 631
bccba5f0 632#if DWARF2_LINE_MIN_INSN_LENGTH > 1
220e750f
RH
633 /* Scale the address delta by the minimum instruction length. */
634 assert (addr_delta % DWARF2_LINE_MIN_INSN_LENGTH == 0);
635 addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
bccba5f0 636#endif
220e750f
RH
637 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
638 We cannot use special opcodes here, since we want the end_sequence
639 to emit the matrix entry. */
640 if (line_delta == INT_MAX)
fac0d250 641 {
220e750f
RH
642 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
643 *p++ = DW_LNS_const_add_pc;
644 else
fac0d250 645 {
220e750f
RH
646 *p++ = DW_LNS_advance_pc;
647 p += output_leb128 (p, addr_delta, 0);
fac0d250 648 }
220e750f
RH
649
650 *p++ = DW_LNS_extended_op;
651 *p++ = 1;
652 *p++ = DW_LNE_end_sequence;
653 goto done;
fac0d250
RH
654 }
655
220e750f
RH
656 /* Bias the line delta by the base. */
657 tmp = line_delta - DWARF2_LINE_BASE;
658
659 /* If the line increment is out of range of a special opcode, we
660 must encode it with DW_LNS_advance_line. */
661 if (tmp >= DWARF2_LINE_RANGE)
fac0d250 662 {
220e750f
RH
663 *p++ = DW_LNS_advance_line;
664 p += output_leb128 (p, line_delta, 1);
fac0d250 665
220e750f
RH
666 /* Prettier, I think, to use DW_LNS_copy instead of a
667 "line +0, addr +0" special opcode. */
668 if (addr_delta == 0)
669 {
670 *p++ = DW_LNS_copy;
671 goto done;
672 }
cb30237e 673
220e750f
RH
674 line_delta = 0;
675 tmp = 0 - DWARF2_LINE_BASE;
676 need_copy = 1;
677 }
fac0d250 678
220e750f
RH
679 /* Bias the opcode by the special opcode base. */
680 tmp += DWARF2_LINE_OPCODE_BASE;
fac0d250 681
220e750f
RH
682 /* Avoid overflow when addr_delta is large. */
683 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
fac0d250 684 {
220e750f
RH
685 /* Try using a special opcode. */
686 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
687 if (opcode <= 255)
688 {
689 *p++ = opcode;
690 goto done;
691 }
692
693 /* Try using DW_LNS_const_add_pc followed by special op. */
694 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
695 if (opcode <= 255)
fac0d250 696 {
220e750f
RH
697 *p++ = DW_LNS_const_add_pc;
698 *p++ = opcode;
699 goto done;
fac0d250
RH
700 }
701 }
220e750f
RH
702
703 /* Otherwise use DW_LNS_advance_pc. */
704 *p++ = DW_LNS_advance_pc;
705 p += output_leb128 (p, addr_delta, 0);
706
707 if (need_copy)
708 *p++ = DW_LNS_copy;
fac0d250 709 else
220e750f 710 *p++ = tmp;
fac0d250 711
220e750f
RH
712 done:
713 assert (p == end);
714}
a8316fe2 715
220e750f 716/* Handy routine to combine calls to the above two routines. */
e1c05f12 717
220e750f
RH
718static void
719out_inc_line_addr (line_delta, addr_delta)
720 int line_delta;
721 addressT addr_delta;
722{
723 int len = size_inc_line_addr (line_delta, addr_delta);
724 emit_inc_line_addr (line_delta, addr_delta, frag_more (len), len);
725}
9de8d8f1 726
220e750f
RH
727/* Generate a variant frag that we can use to relax address/line
728 increments between fragments of the target segment. */
9e3af0e7 729
220e750f
RH
730static void
731relax_inc_line_addr (line_delta, seg, to_frag, to_ofs, from_frag, from_ofs)
732 int line_delta;
733 segT seg;
734 fragS *to_frag, *from_frag;
735 addressT to_ofs, from_ofs;
736{
737 symbolS *to_sym, *from_sym;
738 expressionS expr;
739 int max_chars;
6576f0b5 740
220e750f
RH
741 to_sym = symbol_new (fake_label_name, seg, to_ofs, to_frag);
742 from_sym = symbol_new (fake_label_name, seg, from_ofs, from_frag);
fac0d250 743
220e750f
RH
744 expr.X_op = O_subtract;
745 expr.X_add_symbol = to_sym;
746 expr.X_op_symbol = from_sym;
747 expr.X_add_number = 0;
fac0d250 748
220e750f
RH
749 /* The maximum size of the frag is the line delta with a maximum
750 sized address delta. */
751 max_chars = size_inc_line_addr (line_delta, -DWARF2_LINE_MIN_INSN_LENGTH);
fac0d250 752
220e750f
RH
753 frag_var (rs_dwarf2dbg, max_chars, max_chars, 1,
754 make_expr_symbol (&expr), line_delta, NULL);
755}
fac0d250 756
220e750f
RH
757/* The function estimates the size of a rs_dwarf2dbg variant frag
758 based on the current values of the symbols. It is called before
759 the relaxation loop. We set fr_subtype to the expected length. */
fac0d250 760
220e750f
RH
761int
762dwarf2dbg_estimate_size_before_relax (frag)
763 fragS *frag;
764{
765 offsetT addr_delta;
766 int size;
fac0d250 767
220e750f
RH
768 addr_delta = resolve_symbol_value (frag->fr_symbol, 0);
769 size = size_inc_line_addr (frag->fr_offset, addr_delta);
fac0d250 770
220e750f 771 frag->fr_subtype = size;
fac0d250 772
220e750f
RH
773 return size;
774}
775
776/* This function relaxes a rs_dwarf2dbg variant frag based on the
777 current values of the symbols. fr_subtype is the current length
778 of the frag. This returns the change in frag length. */
779
780int
781dwarf2dbg_relax_frag (frag)
782 fragS *frag;
783{
784 int old_size, new_size;
fac0d250 785
220e750f
RH
786 old_size = frag->fr_subtype;
787 new_size = dwarf2dbg_estimate_size_before_relax (frag);
788
789 return new_size - old_size;
fac0d250
RH
790}
791
220e750f
RH
792/* This function converts a rs_dwarf2dbg variant frag into a normal
793 fill frag. This is called after all relaxation has been done.
794 fr_subtype will be the desired length of the frag. */
795
796void
797dwarf2dbg_convert_frag (frag)
798 fragS *frag;
fac0d250 799{
220e750f
RH
800 offsetT addr_diff;
801
802 addr_diff = resolve_symbol_value (frag->fr_symbol, 1);
fac0d250 803
220e750f
RH
804 /* fr_var carries the max_chars that we created the fragment with.
805 fr_subtype carries the current expected length. We must, of
806 course, have allocated enough memory earlier. */
bccba5f0 807 assert (frag->fr_var >= (int) frag->fr_subtype);
fac0d250 808
220e750f
RH
809 emit_inc_line_addr (frag->fr_offset, addr_diff,
810 frag->fr_literal + frag->fr_fix, frag->fr_subtype);
811
812 frag->fr_fix += frag->fr_subtype;
813 frag->fr_type = rs_fill;
814 frag->fr_var = 0;
815 frag->fr_offset = 0;
816}
817
818/* Generate .debug_line content for the chain of line number entries
819 beginning at E, for segment SEG. */
820
821static void
822process_entries (seg, e)
823 segT seg;
824 struct line_entry *e;
825{
826 unsigned filenum = 1;
827 unsigned line = 1;
828 unsigned column = 0;
829 unsigned flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_BEGIN_STMT : 0;
830 fragS *frag = NULL;
831 fragS *last_frag;
832 addressT frag_ofs = 0;
833 addressT last_frag_ofs;
834 struct line_entry *next;
835
836 while (e)
fac0d250 837 {
220e750f
RH
838 int changed = 0;
839
840 if (filenum != e->loc.filenum)
fac0d250 841 {
220e750f
RH
842 filenum = e->loc.filenum;
843 out_opcode (DW_LNS_set_file);
844 out_uleb128 (filenum);
845 changed = 1;
846 }
847
848 if (column != e->loc.column)
849 {
850 column = e->loc.column;
851 out_opcode (DW_LNS_set_column);
852 out_uleb128 (column);
853 changed = 1;
854 }
855
856 if ((e->loc.flags ^ flags) & DWARF2_FLAG_BEGIN_STMT)
857 {
858 flags = e->loc.flags;
859 out_opcode (DW_LNS_negate_stmt);
860 changed = 1;
861 }
862
863 if (e->loc.flags & DWARF2_FLAG_BEGIN_BLOCK)
864 {
865 out_opcode (DW_LNS_set_basic_block);
866 changed = 1;
867 }
868
869 if (line != e->loc.line || changed)
870 {
871 int line_delta = e->loc.line - line;
872 if (frag == NULL)
fac0d250 873 {
220e750f
RH
874 out_set_addr (seg, e->frag, e->frag_ofs);
875 out_inc_line_addr (line_delta, 0);
fac0d250 876 }
220e750f
RH
877 else if (frag == e->frag)
878 out_inc_line_addr (line_delta, e->frag_ofs - frag_ofs);
879 else
880 relax_inc_line_addr (line_delta, seg, e->frag, e->frag_ofs,
881 frag, frag_ofs);
882
883 frag = e->frag;
884 frag_ofs = e->frag_ofs;
885 line = e->loc.line;
fac0d250 886 }
220e750f
RH
887 else if (frag == NULL)
888 {
889 out_set_addr (seg, e->frag, e->frag_ofs);
890 frag = e->frag;
891 frag_ofs = e->frag_ofs;
892 }
893
894 next = e->next;
895 free (e);
896 e = next;
fac0d250 897 }
353e2c69 898
220e750f
RH
899 /* Emit a DW_LNE_end_sequence for the end of the section. */
900 last_frag = last_frag_for_seg (seg);
901 last_frag_ofs = get_frag_fix (last_frag);
902 if (frag == last_frag)
903 out_inc_line_addr (INT_MAX, last_frag_ofs - frag_ofs);
904 else
905 relax_inc_line_addr (INT_MAX, seg, last_frag, last_frag_ofs,
906 frag, frag_ofs);
fac0d250
RH
907}
908
220e750f
RH
909/* Emit the directory and file tables for .debug_line. */
910
fac0d250 911static void
220e750f 912out_file_list ()
fac0d250
RH
913{
914 size_t size;
915 char *cp;
220e750f
RH
916 unsigned int i;
917
918 /* Terminate directory list. */
919 out_byte ('\0');
fac0d250 920
220e750f 921 for (i = 1; i < files_in_use; ++i)
fac0d250 922 {
220e750f 923 size = strlen (files[i].filename) + 1;
fac0d250 924 cp = frag_more (size);
220e750f 925 memcpy (cp, files[i].filename, size);
fac0d250 926
220e750f 927 out_uleb128 (files[i].dir); /* directory number */
fac0d250
RH
928 out_uleb128 (0); /* last modification timestamp */
929 out_uleb128 (0); /* filesize */
930 }
353e2c69
KH
931
932 /* Terminate filename list. */
933 out_byte (0);
fac0d250
RH
934}
935
220e750f
RH
936/* Emit the collected .debug_line data. */
937
938static void
939out_debug_line (line_seg)
940 segT line_seg;
941{
942 expressionS expr;
943 symbolS *line_start;
944 symbolS *prologue_end;
945 symbolS *line_end;
946 struct line_seg *s;
947
948 subseg_set (line_seg, 0);
949
950 line_start = symbol_new_now ();
951 prologue_end = symbol_make (fake_label_name);
952 line_end = symbol_make (fake_label_name);
953
954 /* Total length of the information for this compilation unit. */
955 expr.X_op = O_subtract;
956 expr.X_add_symbol = line_end;
957 expr.X_op_symbol = line_start;
958 expr.X_add_number = -4;
959 emit_expr (&expr, 4);
960
961 /* Version. */
962 out_two (2);
963
964 /* Length of the prologue following this length. */
965 expr.X_op = O_subtract;
966 expr.X_add_symbol = prologue_end;
967 expr.X_op_symbol = line_start;
968 expr.X_add_number = - (4 + 2 + 4);
969 emit_expr (&expr, 4);
970
971 /* Parameters of the state machine. */
972 out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
973 out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
974 out_byte (DWARF2_LINE_BASE);
975 out_byte (DWARF2_LINE_RANGE);
976 out_byte (DWARF2_LINE_OPCODE_BASE);
977
978 /* Standard opcode lengths. */
979 out_byte (0); /* DW_LNS_copy */
980 out_byte (1); /* DW_LNS_advance_pc */
981 out_byte (1); /* DW_LNS_advance_line */
982 out_byte (1); /* DW_LNS_set_file */
983 out_byte (1); /* DW_LNS_set_column */
984 out_byte (0); /* DW_LNS_negate_stmt */
985 out_byte (0); /* DW_LNS_set_basic_block */
986 out_byte (0); /* DW_LNS_const_add_pc */
987 out_byte (1); /* DW_LNS_fixed_advance_pc */
988
989 out_file_list ();
990
991 set_symbol_value_now (prologue_end);
992
993 /* For each section, emit a statement program. */
994 for (s = all_segs; s ; s = s->next)
995 process_entries (s->seg, s->head->head);
996
997 set_symbol_value_now (line_end);
998}
999
1000/* Emit data for .debug_aranges. */
1001
58b5739a 1002static void
220e750f
RH
1003out_debug_aranges (aranges_seg, info_seg)
1004 segT aranges_seg;
1005 segT info_seg;
fac0d250 1006{
220e750f
RH
1007 unsigned int addr_size = sizeof_address;
1008 addressT size, skip;
1009 struct line_seg *s;
1010 expressionS expr;
1011 char *p;
fac0d250 1012
220e750f 1013 size = 4 + 2 + 4 + 1 + 1;
fac0d250 1014
220e750f
RH
1015 skip = 2*addr_size - (size & (2*addr_size - 1));
1016 if (skip == 2*addr_size)
1017 skip = 0;
1018 size += skip;
fac0d250 1019
220e750f
RH
1020 for (s = all_segs; s ; s = s->next)
1021 size += 2*addr_size;
fac0d250 1022
220e750f 1023 size += 2*addr_size;
fac0d250 1024
220e750f 1025 subseg_set (aranges_seg, 0);
fac0d250 1026
220e750f
RH
1027 /* Length of the compilation unit. */
1028 out_four (size - 4);
fac0d250 1029
220e750f
RH
1030 /* Version. */
1031 out_two (2);
4dc7ead9 1032
220e750f
RH
1033 /* Offset to .debug_info. */
1034 expr.X_op = O_symbol;
1035 expr.X_add_symbol = section_symbol (info_seg);
1036 expr.X_add_number = 0;
1037 emit_expr (&expr, 4);
1038
1039 /* Size of an address (offset portion). */
1040 out_byte (addr_size);
1041
1042 /* Size of a segment descriptor. */
1043 out_byte (0);
1044
1045 /* Align the header. */
1046 if (skip)
1047 frag_align (ffs (2*addr_size) - 1, 0, 0);
4dc7ead9 1048
220e750f
RH
1049 for (s = all_segs; s ; s = s->next)
1050 {
1051 fragS *frag;
1052 symbolS *beg, *end;
1053
1054 frag = first_frag_for_seg (s->seg);
1055 beg = symbol_new (fake_label_name, s->seg, 0, frag);
1056 s->text_start = beg;
1057
1058 frag = last_frag_for_seg (s->seg);
1059 end = symbol_new (fake_label_name, s->seg, get_frag_fix (frag), frag);
1060 s->text_end = end;
1061
1062 expr.X_op = O_symbol;
1063 expr.X_add_symbol = beg;
1064 expr.X_add_number = 0;
1065 emit_expr (&expr, addr_size);
1066
1067 expr.X_op = O_subtract;
1068 expr.X_add_symbol = end;
1069 expr.X_op_symbol = beg;
1070 expr.X_add_number = 0;
1071 emit_expr (&expr, addr_size);
1072 }
4dc7ead9 1073
220e750f
RH
1074 p = frag_more (2 * addr_size);
1075 md_number_to_chars (p, 0, addr_size);
1076 md_number_to_chars (p + addr_size, 0, addr_size);
4dc7ead9
RH
1077}
1078
220e750f
RH
1079/* Emit data for .debug_abbrev. Note that this must be kept in
1080 sync with out_debug_info below. */
fac0d250 1081
220e750f
RH
1082static void
1083out_debug_abbrev (abbrev_seg)
1084 segT abbrev_seg;
1085{
1086 subseg_set (abbrev_seg, 0);
fac0d250 1087
220e750f
RH
1088 out_uleb128 (1);
1089 out_uleb128 (DW_TAG_compile_unit);
1090 out_byte (DW_CHILDREN_no);
1091 out_abbrev (DW_AT_stmt_list, DW_FORM_data4);
1092 if (all_segs->next == NULL)
4dc7ead9 1093 {
220e750f
RH
1094 out_abbrev (DW_AT_low_pc, DW_FORM_addr);
1095 out_abbrev (DW_AT_high_pc, DW_FORM_addr);
1096 }
1097 out_abbrev (DW_AT_comp_dir, DW_FORM_string);
1098 out_abbrev (DW_AT_producer, DW_FORM_string);
1099 out_abbrev (DW_AT_language, DW_FORM_data2);
1100 out_abbrev (0, 0);
1101}
4dc7ead9 1102
220e750f 1103/* Emit a description of this compilation unit for .debug_info. */
4dc7ead9 1104
220e750f
RH
1105static void
1106out_debug_info (info_seg, abbrev_seg, line_seg)
1107 segT info_seg;
1108 segT abbrev_seg;
1109 segT line_seg;
1110{
1111 char producer[128];
1112 char *comp_dir;
1113 expressionS expr;
1114 symbolS *info_start;
1115 symbolS *info_end;
1116 char *p;
1117 int len;
4dc7ead9 1118
220e750f 1119 subseg_set (info_seg, 0);
4dc7ead9 1120
220e750f
RH
1121 info_start = symbol_new_now();
1122 info_end = symbol_make (fake_label_name);
4dc7ead9 1123
220e750f
RH
1124 /* Compilation Unit length. */
1125 expr.X_op = O_subtract;
1126 expr.X_add_symbol = info_end;
1127 expr.X_op_symbol = info_start;
1128 expr.X_add_number = -4;
1129 emit_expr (&expr, 4);
4dc7ead9 1130
220e750f
RH
1131 /* DWARF version. */
1132 out_two (2);
4dc7ead9 1133
220e750f
RH
1134 /* .debug_abbrev offset */
1135 expr.X_op = O_symbol;
1136 expr.X_add_symbol = section_symbol (abbrev_seg);
1137 expr.X_add_number = 0;
1138 emit_expr (&expr, 4);
4dc7ead9 1139
220e750f
RH
1140 /* Target address size. */
1141 out_byte (sizeof_address);
fac0d250 1142
220e750f
RH
1143 /* DW_TAG_compile_unit DIE abbrev */
1144 out_uleb128 (1);
fac0d250 1145
220e750f
RH
1146 /* DW_AT_stmt_list */
1147 expr.X_op = O_symbol;
1148 expr.X_add_symbol = section_symbol (line_seg);
1149 expr.X_add_number = 0;
1150 emit_expr (&expr, 4);
fac0d250 1151
220e750f
RH
1152 /* These two attributes may only be emitted if all of the code is
1153 contiguous. Multiple sections are not that. */
1154 if (all_segs->next == NULL)
58b5739a 1155 {
220e750f
RH
1156 /* DW_AT_low_pc */
1157 expr.X_op = O_symbol;
1158 expr.X_add_symbol = all_segs->text_start;
1159 expr.X_add_number = 0;
1160 emit_expr (&expr, sizeof_address);
1161
1162 /* DW_AT_high_pc */
1163 expr.X_op = O_symbol;
1164 expr.X_add_symbol = all_segs->text_end;
1165 expr.X_add_number = 0;
1166 emit_expr (&expr, sizeof_address);
58b5739a
RH
1167 }
1168
220e750f
RH
1169 /* DW_AT_comp_dir */
1170 comp_dir = getpwd ();
1171 len = strlen (comp_dir) + 1;
1172 p = frag_more (len);
1173 memcpy (p, comp_dir, len);
fac0d250 1174
220e750f
RH
1175 /* DW_AT_producer */
1176 sprintf (producer, "GNU AS %s", VERSION);
1177 len = strlen (producer) + 1;
1178 p = frag_more (len);
1179 memcpy (p, producer, len);
fac0d250 1180
220e750f
RH
1181 /* DW_AT_language. Yes, this is probably not really MIPS, but the
1182 dwarf2 draft has no standard code for assembler. */
1183 out_two (DW_LANG_Mips_Assembler);
1184
1185 set_symbol_value_now (info_end);
fac0d250
RH
1186}
1187
1188void
220e750f 1189dwarf2_finish ()
fac0d250 1190{
220e750f
RH
1191 segT line_seg;
1192 struct line_seg *s;
fac0d250 1193
220e750f
RH
1194 /* If no debug information was recorded, nothing to do. */
1195 if (all_segs == NULL)
1196 return;
fac0d250 1197
220e750f
RH
1198 /* Calculate the size of an address for the target machine. */
1199#ifdef BFD_ASSEMBLER
1200 sizeof_address = bfd_arch_bits_per_address (stdoutput) / 8;
1201#else
1202 /* FIXME. */
1203 sizeof_address = 4;
1204#endif
fac0d250 1205
220e750f
RH
1206 /* Create and switch to the line number section. */
1207 line_seg = subseg_new (".debug_line", 0);
1208#ifdef BFD_ASSEMBLER
1209 bfd_set_section_flags (stdoutput, line_seg, SEC_READONLY);
fac0d250 1210#endif
fac0d250 1211
220e750f
RH
1212 /* For each subsection, chain the debug entries together. */
1213 for (s = all_segs; s ; s = s->next)
fac0d250 1214 {
220e750f
RH
1215 struct line_subseg *ss = s->head;
1216 struct line_entry **ptail = ss->ptail;
1217
1218 while ((ss = ss->next) != NULL)
1219 {
1220 *ptail = ss->head;
1221 ptail = ss->ptail;
1222 }
fac0d250 1223 }
85a39694 1224
220e750f 1225 out_debug_line (line_seg);
85a39694 1226
220e750f
RH
1227 /* If this is assembler generated line info, we need .debug_info
1228 and .debug_abbrev sections as well. */
1229 if (debug_type == DEBUG_DWARF2)
1230 {
1231 segT abbrev_seg;
1232 segT info_seg;
1233 segT aranges_seg;
4dc7ead9 1234
220e750f
RH
1235 info_seg = subseg_new (".debug_info", 0);
1236 abbrev_seg = subseg_new (".debug_abbrev", 0);
1237 aranges_seg = subseg_new (".debug_aranges", 0);
ef99799a 1238
220e750f
RH
1239#ifdef BFD_ASSEMBLER
1240 bfd_set_section_flags (stdoutput, info_seg, SEC_READONLY);
1241 bfd_set_section_flags (stdoutput, abbrev_seg, SEC_READONLY);
1242 bfd_set_section_flags (stdoutput, aranges_seg, SEC_READONLY);
1243#endif
ef99799a 1244
220e750f 1245 record_alignment (aranges_seg, ffs (2*sizeof_address) - 1);
ef99799a 1246
220e750f
RH
1247 out_debug_aranges (aranges_seg, info_seg);
1248 out_debug_abbrev (abbrev_seg);
1249 out_debug_info (info_seg, abbrev_seg, line_seg);
1250 }
85a39694 1251}
92eb7b32
L
1252
1253#else
1254void
1255dwarf2_finish ()
1256{
1257}
1258
1259int
1260dwarf2dbg_estimate_size_before_relax (frag)
1261 fragS *frag ATTRIBUTE_UNUSED;
1262{
1263 as_fatal (_("dwarf2 is not supported for this object file format"));
1264 return 0;
1265}
1266
1267int
1268dwarf2dbg_relax_frag (frag)
1269 fragS *frag ATTRIBUTE_UNUSED;
1270{
1271 as_fatal (_("dwarf2 is not supported for this object file format"));
1272 return 0;
1273}
1274
1275void
1276dwarf2dbg_convert_frag (frag)
1277 fragS *frag ATTRIBUTE_UNUSED;
1278{
1279 as_fatal (_("dwarf2 is not supported for this object file format"));
1280}
1281
1282void
1283dwarf2_emit_insn (size)
1284 int size ATTRIBUTE_UNUSED;
1285{
1286}
1287
1288void
1289dwarf2_directive_file (dummy)
1290 int dummy ATTRIBUTE_UNUSED;
1291{
1292 as_fatal (_("dwarf2 is not supported for this object file format"));
1293}
1294
1295void
1296dwarf2_directive_loc (dummy)
1297 int dummy ATTRIBUTE_UNUSED;
1298{
1299 as_fatal (_("dwarf2 is not supported for this object file format"));
1300}
1301#endif /* BFD_ASSEMBLER */
This page took 0.114048 seconds and 4 git commands to generate.