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