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