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