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