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