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