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