* mips.igen (CFC1, CTC1): Pass the correct register numbers to
[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 {
249e3833 344 as_bad (_("File number less than one"));
fac0d250
RH
345 return;
346 }
347
249e3833 348 if (num < files_in_use && files[num].filename != 0)
220e750f 349 {
e46d99eb 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 {
249e3833 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
RH
390 {
391 as_bad (_("Unassigned file number %ld"), (long) filenum);
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 {
527 return ((char *) obstack_next_free (&fr->frch_obstack)
528 - frag->fr_literal);
529 }
530
531 abort ();
532}
fac0d250 533
220e750f 534/* Set an absolute address (may result in a relocation entry). */
fac0d250 535
220e750f
RH
536static void
537out_set_addr (seg, frag, ofs)
538 segT seg;
539 fragS *frag;
540 addressT ofs;
541{
542 expressionS expr;
543 symbolS *sym;
fac0d250 544
220e750f 545 sym = symbol_new (fake_label_name, seg, ofs, frag);
9e3af0e7 546
fac0d250 547 out_opcode (DW_LNS_extended_op);
220e750f 548 out_uleb128 (sizeof_address + 1);
fac0d250
RH
549
550 out_opcode (DW_LNE_set_address);
551 expr.X_op = O_symbol;
552 expr.X_add_symbol = sym;
553 expr.X_add_number = 0;
220e750f 554 emit_expr (&expr, sizeof_address);
fac0d250
RH
555}
556
220e750f
RH
557/* Encode a pair of line and address skips as efficiently as possible.
558 Note that the line skip is signed, whereas the address skip is unsigned.
353e2c69 559
220e750f
RH
560 The following two routines *must* be kept in sync. This is
561 enforced by making emit_inc_line_addr abort if we do not emit
562 exactly the expected number of bytes. */
563
564static int
565size_inc_line_addr (line_delta, addr_delta)
566 int line_delta;
567 addressT addr_delta;
fac0d250 568{
220e750f
RH
569 unsigned int tmp, opcode;
570 int len = 0;
fac0d250 571
220e750f 572 /* Scale the address delta by the minimum instruction length. */
ee515fb7 573#if DWARF2_LINE_MIN_INSN_LENGTH > 1
220e750f
RH
574 assert (addr_delta % DWARF2_LINE_MIN_INSN_LENGTH == 0);
575 addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
bccba5f0 576#endif
220e750f
RH
577
578 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
579 We cannot use special opcodes here, since we want the end_sequence
580 to emit the matrix entry. */
581 if (line_delta == INT_MAX)
fac0d250 582 {
220e750f
RH
583 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
584 len = 1;
fac0d250 585 else
220e750f
RH
586 len = 1 + sizeof_leb128 (addr_delta, 0);
587 return len + 3;
fac0d250 588 }
fac0d250 589
220e750f
RH
590 /* Bias the line delta by the base. */
591 tmp = line_delta - DWARF2_LINE_BASE;
fac0d250 592
220e750f
RH
593 /* If the line increment is out of range of a special opcode, we
594 must encode it with DW_LNS_advance_line. */
595 if (tmp >= DWARF2_LINE_RANGE)
596 {
597 len = 1 + sizeof_leb128 (line_delta, 1);
598 line_delta = 0;
599 tmp = 0 - DWARF2_LINE_BASE;
600 }
fac0d250 601
220e750f
RH
602 /* Bias the opcode by the special opcode base. */
603 tmp += DWARF2_LINE_OPCODE_BASE;
353e2c69 604
220e750f
RH
605 /* Avoid overflow when addr_delta is large. */
606 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
607 {
608 /* Try using a special opcode. */
609 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
610 if (opcode <= 255)
611 return len + 1;
612
613 /* Try using DW_LNS_const_add_pc followed by special op. */
614 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
615 if (opcode <= 255)
616 return len + 2;
617 }
618
619 /* Otherwise use DW_LNS_advance_pc. */
620 len += 1 + sizeof_leb128 (addr_delta, 0);
621
622 /* DW_LNS_copy or special opcode. */
623 len += 1;
624
625 return len;
626}
fac0d250 627
220e750f
RH
628static void
629emit_inc_line_addr (line_delta, addr_delta, p, len)
630 int line_delta;
631 addressT addr_delta;
632 char *p;
633 int len;
634{
635 unsigned int tmp, opcode;
636 int need_copy = 0;
637 char *end = p + len;
fac0d250 638
ee515fb7 639#if DWARF2_LINE_MIN_INSN_LENGTH > 1
220e750f
RH
640 /* Scale the address delta by the minimum instruction length. */
641 assert (addr_delta % DWARF2_LINE_MIN_INSN_LENGTH == 0);
642 addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
bccba5f0 643#endif
220e750f
RH
644 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
645 We cannot use special opcodes here, since we want the end_sequence
646 to emit the matrix entry. */
647 if (line_delta == INT_MAX)
fac0d250 648 {
220e750f
RH
649 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
650 *p++ = DW_LNS_const_add_pc;
651 else
fac0d250 652 {
220e750f
RH
653 *p++ = DW_LNS_advance_pc;
654 p += output_leb128 (p, addr_delta, 0);
fac0d250 655 }
220e750f
RH
656
657 *p++ = DW_LNS_extended_op;
658 *p++ = 1;
659 *p++ = DW_LNE_end_sequence;
660 goto done;
fac0d250
RH
661 }
662
220e750f
RH
663 /* Bias the line delta by the base. */
664 tmp = line_delta - DWARF2_LINE_BASE;
665
666 /* If the line increment is out of range of a special opcode, we
667 must encode it with DW_LNS_advance_line. */
668 if (tmp >= DWARF2_LINE_RANGE)
fac0d250 669 {
220e750f
RH
670 *p++ = DW_LNS_advance_line;
671 p += output_leb128 (p, line_delta, 1);
fac0d250 672
220e750f
RH
673 /* Prettier, I think, to use DW_LNS_copy instead of a
674 "line +0, addr +0" special opcode. */
675 if (addr_delta == 0)
676 {
677 *p++ = DW_LNS_copy;
678 goto done;
679 }
cb30237e 680
220e750f
RH
681 line_delta = 0;
682 tmp = 0 - DWARF2_LINE_BASE;
683 need_copy = 1;
684 }
fac0d250 685
220e750f
RH
686 /* Bias the opcode by the special opcode base. */
687 tmp += DWARF2_LINE_OPCODE_BASE;
fac0d250 688
220e750f
RH
689 /* Avoid overflow when addr_delta is large. */
690 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
fac0d250 691 {
220e750f
RH
692 /* Try using a special opcode. */
693 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
694 if (opcode <= 255)
695 {
696 *p++ = opcode;
697 goto done;
698 }
699
700 /* Try using DW_LNS_const_add_pc followed by special op. */
701 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
702 if (opcode <= 255)
fac0d250 703 {
220e750f
RH
704 *p++ = DW_LNS_const_add_pc;
705 *p++ = opcode;
706 goto done;
fac0d250
RH
707 }
708 }
220e750f
RH
709
710 /* Otherwise use DW_LNS_advance_pc. */
711 *p++ = DW_LNS_advance_pc;
712 p += output_leb128 (p, addr_delta, 0);
713
714 if (need_copy)
715 *p++ = DW_LNS_copy;
fac0d250 716 else
220e750f 717 *p++ = tmp;
fac0d250 718
220e750f
RH
719 done:
720 assert (p == end);
721}
a8316fe2 722
220e750f 723/* Handy routine to combine calls to the above two routines. */
e1c05f12 724
220e750f
RH
725static void
726out_inc_line_addr (line_delta, addr_delta)
727 int line_delta;
728 addressT addr_delta;
729{
730 int len = size_inc_line_addr (line_delta, addr_delta);
731 emit_inc_line_addr (line_delta, addr_delta, frag_more (len), len);
732}
9de8d8f1 733
220e750f
RH
734/* Generate a variant frag that we can use to relax address/line
735 increments between fragments of the target segment. */
9e3af0e7 736
220e750f
RH
737static void
738relax_inc_line_addr (line_delta, seg, to_frag, to_ofs, from_frag, from_ofs)
739 int line_delta;
740 segT seg;
741 fragS *to_frag, *from_frag;
742 addressT to_ofs, from_ofs;
743{
744 symbolS *to_sym, *from_sym;
745 expressionS expr;
746 int max_chars;
6576f0b5 747
220e750f
RH
748 to_sym = symbol_new (fake_label_name, seg, to_ofs, to_frag);
749 from_sym = symbol_new (fake_label_name, seg, from_ofs, from_frag);
fac0d250 750
220e750f
RH
751 expr.X_op = O_subtract;
752 expr.X_add_symbol = to_sym;
753 expr.X_op_symbol = from_sym;
754 expr.X_add_number = 0;
fac0d250 755
220e750f
RH
756 /* The maximum size of the frag is the line delta with a maximum
757 sized address delta. */
758 max_chars = size_inc_line_addr (line_delta, -DWARF2_LINE_MIN_INSN_LENGTH);
fac0d250 759
220e750f
RH
760 frag_var (rs_dwarf2dbg, max_chars, max_chars, 1,
761 make_expr_symbol (&expr), line_delta, NULL);
762}
fac0d250 763
220e750f
RH
764/* The function estimates the size of a rs_dwarf2dbg variant frag
765 based on the current values of the symbols. It is called before
766 the relaxation loop. We set fr_subtype to the expected length. */
fac0d250 767
220e750f
RH
768int
769dwarf2dbg_estimate_size_before_relax (frag)
770 fragS *frag;
771{
772 offsetT addr_delta;
773 int size;
fac0d250 774
220e750f
RH
775 addr_delta = resolve_symbol_value (frag->fr_symbol, 0);
776 size = size_inc_line_addr (frag->fr_offset, addr_delta);
fac0d250 777
220e750f 778 frag->fr_subtype = size;
fac0d250 779
220e750f
RH
780 return size;
781}
782
783/* This function relaxes a rs_dwarf2dbg variant frag based on the
784 current values of the symbols. fr_subtype is the current length
785 of the frag. This returns the change in frag length. */
786
787int
788dwarf2dbg_relax_frag (frag)
789 fragS *frag;
790{
791 int old_size, new_size;
fac0d250 792
220e750f
RH
793 old_size = frag->fr_subtype;
794 new_size = dwarf2dbg_estimate_size_before_relax (frag);
ee515fb7 795
220e750f 796 return new_size - old_size;
fac0d250
RH
797}
798
220e750f
RH
799/* This function converts a rs_dwarf2dbg variant frag into a normal
800 fill frag. This is called after all relaxation has been done.
801 fr_subtype will be the desired length of the frag. */
802
803void
804dwarf2dbg_convert_frag (frag)
805 fragS *frag;
fac0d250 806{
220e750f
RH
807 offsetT addr_diff;
808
1a5447b8 809 addr_diff = resolve_symbol_value (frag->fr_symbol, finalize_syms);
fac0d250 810
220e750f
RH
811 /* fr_var carries the max_chars that we created the fragment with.
812 fr_subtype carries the current expected length. We must, of
813 course, have allocated enough memory earlier. */
bccba5f0 814 assert (frag->fr_var >= (int) frag->fr_subtype);
fac0d250 815
ee515fb7 816 emit_inc_line_addr (frag->fr_offset, addr_diff,
220e750f
RH
817 frag->fr_literal + frag->fr_fix, frag->fr_subtype);
818
819 frag->fr_fix += frag->fr_subtype;
820 frag->fr_type = rs_fill;
821 frag->fr_var = 0;
822 frag->fr_offset = 0;
823}
824
825/* Generate .debug_line content for the chain of line number entries
826 beginning at E, for segment SEG. */
827
828static void
829process_entries (seg, e)
830 segT seg;
831 struct line_entry *e;
832{
833 unsigned filenum = 1;
834 unsigned line = 1;
835 unsigned column = 0;
836 unsigned flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_BEGIN_STMT : 0;
837 fragS *frag = NULL;
838 fragS *last_frag;
839 addressT frag_ofs = 0;
840 addressT last_frag_ofs;
841 struct line_entry *next;
842
843 while (e)
fac0d250 844 {
220e750f
RH
845 int changed = 0;
846
847 if (filenum != e->loc.filenum)
fac0d250 848 {
220e750f
RH
849 filenum = e->loc.filenum;
850 out_opcode (DW_LNS_set_file);
851 out_uleb128 (filenum);
852 changed = 1;
853 }
854
855 if (column != e->loc.column)
856 {
857 column = e->loc.column;
858 out_opcode (DW_LNS_set_column);
859 out_uleb128 (column);
860 changed = 1;
861 }
862
863 if ((e->loc.flags ^ flags) & DWARF2_FLAG_BEGIN_STMT)
864 {
865 flags = e->loc.flags;
866 out_opcode (DW_LNS_negate_stmt);
867 changed = 1;
868 }
869
870 if (e->loc.flags & DWARF2_FLAG_BEGIN_BLOCK)
871 {
872 out_opcode (DW_LNS_set_basic_block);
873 changed = 1;
874 }
875
876 if (line != e->loc.line || changed)
877 {
878 int line_delta = e->loc.line - line;
879 if (frag == NULL)
fac0d250 880 {
220e750f
RH
881 out_set_addr (seg, e->frag, e->frag_ofs);
882 out_inc_line_addr (line_delta, 0);
fac0d250 883 }
220e750f
RH
884 else if (frag == e->frag)
885 out_inc_line_addr (line_delta, e->frag_ofs - frag_ofs);
886 else
887 relax_inc_line_addr (line_delta, seg, e->frag, e->frag_ofs,
888 frag, frag_ofs);
889
890 frag = e->frag;
891 frag_ofs = e->frag_ofs;
892 line = e->loc.line;
fac0d250 893 }
220e750f
RH
894 else if (frag == NULL)
895 {
896 out_set_addr (seg, e->frag, e->frag_ofs);
897 frag = e->frag;
898 frag_ofs = e->frag_ofs;
899 }
900
901 next = e->next;
902 free (e);
903 e = next;
fac0d250 904 }
353e2c69 905
220e750f
RH
906 /* Emit a DW_LNE_end_sequence for the end of the section. */
907 last_frag = last_frag_for_seg (seg);
908 last_frag_ofs = get_frag_fix (last_frag);
909 if (frag == last_frag)
910 out_inc_line_addr (INT_MAX, last_frag_ofs - frag_ofs);
911 else
ee515fb7 912 relax_inc_line_addr (INT_MAX, seg, last_frag, last_frag_ofs,
220e750f 913 frag, frag_ofs);
fac0d250
RH
914}
915
220e750f
RH
916/* Emit the directory and file tables for .debug_line. */
917
fac0d250 918static void
220e750f 919out_file_list ()
fac0d250
RH
920{
921 size_t size;
922 char *cp;
220e750f
RH
923 unsigned int i;
924
925 /* Terminate directory list. */
926 out_byte ('\0');
fac0d250 927
220e750f 928 for (i = 1; i < files_in_use; ++i)
fac0d250 929 {
249e3833
RH
930 if (files[i].filename == NULL)
931 {
932 as_bad (_("Unassigned file number %u"), i);
933 continue;
934 }
935
220e750f 936 size = strlen (files[i].filename) + 1;
fac0d250 937 cp = frag_more (size);
220e750f 938 memcpy (cp, files[i].filename, size);
fac0d250 939
220e750f 940 out_uleb128 (files[i].dir); /* directory number */
fac0d250
RH
941 out_uleb128 (0); /* last modification timestamp */
942 out_uleb128 (0); /* filesize */
943 }
353e2c69
KH
944
945 /* Terminate filename list. */
946 out_byte (0);
fac0d250
RH
947}
948
220e750f
RH
949/* Emit the collected .debug_line data. */
950
951static void
952out_debug_line (line_seg)
953 segT line_seg;
954{
955 expressionS expr;
956 symbolS *line_start;
957 symbolS *prologue_end;
958 symbolS *line_end;
959 struct line_seg *s;
960
961 subseg_set (line_seg, 0);
962
963 line_start = symbol_new_now ();
964 prologue_end = symbol_make (fake_label_name);
965 line_end = symbol_make (fake_label_name);
966
967 /* Total length of the information for this compilation unit. */
968 expr.X_op = O_subtract;
969 expr.X_add_symbol = line_end;
970 expr.X_op_symbol = line_start;
971 expr.X_add_number = -4;
972 emit_expr (&expr, 4);
973
974 /* Version. */
975 out_two (2);
976
977 /* Length of the prologue following this length. */
978 expr.X_op = O_subtract;
979 expr.X_add_symbol = prologue_end;
980 expr.X_op_symbol = line_start;
981 expr.X_add_number = - (4 + 2 + 4);
982 emit_expr (&expr, 4);
983
984 /* Parameters of the state machine. */
985 out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
986 out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
987 out_byte (DWARF2_LINE_BASE);
988 out_byte (DWARF2_LINE_RANGE);
989 out_byte (DWARF2_LINE_OPCODE_BASE);
990
991 /* Standard opcode lengths. */
992 out_byte (0); /* DW_LNS_copy */
993 out_byte (1); /* DW_LNS_advance_pc */
994 out_byte (1); /* DW_LNS_advance_line */
995 out_byte (1); /* DW_LNS_set_file */
996 out_byte (1); /* DW_LNS_set_column */
997 out_byte (0); /* DW_LNS_negate_stmt */
998 out_byte (0); /* DW_LNS_set_basic_block */
999 out_byte (0); /* DW_LNS_const_add_pc */
1000 out_byte (1); /* DW_LNS_fixed_advance_pc */
1001
1002 out_file_list ();
1003
1004 set_symbol_value_now (prologue_end);
1005
1006 /* For each section, emit a statement program. */
ee515fb7 1007 for (s = all_segs; s; s = s->next)
220e750f
RH
1008 process_entries (s->seg, s->head->head);
1009
1010 set_symbol_value_now (line_end);
1011}
1012
1013/* Emit data for .debug_aranges. */
1014
58b5739a 1015static void
220e750f
RH
1016out_debug_aranges (aranges_seg, info_seg)
1017 segT aranges_seg;
1018 segT info_seg;
fac0d250 1019{
220e750f
RH
1020 unsigned int addr_size = sizeof_address;
1021 addressT size, skip;
1022 struct line_seg *s;
1023 expressionS expr;
1024 char *p;
fac0d250 1025
220e750f 1026 size = 4 + 2 + 4 + 1 + 1;
fac0d250 1027
ee515fb7
KH
1028 skip = 2 * addr_size - (size & (2 * addr_size - 1));
1029 if (skip == 2 * addr_size)
220e750f
RH
1030 skip = 0;
1031 size += skip;
fac0d250 1032
ee515fb7
KH
1033 for (s = all_segs; s; s = s->next)
1034 size += 2 * addr_size;
fac0d250 1035
ee515fb7 1036 size += 2 * addr_size;
fac0d250 1037
220e750f 1038 subseg_set (aranges_seg, 0);
fac0d250 1039
220e750f
RH
1040 /* Length of the compilation unit. */
1041 out_four (size - 4);
fac0d250 1042
220e750f
RH
1043 /* Version. */
1044 out_two (2);
4dc7ead9 1045
220e750f
RH
1046 /* Offset to .debug_info. */
1047 expr.X_op = O_symbol;
1048 expr.X_add_symbol = section_symbol (info_seg);
1049 expr.X_add_number = 0;
1050 emit_expr (&expr, 4);
1051
1052 /* Size of an address (offset portion). */
1053 out_byte (addr_size);
1054
1055 /* Size of a segment descriptor. */
1056 out_byte (0);
1057
1058 /* Align the header. */
1059 if (skip)
ee515fb7 1060 frag_align (ffs (2 * addr_size) - 1, 0, 0);
4dc7ead9 1061
ee515fb7 1062 for (s = all_segs; s; s = s->next)
220e750f
RH
1063 {
1064 fragS *frag;
1065 symbolS *beg, *end;
1066
1067 frag = first_frag_for_seg (s->seg);
1068 beg = symbol_new (fake_label_name, s->seg, 0, frag);
1069 s->text_start = beg;
1070
1071 frag = last_frag_for_seg (s->seg);
1072 end = symbol_new (fake_label_name, s->seg, get_frag_fix (frag), frag);
1073 s->text_end = end;
1074
1075 expr.X_op = O_symbol;
1076 expr.X_add_symbol = beg;
1077 expr.X_add_number = 0;
1078 emit_expr (&expr, addr_size);
1079
1080 expr.X_op = O_subtract;
1081 expr.X_add_symbol = end;
1082 expr.X_op_symbol = beg;
1083 expr.X_add_number = 0;
1084 emit_expr (&expr, addr_size);
1085 }
4dc7ead9 1086
220e750f
RH
1087 p = frag_more (2 * addr_size);
1088 md_number_to_chars (p, 0, addr_size);
1089 md_number_to_chars (p + addr_size, 0, addr_size);
4dc7ead9
RH
1090}
1091
220e750f
RH
1092/* Emit data for .debug_abbrev. Note that this must be kept in
1093 sync with out_debug_info below. */
fac0d250 1094
220e750f
RH
1095static void
1096out_debug_abbrev (abbrev_seg)
1097 segT abbrev_seg;
1098{
1099 subseg_set (abbrev_seg, 0);
fac0d250 1100
220e750f
RH
1101 out_uleb128 (1);
1102 out_uleb128 (DW_TAG_compile_unit);
1103 out_byte (DW_CHILDREN_no);
1104 out_abbrev (DW_AT_stmt_list, DW_FORM_data4);
1105 if (all_segs->next == NULL)
4dc7ead9 1106 {
220e750f
RH
1107 out_abbrev (DW_AT_low_pc, DW_FORM_addr);
1108 out_abbrev (DW_AT_high_pc, DW_FORM_addr);
1109 }
1110 out_abbrev (DW_AT_comp_dir, DW_FORM_string);
1111 out_abbrev (DW_AT_producer, DW_FORM_string);
1112 out_abbrev (DW_AT_language, DW_FORM_data2);
1113 out_abbrev (0, 0);
a987bfc9
RH
1114
1115 /* Terminate the abbreviations for this compilation unit. */
1116 out_byte (0);
220e750f 1117}
4dc7ead9 1118
220e750f 1119/* Emit a description of this compilation unit for .debug_info. */
4dc7ead9 1120
220e750f
RH
1121static void
1122out_debug_info (info_seg, abbrev_seg, line_seg)
1123 segT info_seg;
1124 segT abbrev_seg;
1125 segT line_seg;
1126{
1127 char producer[128];
1128 char *comp_dir;
1129 expressionS expr;
1130 symbolS *info_start;
1131 symbolS *info_end;
1132 char *p;
1133 int len;
4dc7ead9 1134
220e750f 1135 subseg_set (info_seg, 0);
4dc7ead9 1136
ee515fb7 1137 info_start = symbol_new_now ();
220e750f 1138 info_end = symbol_make (fake_label_name);
4dc7ead9 1139
220e750f
RH
1140 /* Compilation Unit length. */
1141 expr.X_op = O_subtract;
1142 expr.X_add_symbol = info_end;
1143 expr.X_op_symbol = info_start;
1144 expr.X_add_number = -4;
1145 emit_expr (&expr, 4);
4dc7ead9 1146
220e750f
RH
1147 /* DWARF version. */
1148 out_two (2);
4dc7ead9 1149
220e750f
RH
1150 /* .debug_abbrev offset */
1151 expr.X_op = O_symbol;
1152 expr.X_add_symbol = section_symbol (abbrev_seg);
1153 expr.X_add_number = 0;
1154 emit_expr (&expr, 4);
4dc7ead9 1155
220e750f
RH
1156 /* Target address size. */
1157 out_byte (sizeof_address);
fac0d250 1158
220e750f
RH
1159 /* DW_TAG_compile_unit DIE abbrev */
1160 out_uleb128 (1);
fac0d250 1161
220e750f
RH
1162 /* DW_AT_stmt_list */
1163 expr.X_op = O_symbol;
1164 expr.X_add_symbol = section_symbol (line_seg);
1165 expr.X_add_number = 0;
1166 emit_expr (&expr, 4);
fac0d250 1167
220e750f
RH
1168 /* These two attributes may only be emitted if all of the code is
1169 contiguous. Multiple sections are not that. */
1170 if (all_segs->next == NULL)
58b5739a 1171 {
220e750f
RH
1172 /* DW_AT_low_pc */
1173 expr.X_op = O_symbol;
1174 expr.X_add_symbol = all_segs->text_start;
1175 expr.X_add_number = 0;
1176 emit_expr (&expr, sizeof_address);
1177
1178 /* DW_AT_high_pc */
1179 expr.X_op = O_symbol;
1180 expr.X_add_symbol = all_segs->text_end;
1181 expr.X_add_number = 0;
1182 emit_expr (&expr, sizeof_address);
58b5739a
RH
1183 }
1184
220e750f
RH
1185 /* DW_AT_comp_dir */
1186 comp_dir = getpwd ();
1187 len = strlen (comp_dir) + 1;
1188 p = frag_more (len);
1189 memcpy (p, comp_dir, len);
fac0d250 1190
220e750f
RH
1191 /* DW_AT_producer */
1192 sprintf (producer, "GNU AS %s", VERSION);
1193 len = strlen (producer) + 1;
1194 p = frag_more (len);
1195 memcpy (p, producer, len);
fac0d250 1196
220e750f
RH
1197 /* DW_AT_language. Yes, this is probably not really MIPS, but the
1198 dwarf2 draft has no standard code for assembler. */
1199 out_two (DW_LANG_Mips_Assembler);
1200
1201 set_symbol_value_now (info_end);
fac0d250
RH
1202}
1203
1204void
220e750f 1205dwarf2_finish ()
fac0d250 1206{
220e750f
RH
1207 segT line_seg;
1208 struct line_seg *s;
fac0d250 1209
220e750f
RH
1210 /* If no debug information was recorded, nothing to do. */
1211 if (all_segs == NULL)
1212 return;
fac0d250 1213
220e750f 1214 /* Calculate the size of an address for the target machine. */
220e750f 1215 sizeof_address = bfd_arch_bits_per_address (stdoutput) / 8;
fac0d250 1216
220e750f
RH
1217 /* Create and switch to the line number section. */
1218 line_seg = subseg_new (".debug_line", 0);
220e750f 1219 bfd_set_section_flags (stdoutput, line_seg, SEC_READONLY);
fac0d250 1220
220e750f 1221 /* For each subsection, chain the debug entries together. */
ee515fb7 1222 for (s = all_segs; s; s = s->next)
fac0d250 1223 {
220e750f
RH
1224 struct line_subseg *ss = s->head;
1225 struct line_entry **ptail = ss->ptail;
1226
1227 while ((ss = ss->next) != NULL)
1228 {
1229 *ptail = ss->head;
1230 ptail = ss->ptail;
1231 }
fac0d250 1232 }
85a39694 1233
220e750f 1234 out_debug_line (line_seg);
85a39694 1235
220e750f
RH
1236 /* If this is assembler generated line info, we need .debug_info
1237 and .debug_abbrev sections as well. */
1238 if (debug_type == DEBUG_DWARF2)
1239 {
1240 segT abbrev_seg;
1241 segT info_seg;
1242 segT aranges_seg;
4dc7ead9 1243
220e750f
RH
1244 info_seg = subseg_new (".debug_info", 0);
1245 abbrev_seg = subseg_new (".debug_abbrev", 0);
1246 aranges_seg = subseg_new (".debug_aranges", 0);
ef99799a 1247
220e750f
RH
1248 bfd_set_section_flags (stdoutput, info_seg, SEC_READONLY);
1249 bfd_set_section_flags (stdoutput, abbrev_seg, SEC_READONLY);
1250 bfd_set_section_flags (stdoutput, aranges_seg, SEC_READONLY);
ef99799a 1251
ee515fb7 1252 record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
ef99799a 1253
220e750f
RH
1254 out_debug_aranges (aranges_seg, info_seg);
1255 out_debug_abbrev (abbrev_seg);
1256 out_debug_info (info_seg, abbrev_seg, line_seg);
1257 }
85a39694 1258}
92eb7b32
L
1259
1260#else
1261void
1262dwarf2_finish ()
1263{
1264}
1265
1266int
1267dwarf2dbg_estimate_size_before_relax (frag)
1268 fragS *frag ATTRIBUTE_UNUSED;
1269{
1270 as_fatal (_("dwarf2 is not supported for this object file format"));
1271 return 0;
1272}
1273
1274int
1275dwarf2dbg_relax_frag (frag)
1276 fragS *frag ATTRIBUTE_UNUSED;
1277{
1278 as_fatal (_("dwarf2 is not supported for this object file format"));
1279 return 0;
1280}
1281
1282void
1283dwarf2dbg_convert_frag (frag)
1284 fragS *frag ATTRIBUTE_UNUSED;
1285{
1286 as_fatal (_("dwarf2 is not supported for this object file format"));
1287}
1288
1289void
1290dwarf2_emit_insn (size)
1291 int size ATTRIBUTE_UNUSED;
1292{
1293}
1294
1295void
1296dwarf2_directive_file (dummy)
1297 int dummy ATTRIBUTE_UNUSED;
1298{
3737d051 1299 s_app_file (0);
92eb7b32
L
1300}
1301
1302void
1303dwarf2_directive_loc (dummy)
1304 int dummy ATTRIBUTE_UNUSED;
1305{
1306 as_fatal (_("dwarf2 is not supported for this object file format"));
1307}
1308#endif /* BFD_ASSEMBLER */
This page took 0.166336 seconds and 4 git commands to generate.