]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/dwarf2dbg.c
gas TC_PARSE_CONS_EXPRESSION communication with TC_CONS_FIX_NEW
[thirdparty/binutils-gdb.git] / gas / dwarf2dbg.c
CommitLineData
fac0d250 1/* dwarf2dbg.c - DWARF2 debug support
4b95cf5c 2 Copyright (C) 1999-2014 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
ec2655a6 9 the Free Software Foundation; either version 3, or (at your option)
fac0d250
RH
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
4b4da160
NC
19 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
20 02110-1301, USA. */
fac0d250 21
89b66cde 22/* Logical line numbers can be controlled by the compiler via the
bd0eb99b 23 following directives:
fac0d250
RH
24
25 .file FILENO "file.c"
ecea7679 26 .loc FILENO LINENO [COLUMN] [basic_block] [prologue_end] \
92846e72
CC
27 [epilogue_begin] [is_stmt VALUE] [isa VALUE] \
28 [discriminator VALUE]
bd0eb99b 29*/
fac0d250 30
fac0d250 31#include "as.h"
bd0eb99b 32#include "safe-ctype.h"
92eb7b32 33
42dbf88c
NC
34#ifdef HAVE_LIMITS_H
35#include <limits.h>
92625c16 36#else
6717891c
NC
37#ifdef HAVE_SYS_PARAM_H
38#include <sys/param.h>
39#endif
6256f9dd 40#ifndef INT_MAX
ee515fb7 41#define INT_MAX (int) (((unsigned) (-1)) >> 1)
42dbf88c 42#endif
b8f080d6 43#endif
42dbf88c 44
70658493 45#include "dwarf2dbg.h"
a7ed1ca2 46#include <filenames.h>
70658493 47
56487c55
NC
48#ifdef HAVE_DOS_BASED_FILE_SYSTEM
49/* We need to decide which character to use as a directory separator.
50 Just because HAVE_DOS_BASED_FILE_SYSTEM is defined, it does not
51 necessarily mean that the backslash character is the one to use.
52 Some environments, eg Cygwin, can support both naming conventions.
53 So we use the heuristic that we only need to use the backslash if
54 the path is an absolute path starting with a DOS style drive
55 selector. eg C: or D: */
56# define INSERT_DIR_SEPARATOR(string, offset) \
57 do \
58 { \
59 if (offset > 1 \
7fd3924a
AM
60 && string[0] != 0 \
61 && string[1] == ':') \
56487c55
NC
62 string [offset] = '\\'; \
63 else \
64 string [offset] = '/'; \
65 } \
66 while (0)
67#else
68# define INSERT_DIR_SEPARATOR(string, offset) string[offset] = '/'
69#endif
70
14e777e0 71#ifndef DWARF2_FORMAT
413a266c 72# define DWARF2_FORMAT(SEC) dwarf2_format_32bit
14e777e0
KB
73#endif
74
9605f328 75#ifndef DWARF2_ADDR_SIZE
e4475e39 76# define DWARF2_ADDR_SIZE(bfd) (bfd_arch_bits_per_address (bfd) / 8)
9605f328
AO
77#endif
78
01e1a5bc
NC
79#ifndef DWARF2_FILE_NAME
80#define DWARF2_FILE_NAME(FILENAME, DIRNAME) FILENAME
81#endif
82
83#ifndef DWARF2_FILE_TIME_NAME
84#define DWARF2_FILE_TIME_NAME(FILENAME,DIRNAME) 0
85#endif
86
87#ifndef DWARF2_FILE_SIZE_NAME
88#define DWARF2_FILE_SIZE_NAME(FILENAME,DIRNAME) 0
89#endif
90
fc0eebac
TG
91#ifndef DWARF2_VERSION
92#define DWARF2_VERSION 2
93#endif
94
88ebb0a1
MW
95/* The .debug_aranges version has been 2 in DWARF version 2, 3 and 4. */
96#ifndef DWARF2_ARANGES_VERSION
97#define DWARF2_ARANGES_VERSION 2
98#endif
99
100/* This implementation output version 2 .debug_line information. */
101#ifndef DWARF2_LINE_VERSION
102#define DWARF2_LINE_VERSION 2
103#endif
104
fac0d250
RH
105#include "subsegs.h"
106
fa8f86ff 107#include "dwarf2.h"
fac0d250 108
fac0d250
RH
109/* Since we can't generate the prolog until the body is complete, we
110 use three different subsegments for .debug_line: one holding the
111 prolog, one for the directory and filename info, and one for the
112 body ("statement program"). */
113#define DL_PROLOG 0
114#define DL_FILES 1
115#define DL_BODY 2
116
1737851b
BW
117/* If linker relaxation might change offsets in the code, the DWARF special
118 opcodes and variable-length operands cannot be used. If this macro is
119 nonzero, use the DW_LNS_fixed_advance_pc opcode instead. */
120#ifndef DWARF2_USE_FIXED_ADVANCE_PC
453dc3f0 121# define DWARF2_USE_FIXED_ADVANCE_PC linkrelax
1737851b
BW
122#endif
123
fac0d250
RH
124/* First special line opcde - leave room for the standard opcodes.
125 Note: If you want to change this, you'll have to update the
126 "standard_opcode_lengths" table that is emitted below in
bd0eb99b
RH
127 out_debug_line(). */
128#define DWARF2_LINE_OPCODE_BASE 13
fac0d250
RH
129
130#ifndef DWARF2_LINE_BASE
131 /* Minimum line offset in a special line info. opcode. This value
132 was chosen to give a reasonable range of values. */
133# define DWARF2_LINE_BASE -5
134#endif
135
136/* Range of line offsets in a special line info. opcode. */
137#ifndef DWARF2_LINE_RANGE
138# define DWARF2_LINE_RANGE 14
139#endif
140
141#ifndef DWARF2_LINE_MIN_INSN_LENGTH
142 /* Define the architecture-dependent minimum instruction length (in
143 bytes). This value should be rather too small than too big. */
4dc7ead9 144# define DWARF2_LINE_MIN_INSN_LENGTH 1
fac0d250
RH
145#endif
146
bd0eb99b 147/* Flag that indicates the initial value of the is_stmt_start flag. */
fac0d250
RH
148#define DWARF2_LINE_DEFAULT_IS_STMT 1
149
cb30237e 150/* Given a special op, return the line skip amount. */
fac0d250
RH
151#define SPECIAL_LINE(op) \
152 (((op) - DWARF2_LINE_OPCODE_BASE)%DWARF2_LINE_RANGE + DWARF2_LINE_BASE)
153
154/* Given a special op, return the address skip amount (in units of
155 DWARF2_LINE_MIN_INSN_LENGTH. */
156#define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
157
cb30237e 158/* The maximum address skip amount that can be encoded with a special op. */
fac0d250
RH
159#define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
160
62ebcb5c
AM
161#ifndef TC_PARSE_CONS_RETURN_NONE
162#define TC_PARSE_CONS_RETURN_NONE BFD_RELOC_NONE
163#endif
164
ee515fb7 165struct line_entry {
220e750f 166 struct line_entry *next;
07a53e5c 167 symbolS *label;
220e750f 168 struct dwarf2_line_info loc;
e6c774b4 169};
fac0d250 170
ee515fb7 171struct line_subseg {
220e750f
RH
172 struct line_subseg *next;
173 subsegT subseg;
174 struct line_entry *head;
175 struct line_entry **ptail;
e410add4 176 struct line_entry **pmove_tail;
220e750f 177};
353e2c69 178
ee515fb7 179struct line_seg {
220e750f
RH
180 struct line_seg *next;
181 segT seg;
182 struct line_subseg *head;
183 symbolS *text_start;
184 symbolS *text_end;
185};
186
187/* Collects data for all line table entries during assembly. */
188static struct line_seg *all_segs;
1e9cc1c2
NC
189/* Hash used to quickly lookup a segment by name, avoiding the need to search
190 through the all_segs list. */
191static struct hash_control *all_segs_hash;
192static struct line_seg **last_seg_ptr;
220e750f 193
ee515fb7 194struct file_entry {
a7ed1ca2 195 const char *filename;
220e750f
RH
196 unsigned int dir;
197};
198
199/* Table of files used by .debug_line. */
200static struct file_entry *files;
201static unsigned int files_in_use;
202static unsigned int files_allocated;
203
a7ed1ca2
NC
204/* Table of directories used by .debug_line. */
205static char **dirs;
206static unsigned int dirs_in_use;
207static unsigned int dirs_allocated;
208
b34976b6 209/* TRUE when we've seen a .loc directive recently. Used to avoid
220e750f 210 doing work when there's nothing to do. */
1eee4adc 211bfd_boolean dwarf2_loc_directive_seen;
220e750f 212
07a53e5c
RH
213/* TRUE when we're supposed to set the basic block mark whenever a
214 label is seen. */
215bfd_boolean dwarf2_loc_mark_labels;
216
220e750f 217/* Current location as indicated by the most recent .loc directive. */
bd0eb99b
RH
218static struct dwarf2_line_info current = {
219 1, 1, 0, 0,
92846e72
CC
220 DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0,
221 0
bd0eb99b 222};
220e750f 223
220e750f
RH
224/* The size of an address on the target. */
225static unsigned int sizeof_address;
226\f
a2e22468 227static unsigned int get_filenum (const char *, unsigned int);
413a266c 228
c5c0a210 229#ifndef TC_DWARF2_EMIT_OFFSET
802f5d9e 230#define TC_DWARF2_EMIT_OFFSET generic_dwarf2_emit_offset
c5c0a210 231
6174d9c8
RH
232/* Create an offset to .dwarf2_*. */
233
234static void
a2e22468 235generic_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
6174d9c8 236{
91d6fa6a 237 expressionS exp;
6174d9c8 238
91d6fa6a
NC
239 exp.X_op = O_symbol;
240 exp.X_add_symbol = symbol;
241 exp.X_add_number = 0;
242 emit_expr (&exp, size);
6174d9c8 243}
c5c0a210 244#endif
6174d9c8 245
e410add4 246/* Find or create (if CREATE_P) an entry for SEG+SUBSEG in ALL_SEGS. */
220e750f
RH
247
248static struct line_subseg *
e410add4 249get_line_subseg (segT seg, subsegT subseg, bfd_boolean create_p)
220e750f
RH
250{
251 static segT last_seg;
252 static subsegT last_subseg;
253 static struct line_subseg *last_line_subseg;
254
1e9cc1c2 255 struct line_seg *s;
91d6fa6a 256 struct line_subseg **pss, *lss;
fac0d250 257
220e750f
RH
258 if (seg == last_seg && subseg == last_subseg)
259 return last_line_subseg;
260
1e9cc1c2
NC
261 s = (struct line_seg *) hash_find (all_segs_hash, seg->name);
262 if (s == NULL)
263 {
e410add4
RS
264 if (!create_p)
265 return NULL;
266
1e9cc1c2
NC
267 s = (struct line_seg *) xmalloc (sizeof (*s));
268 s->next = NULL;
269 s->seg = seg;
270 s->head = NULL;
271 *last_seg_ptr = s;
272 last_seg_ptr = &s->next;
273 hash_insert (all_segs_hash, seg->name, s);
274 }
275 gas_assert (seg == s->seg);
220e750f 276
91d6fa6a 277 for (pss = &s->head; (lss = *pss) != NULL ; pss = &lss->next)
fac0d250 278 {
91d6fa6a 279 if (lss->subseg == subseg)
ee515fb7 280 goto found_subseg;
91d6fa6a 281 if (lss->subseg > subseg)
220e750f 282 break;
fac0d250 283 }
220e750f 284
91d6fa6a
NC
285 lss = (struct line_subseg *) xmalloc (sizeof (*lss));
286 lss->next = *pss;
287 lss->subseg = subseg;
288 lss->head = NULL;
289 lss->ptail = &lss->head;
e410add4 290 lss->pmove_tail = &lss->head;
91d6fa6a 291 *pss = lss;
220e750f
RH
292
293 found_subseg:
294 last_seg = seg;
295 last_subseg = subseg;
91d6fa6a 296 last_line_subseg = lss;
220e750f 297
91d6fa6a 298 return lss;
fac0d250
RH
299}
300
6a50d470 301/* Record an entry for LOC occurring at LABEL. */
07a53e5c
RH
302
303static void
6a50d470 304dwarf2_gen_line_info_1 (symbolS *label, struct dwarf2_line_info *loc)
07a53e5c 305{
6a50d470 306 struct line_subseg *lss;
07a53e5c
RH
307 struct line_entry *e;
308
309 e = (struct line_entry *) xmalloc (sizeof (*e));
310 e->next = NULL;
6a50d470 311 e->label = label;
07a53e5c
RH
312 e->loc = *loc;
313
e410add4 314 lss = get_line_subseg (now_seg, now_subseg, TRUE);
6a50d470
RS
315 *lss->ptail = e;
316 lss->ptail = &e->next;
07a53e5c
RH
317}
318
436d9e46 319/* Record an entry for LOC occurring at OFS within the current fragment. */
353e2c69 320
220e750f 321void
a2e22468 322dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
fac0d250 323{
1ea5c325
MS
324 static unsigned int line = -1;
325 static unsigned int filenum = -1;
220e750f 326
6a50d470
RS
327 symbolS *sym;
328
220e750f
RH
329 /* Early out for as-yet incomplete location information. */
330 if (loc->filenum == 0 || loc->line == 0)
331 return;
332
ffa554ed
GK
333 /* Don't emit sequences of line symbols for the same line when the
334 symbols apply to assembler code. It is necessary to emit
335 duplicate line symbols when a compiler asks for them, because GDB
336 uses them to determine the end of the prologue. */
d1a6c242 337 if (debug_type == DEBUG_DWARF2
ffa554ed 338 && line == loc->line && filenum == loc->filenum)
1ea5c325
MS
339 return;
340
341 line = loc->line;
342 filenum = loc->filenum;
343
453dc3f0
NC
344 if (linkrelax)
345 {
346 char name[120];
347
348 /* Use a non-fake name for the line number location,
349 so that it can be referred to by relocations. */
350 sprintf (name, ".Loc.%u.%u", line, filenum);
6a50d470 351 sym = symbol_new (name, now_seg, ofs, frag_now);
453dc3f0
NC
352 }
353 else
6a50d470
RS
354 sym = symbol_temp_new (now_seg, ofs, frag_now);
355 dwarf2_gen_line_info_1 (sym, loc);
220e750f 356}
fac0d250 357
ecea7679
RH
358/* Returns the current source information. If .file directives have
359 been encountered, the info for the corresponding source file is
360 returned. Otherwise, the info for the assembly source file is
361 returned. */
362
220e750f 363void
a2e22468 364dwarf2_where (struct dwarf2_line_info *line)
220e750f
RH
365{
366 if (debug_type == DEBUG_DWARF2)
fac0d250 367 {
220e750f
RH
368 char *filename;
369 as_where (&filename, &line->line);
a7ed1ca2 370 line->filenum = get_filenum (filename, 0);
220e750f 371 line->column = 0;
bd0eb99b 372 line->flags = DWARF2_FLAG_IS_STMT;
ecea7679 373 line->isa = current.isa;
92846e72 374 line->discriminator = current.discriminator;
fac0d250 375 }
220e750f
RH
376 else
377 *line = current;
fac0d250
RH
378}
379
7fd3924a 380/* A hook to allow the target backend to inform the line number state
ecea7679
RH
381 machine of isa changes when assembler debug info is enabled. */
382
383void
384dwarf2_set_isa (unsigned int isa)
385{
386 current.isa = isa;
387}
388
220e750f
RH
389/* Called for each machine instruction, or relatively atomic group of
390 machine instructions (ie built-in macro). The instruction or group
391 is SIZE bytes in length. If dwarf2 line number generation is called
392 for, emit a line statement appropriately. */
353e2c69 393
220e750f 394void
a2e22468 395dwarf2_emit_insn (int size)
fac0d250 396{
220e750f 397 struct dwarf2_line_info loc;
fac0d250 398
7fd3924a 399 if (!dwarf2_loc_directive_seen && debug_type != DEBUG_DWARF2)
220e750f 400 return;
7fd3924a
AM
401
402 dwarf2_where (&loc);
b6675117 403
220e750f 404 dwarf2_gen_line_info (frag_now_fix () - size, &loc);
661ba50f
BW
405 dwarf2_consume_line_info ();
406}
407
e410add4
RS
408/* Move all previously-emitted line entries for the current position by
409 DELTA bytes. This function cannot be used to move the same entries
410 twice. */
411
412void
413dwarf2_move_insn (int delta)
414{
415 struct line_subseg *lss;
416 struct line_entry *e;
417 valueT now;
418
419 if (delta == 0)
420 return;
421
422 lss = get_line_subseg (now_seg, now_subseg, FALSE);
423 if (!lss)
424 return;
425
426 now = frag_now_fix ();
427 while ((e = *lss->pmove_tail))
428 {
429 if (S_GET_VALUE (e->label) == now)
430 S_SET_VALUE (e->label, now + delta);
431 lss->pmove_tail = &e->next;
432 }
433}
434
661ba50f
BW
435/* Called after the current line information has been either used with
436 dwarf2_gen_line_info or saved with a machine instruction for later use.
437 This resets the state of the line number information to reflect that
438 it has been used. */
439
440void
441dwarf2_consume_line_info (void)
442{
443 /* Unless we generate DWARF2 debugging information for each
444 assembler line, we only emit one line symbol for one LOC. */
7fd3924a 445 dwarf2_loc_directive_seen = FALSE;
bd0eb99b
RH
446
447 current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK
448 | DWARF2_FLAG_PROLOGUE_END
449 | DWARF2_FLAG_EPILOGUE_BEGIN);
92846e72 450 current.discriminator = 0;
220e750f 451}
fac0d250 452
07a53e5c
RH
453/* Called for each (preferably code) label. If dwarf2_loc_mark_labels
454 is enabled, emit a basic block marker. */
455
456void
457dwarf2_emit_label (symbolS *label)
458{
459 struct dwarf2_line_info loc;
460
461 if (!dwarf2_loc_mark_labels)
462 return;
463 if (S_GET_SEGMENT (label) != now_seg)
464 return;
465 if (!(bfd_get_section_flags (stdoutput, now_seg) & SEC_CODE))
466 return;
7fd3924a
AM
467 if (files_in_use == 0 && debug_type != DEBUG_DWARF2)
468 return;
469
470 dwarf2_where (&loc);
07a53e5c
RH
471
472 loc.flags |= DWARF2_FLAG_BASIC_BLOCK;
473
6a50d470 474 dwarf2_gen_line_info_1 (label, &loc);
7fd3924a 475 dwarf2_consume_line_info ();
07a53e5c
RH
476}
477
a7ed1ca2
NC
478/* Get a .debug_line file number for FILENAME. If NUM is nonzero,
479 allocate it on that file table slot, otherwise return the first
480 empty one. */
220e750f
RH
481
482static unsigned int
a2e22468 483get_filenum (const char *filename, unsigned int num)
220e750f 484{
a7ed1ca2
NC
485 static unsigned int last_used, last_used_dir_len;
486 const char *file;
487 size_t dir_len;
488 unsigned int i, dir;
220e750f 489
a7ed1ca2
NC
490 if (num == 0 && last_used)
491 {
492 if (! files[last_used].dir
8b6efd89 493 && filename_cmp (filename, files[last_used].filename) == 0)
a7ed1ca2
NC
494 return last_used;
495 if (files[last_used].dir
8b6efd89
KT
496 && filename_ncmp (filename, dirs[files[last_used].dir],
497 last_used_dir_len) == 0
a7ed1ca2 498 && IS_DIR_SEPARATOR (filename [last_used_dir_len])
8b6efd89
KT
499 && filename_cmp (filename + last_used_dir_len + 1,
500 files[last_used].filename) == 0)
a7ed1ca2
NC
501 return last_used;
502 }
220e750f 503
a7ed1ca2
NC
504 file = lbasename (filename);
505 /* Don't make empty string from / or A: from A:/ . */
506#ifdef HAVE_DOS_BASED_FILE_SYSTEM
507 if (file <= filename + 3)
508 file = filename;
509#else
510 if (file == filename + 1)
511 file = filename;
512#endif
513 dir_len = file - filename;
514
515 dir = 0;
516 if (dir_len)
517 {
01e1a5bc 518#ifndef DWARF2_DIR_SHOULD_END_WITH_SEPARATOR
a7ed1ca2 519 --dir_len;
01e1a5bc 520#endif
a7ed1ca2 521 for (dir = 1; dir < dirs_in_use; ++dir)
8b6efd89 522 if (filename_ncmp (filename, dirs[dir], dir_len) == 0
a7ed1ca2
NC
523 && dirs[dir][dir_len] == '\0')
524 break;
525
526 if (dir >= dirs_in_use)
527 {
528 if (dir >= dirs_allocated)
529 {
530 dirs_allocated = dir + 32;
531 dirs = (char **)
532 xrealloc (dirs, (dir + 32) * sizeof (const char *));
533 }
534
1e9cc1c2 535 dirs[dir] = (char *) xmalloc (dir_len + 1);
a7ed1ca2
NC
536 memcpy (dirs[dir], filename, dir_len);
537 dirs[dir][dir_len] = '\0';
538 dirs_in_use = dir + 1;
539 }
540 }
541
542 if (num == 0)
543 {
544 for (i = 1; i < files_in_use; ++i)
545 if (files[i].dir == dir
88b4ca40 546 && files[i].filename
8b6efd89 547 && filename_cmp (file, files[i].filename) == 0)
a7ed1ca2
NC
548 {
549 last_used = i;
550 last_used_dir_len = dir_len;
551 return i;
552 }
553 }
554 else
555 i = num;
220e750f
RH
556
557 if (i >= files_allocated)
fac0d250 558 {
249e3833
RH
559 unsigned int old = files_allocated;
560
220e750f
RH
561 files_allocated = i + 32;
562 files = (struct file_entry *)
ee515fb7 563 xrealloc (files, (i + 32) * sizeof (struct file_entry));
249e3833
RH
564
565 memset (files + old, 0, (i + 32 - old) * sizeof (struct file_entry));
fac0d250
RH
566 }
567
a7ed1ca2
NC
568 files[i].filename = num ? file : xstrdup (file);
569 files[i].dir = dir;
10cd14b4
AM
570 if (files_in_use < i + 1)
571 files_in_use = i + 1;
220e750f 572 last_used = i;
a7ed1ca2 573 last_used_dir_len = dir_len;
220e750f
RH
574
575 return i;
576}
fac0d250 577
ecb4347a
DJ
578/* Handle two forms of .file directive:
579 - Pass .file "source.c" to s_app_file
580 - Handle .file 1 "source.c" by adding an entry to the DWARF-2 file table
220e750f 581
ecb4347a
DJ
582 If an entry is added to the file table, return a pointer to the filename. */
583
584char *
a2e22468 585dwarf2_directive_file (int dummy ATTRIBUTE_UNUSED)
220e750f
RH
586{
587 offsetT num;
e46d99eb 588 char *filename;
220e750f
RH
589 int filename_len;
590
591 /* Continue to accept a bare string and pass it off. */
592 SKIP_WHITESPACE ();
593 if (*input_line_pointer == '"')
fac0d250 594 {
220e750f 595 s_app_file (0);
ecb4347a 596 return NULL;
fac0d250
RH
597 }
598
220e750f
RH
599 num = get_absolute_expression ();
600 filename = demand_copy_C_string (&filename_len);
bd0eb99b
RH
601 if (filename == NULL)
602 return NULL;
220e750f
RH
603 demand_empty_rest_of_line ();
604
249e3833 605 if (num < 1)
fac0d250 606 {
0e389e77 607 as_bad (_("file number less than one"));
ecb4347a 608 return NULL;
fac0d250
RH
609 }
610
7cadeb2c
AM
611 /* A .file directive implies compiler generated debug information is
612 being supplied. Turn off gas generated debug info. */
613 debug_type = DEBUG_NONE;
614
0e1a166b 615 if (num < (int) files_in_use && files[num].filename != 0)
220e750f 616 {
0e389e77 617 as_bad (_("file number %ld already allocated"), (long) num);
ecb4347a 618 return NULL;
249e3833 619 }
220e750f 620
a7ed1ca2 621 get_filenum (filename, num);
ecb4347a
DJ
622
623 return filename;
fac0d250
RH
624}
625
220e750f 626void
a2e22468 627dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
220e750f 628{
ecea7679
RH
629 offsetT filenum, line;
630
851feff8
DJ
631 /* If we see two .loc directives in a row, force the first one to be
632 output now. */
7cadeb2c 633 if (dwarf2_loc_directive_seen)
6a50d470 634 dwarf2_emit_insn (0);
851feff8 635
ecea7679
RH
636 filenum = get_absolute_expression ();
637 SKIP_WHITESPACE ();
638 line = get_absolute_expression ();
639
640 if (filenum < 1)
641 {
642 as_bad (_("file number less than one"));
643 return;
644 }
645 if (filenum >= (int) files_in_use || files[filenum].filename == 0)
646 {
647 as_bad (_("unassigned file number %ld"), (long) filenum);
648 return;
649 }
650
651 current.filenum = filenum;
652 current.line = line;
92846e72 653 current.discriminator = 0;
ecea7679
RH
654
655#ifndef NO_LISTING
656 if (listing)
657 {
658 if (files[filenum].dir)
659 {
660 size_t dir_len = strlen (dirs[files[filenum].dir]);
661 size_t file_len = strlen (files[filenum].filename);
662 char *cp = (char *) alloca (dir_len + 1 + file_len + 1);
663
664 memcpy (cp, dirs[files[filenum].dir], dir_len);
56487c55 665 INSERT_DIR_SEPARATOR (cp, dir_len);
ecea7679
RH
666 memcpy (cp + dir_len + 1, files[filenum].filename, file_len);
667 cp[dir_len + file_len + 1] = '\0';
668 listing_source_file (cp);
669 }
670 else
671 listing_source_file (files[filenum].filename);
672 listing_source_line (line);
673 }
674#endif
675
220e750f 676 SKIP_WHITESPACE ();
ecea7679
RH
677 if (ISDIGIT (*input_line_pointer))
678 {
679 current.column = get_absolute_expression ();
680 SKIP_WHITESPACE ();
681 }
682
683 while (ISALPHA (*input_line_pointer))
220e750f 684 {
bd0eb99b
RH
685 char *p, c;
686 offsetT value;
687
688 p = input_line_pointer;
689 c = get_symbol_end ();
690
691 if (strcmp (p, "basic_block") == 0)
692 {
693 current.flags |= DWARF2_FLAG_BASIC_BLOCK;
694 *input_line_pointer = c;
695 }
696 else if (strcmp (p, "prologue_end") == 0)
697 {
698 current.flags |= DWARF2_FLAG_PROLOGUE_END;
699 *input_line_pointer = c;
700 }
701 else if (strcmp (p, "epilogue_begin") == 0)
702 {
703 current.flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
704 *input_line_pointer = c;
705 }
706 else if (strcmp (p, "is_stmt") == 0)
707 {
708 *input_line_pointer = c;
709 value = get_absolute_expression ();
710 if (value == 0)
711 current.flags &= ~DWARF2_FLAG_IS_STMT;
712 else if (value == 1)
713 current.flags |= DWARF2_FLAG_IS_STMT;
714 else
ecea7679
RH
715 {
716 as_bad (_("is_stmt value not 0 or 1"));
717 return;
718 }
bd0eb99b
RH
719 }
720 else if (strcmp (p, "isa") == 0)
721 {
7fd3924a 722 *input_line_pointer = c;
bd0eb99b 723 value = get_absolute_expression ();
ecea7679 724 if (value >= 0)
bd0eb99b 725 current.isa = value;
ecea7679
RH
726 else
727 {
728 as_bad (_("isa number less than zero"));
729 return;
730 }
bd0eb99b 731 }
92846e72
CC
732 else if (strcmp (p, "discriminator") == 0)
733 {
734 *input_line_pointer = c;
735 value = get_absolute_expression ();
736 if (value >= 0)
737 current.discriminator = value;
738 else
739 {
740 as_bad (_("discriminator less than zero"));
741 return;
742 }
743 }
bd0eb99b
RH
744 else
745 {
ecea7679 746 as_bad (_("unknown .loc sub-directive `%s'"), p);
7fd3924a 747 *input_line_pointer = c;
bd0eb99b
RH
748 return;
749 }
750
ecea7679 751 SKIP_WHITESPACE ();
bd0eb99b
RH
752 }
753
754 demand_empty_rest_of_line ();
1eee4adc 755 dwarf2_loc_directive_seen = TRUE;
7cadeb2c 756 debug_type = DEBUG_NONE;
220e750f 757}
07a53e5c
RH
758
759void
760dwarf2_directive_loc_mark_labels (int dummy ATTRIBUTE_UNUSED)
761{
762 offsetT value = get_absolute_expression ();
763
764 if (value != 0 && value != 1)
765 {
766 as_bad (_("expected 0 or 1"));
767 ignore_rest_of_line ();
768 }
769 else
770 {
771 dwarf2_loc_mark_labels = value != 0;
772 demand_empty_rest_of_line ();
773 }
774}
220e750f
RH
775\f
776static struct frag *
a2e22468 777first_frag_for_seg (segT seg)
220e750f 778{
c9049d30 779 return seg_info (seg)->frchainP->frch_root;
220e750f
RH
780}
781
782static struct frag *
a2e22468 783last_frag_for_seg (segT seg)
220e750f 784{
c9049d30 785 frchainS *f = seg_info (seg)->frchainP;
220e750f 786
c9049d30
AM
787 while (f->frch_next != NULL)
788 f = f->frch_next;
220e750f 789
c9049d30 790 return f->frch_last;
220e750f
RH
791}
792\f
793/* Emit a single byte into the current segment. */
794
795static inline void
a2e22468 796out_byte (int byte)
220e750f
RH
797{
798 FRAG_APPEND_1_CHAR (byte);
799}
800
801/* Emit a statement program opcode into the current segment. */
802
803static inline void
a2e22468 804out_opcode (int opc)
220e750f
RH
805{
806 out_byte (opc);
807}
808
809/* Emit a two-byte word into the current segment. */
810
811static inline void
a2e22468 812out_two (int data)
220e750f
RH
813{
814 md_number_to_chars (frag_more (2), data, 2);
815}
816
817/* Emit a four byte word into the current segment. */
818
819static inline void
a2e22468 820out_four (int data)
220e750f
RH
821{
822 md_number_to_chars (frag_more (4), data, 4);
823}
824
825/* Emit an unsigned "little-endian base 128" number. */
826
fac0d250 827static void
a2e22468 828out_uleb128 (addressT value)
220e750f
RH
829{
830 output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0);
831}
832
92846e72
CC
833/* Emit a signed "little-endian base 128" number. */
834
835static void
836out_leb128 (addressT value)
837{
838 output_leb128 (frag_more (sizeof_leb128 (value, 1)), value, 1);
839}
840
220e750f
RH
841/* Emit a tuple for .debug_abbrev. */
842
843static inline void
a2e22468 844out_abbrev (int name, int form)
fac0d250 845{
220e750f
RH
846 out_uleb128 (name);
847 out_uleb128 (form);
848}
fac0d250 849
220e750f 850/* Get the size of a fragment. */
fac0d250 851
220e750f 852static offsetT
c9049d30 853get_frag_fix (fragS *frag, segT seg)
220e750f
RH
854{
855 frchainS *fr;
856
857 if (frag->fr_next)
858 return frag->fr_fix;
859
860 /* If a fragment is the last in the chain, special measures must be
861 taken to find its size before relaxation, since it may be pending
862 on some subsegment chain. */
c9049d30 863 for (fr = seg_info (seg)->frchainP; fr; fr = fr->frch_next)
220e750f 864 if (fr->frch_last == frag)
c5c0a210 865 return (char *) obstack_next_free (&fr->frch_obstack) - frag->fr_literal;
220e750f
RH
866
867 abort ();
868}
fac0d250 869
220e750f 870/* Set an absolute address (may result in a relocation entry). */
fac0d250 871
220e750f 872static void
07a53e5c 873out_set_addr (symbolS *sym)
220e750f 874{
91d6fa6a 875 expressionS exp;
9e3af0e7 876
fac0d250 877 out_opcode (DW_LNS_extended_op);
220e750f 878 out_uleb128 (sizeof_address + 1);
fac0d250
RH
879
880 out_opcode (DW_LNE_set_address);
91d6fa6a
NC
881 exp.X_op = O_symbol;
882 exp.X_add_symbol = sym;
883 exp.X_add_number = 0;
884 emit_expr (&exp, sizeof_address);
fac0d250
RH
885}
886
a2e22468 887static void scale_addr_delta (addressT *);
c8970b4b 888
a3b75434 889static void
d7342424 890scale_addr_delta (addressT *addr_delta)
a3b75434
DD
891{
892 static int printed_this = 0;
8fbf7334 893 if (DWARF2_LINE_MIN_INSN_LENGTH > 1)
a3b75434 894 {
8fbf7334
JL
895 if (*addr_delta % DWARF2_LINE_MIN_INSN_LENGTH != 0 && !printed_this)
896 {
897 as_bad("unaligned opcodes detected in executable segment");
898 printed_this = 1;
899 }
900 *addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
a3b75434 901 }
a3b75434 902}
a3b75434 903
220e750f
RH
904/* Encode a pair of line and address skips as efficiently as possible.
905 Note that the line skip is signed, whereas the address skip is unsigned.
353e2c69 906
220e750f
RH
907 The following two routines *must* be kept in sync. This is
908 enforced by making emit_inc_line_addr abort if we do not emit
909 exactly the expected number of bytes. */
910
911static int
a2e22468 912size_inc_line_addr (int line_delta, addressT addr_delta)
fac0d250 913{
220e750f
RH
914 unsigned int tmp, opcode;
915 int len = 0;
fac0d250 916
220e750f 917 /* Scale the address delta by the minimum instruction length. */
a3b75434 918 scale_addr_delta (&addr_delta);
220e750f
RH
919
920 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
921 We cannot use special opcodes here, since we want the end_sequence
922 to emit the matrix entry. */
923 if (line_delta == INT_MAX)
fac0d250 924 {
220e750f
RH
925 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
926 len = 1;
fac0d250 927 else
220e750f
RH
928 len = 1 + sizeof_leb128 (addr_delta, 0);
929 return len + 3;
fac0d250 930 }
fac0d250 931
220e750f
RH
932 /* Bias the line delta by the base. */
933 tmp = line_delta - DWARF2_LINE_BASE;
fac0d250 934
220e750f
RH
935 /* If the line increment is out of range of a special opcode, we
936 must encode it with DW_LNS_advance_line. */
937 if (tmp >= DWARF2_LINE_RANGE)
938 {
939 len = 1 + sizeof_leb128 (line_delta, 1);
940 line_delta = 0;
941 tmp = 0 - DWARF2_LINE_BASE;
942 }
fac0d250 943
220e750f
RH
944 /* Bias the opcode by the special opcode base. */
945 tmp += DWARF2_LINE_OPCODE_BASE;
353e2c69 946
220e750f
RH
947 /* Avoid overflow when addr_delta is large. */
948 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
949 {
950 /* Try using a special opcode. */
951 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
952 if (opcode <= 255)
953 return len + 1;
954
955 /* Try using DW_LNS_const_add_pc followed by special op. */
956 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
957 if (opcode <= 255)
958 return len + 2;
959 }
960
961 /* Otherwise use DW_LNS_advance_pc. */
962 len += 1 + sizeof_leb128 (addr_delta, 0);
963
964 /* DW_LNS_copy or special opcode. */
965 len += 1;
966
967 return len;
968}
fac0d250 969
220e750f 970static void
a2e22468 971emit_inc_line_addr (int line_delta, addressT addr_delta, char *p, int len)
220e750f
RH
972{
973 unsigned int tmp, opcode;
974 int need_copy = 0;
975 char *end = p + len;
fac0d250 976
07a53e5c
RH
977 /* Line number sequences cannot go backward in addresses. This means
978 we've incorrectly ordered the statements in the sequence. */
9c2799c2 979 gas_assert ((offsetT) addr_delta >= 0);
07a53e5c 980
220e750f 981 /* Scale the address delta by the minimum instruction length. */
a3b75434
DD
982 scale_addr_delta (&addr_delta);
983
220e750f
RH
984 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
985 We cannot use special opcodes here, since we want the end_sequence
986 to emit the matrix entry. */
987 if (line_delta == INT_MAX)
fac0d250 988 {
220e750f
RH
989 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
990 *p++ = DW_LNS_const_add_pc;
991 else
fac0d250 992 {
220e750f
RH
993 *p++ = DW_LNS_advance_pc;
994 p += output_leb128 (p, addr_delta, 0);
fac0d250 995 }
220e750f
RH
996
997 *p++ = DW_LNS_extended_op;
998 *p++ = 1;
999 *p++ = DW_LNE_end_sequence;
1000 goto done;
fac0d250
RH
1001 }
1002
220e750f
RH
1003 /* Bias the line delta by the base. */
1004 tmp = line_delta - DWARF2_LINE_BASE;
1005
1006 /* If the line increment is out of range of a special opcode, we
1007 must encode it with DW_LNS_advance_line. */
1008 if (tmp >= DWARF2_LINE_RANGE)
fac0d250 1009 {
220e750f
RH
1010 *p++ = DW_LNS_advance_line;
1011 p += output_leb128 (p, line_delta, 1);
fac0d250 1012
220e750f
RH
1013 line_delta = 0;
1014 tmp = 0 - DWARF2_LINE_BASE;
1015 need_copy = 1;
1016 }
fac0d250 1017
bd0eb99b
RH
1018 /* Prettier, I think, to use DW_LNS_copy instead of a "line +0, addr +0"
1019 special opcode. */
1020 if (line_delta == 0 && addr_delta == 0)
1021 {
1022 *p++ = DW_LNS_copy;
1023 goto done;
1024 }
1025
220e750f
RH
1026 /* Bias the opcode by the special opcode base. */
1027 tmp += DWARF2_LINE_OPCODE_BASE;
fac0d250 1028
220e750f
RH
1029 /* Avoid overflow when addr_delta is large. */
1030 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
fac0d250 1031 {
220e750f
RH
1032 /* Try using a special opcode. */
1033 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1034 if (opcode <= 255)
1035 {
1036 *p++ = opcode;
1037 goto done;
1038 }
1039
1040 /* Try using DW_LNS_const_add_pc followed by special op. */
1041 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1042 if (opcode <= 255)
fac0d250 1043 {
220e750f
RH
1044 *p++ = DW_LNS_const_add_pc;
1045 *p++ = opcode;
1046 goto done;
fac0d250
RH
1047 }
1048 }
220e750f
RH
1049
1050 /* Otherwise use DW_LNS_advance_pc. */
1051 *p++ = DW_LNS_advance_pc;
1052 p += output_leb128 (p, addr_delta, 0);
1053
1054 if (need_copy)
1055 *p++ = DW_LNS_copy;
fac0d250 1056 else
220e750f 1057 *p++ = tmp;
fac0d250 1058
220e750f 1059 done:
9c2799c2 1060 gas_assert (p == end);
220e750f 1061}
a8316fe2 1062
220e750f 1063/* Handy routine to combine calls to the above two routines. */
e1c05f12 1064
220e750f 1065static void
a2e22468 1066out_inc_line_addr (int line_delta, addressT addr_delta)
220e750f
RH
1067{
1068 int len = size_inc_line_addr (line_delta, addr_delta);
1069 emit_inc_line_addr (line_delta, addr_delta, frag_more (len), len);
1070}
9de8d8f1 1071
1737851b
BW
1072/* Write out an alternative form of line and address skips using
1073 DW_LNS_fixed_advance_pc opcodes. This uses more space than the default
7ddd14de
BW
1074 line and address information, but it is required if linker relaxation
1075 could change the code offsets. The following two routines *must* be
1076 kept in sync. */
453dc3f0 1077#define ADDR_DELTA_LIMIT 50000
1737851b 1078
7ddd14de
BW
1079static int
1080size_fixed_inc_line_addr (int line_delta, addressT addr_delta)
1737851b 1081{
7ddd14de 1082 int len = 0;
1737851b
BW
1083
1084 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence. */
7ddd14de
BW
1085 if (line_delta != INT_MAX)
1086 len = 1 + sizeof_leb128 (line_delta, 1);
1087
453dc3f0 1088 if (addr_delta > ADDR_DELTA_LIMIT)
7ddd14de
BW
1089 {
1090 /* DW_LNS_extended_op */
1091 len += 1 + sizeof_leb128 (sizeof_address + 1, 0);
1092 /* DW_LNE_set_address */
1093 len += 1 + sizeof_address;
1094 }
1095 else
1096 /* DW_LNS_fixed_advance_pc */
1097 len += 3;
1098
1737851b 1099 if (line_delta == INT_MAX)
7ddd14de
BW
1100 /* DW_LNS_extended_op + DW_LNE_end_sequence */
1101 len += 3;
1102 else
1103 /* DW_LNS_copy */
1104 len += 1;
1105
1106 return len;
1107}
1108
1109static void
1110emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
1111 char *p, int len)
1112{
91d6fa6a 1113 expressionS *pexp;
7ddd14de
BW
1114 char *end = p + len;
1115
1116 /* Line number sequences cannot go backward in addresses. This means
1117 we've incorrectly ordered the statements in the sequence. */
9c2799c2 1118 gas_assert ((offsetT) addr_delta >= 0);
7ddd14de 1119
b40bf0a2
NC
1120 /* Verify that we have kept in sync with size_fixed_inc_line_addr. */
1121 gas_assert (len == size_fixed_inc_line_addr (line_delta, addr_delta));
1122
7ddd14de
BW
1123 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence. */
1124 if (line_delta != INT_MAX)
1125 {
1126 *p++ = DW_LNS_advance_line;
1127 p += output_leb128 (p, line_delta, 1);
1128 }
1129
91d6fa6a 1130 pexp = symbol_get_value_expression (frag->fr_symbol);
7ddd14de
BW
1131
1132 /* The DW_LNS_fixed_advance_pc opcode has a 2-byte operand so it can
1133 advance the address by at most 64K. Linker relaxation (without
1134 which this function would not be used) could change the operand by
1135 an unknown amount. If the address increment is getting close to
1136 the limit, just reset the address. */
453dc3f0 1137 if (addr_delta > ADDR_DELTA_LIMIT)
1737851b 1138 {
7ddd14de 1139 symbolS *to_sym;
91d6fa6a 1140 expressionS exp;
7ddd14de 1141
9f6db0d3 1142 gas_assert (pexp->X_op == O_subtract);
91d6fa6a 1143 to_sym = pexp->X_add_symbol;
7ddd14de
BW
1144
1145 *p++ = DW_LNS_extended_op;
1146 p += output_leb128 (p, sizeof_address + 1, 0);
1147 *p++ = DW_LNE_set_address;
91d6fa6a
NC
1148 exp.X_op = O_symbol;
1149 exp.X_add_symbol = to_sym;
1150 exp.X_add_number = 0;
62ebcb5c 1151 emit_expr_fix (&exp, sizeof_address, frag, p, TC_PARSE_CONS_RETURN_NONE);
7ddd14de
BW
1152 p += sizeof_address;
1153 }
1154 else
1155 {
1156 *p++ = DW_LNS_fixed_advance_pc;
62ebcb5c 1157 emit_expr_fix (pexp, 2, frag, p, TC_PARSE_CONS_RETURN_NONE);
7ddd14de 1158 p += 2;
1737851b
BW
1159 }
1160
7ddd14de
BW
1161 if (line_delta == INT_MAX)
1162 {
1163 *p++ = DW_LNS_extended_op;
1164 *p++ = 1;
1165 *p++ = DW_LNE_end_sequence;
1166 }
1167 else
1168 *p++ = DW_LNS_copy;
1737851b 1169
9c2799c2 1170 gas_assert (p == end);
1737851b
BW
1171}
1172
220e750f
RH
1173/* Generate a variant frag that we can use to relax address/line
1174 increments between fragments of the target segment. */
9e3af0e7 1175
220e750f 1176static void
07a53e5c 1177relax_inc_line_addr (int line_delta, symbolS *to_sym, symbolS *from_sym)
220e750f 1178{
91d6fa6a 1179 expressionS exp;
220e750f 1180 int max_chars;
6576f0b5 1181
91d6fa6a
NC
1182 exp.X_op = O_subtract;
1183 exp.X_add_symbol = to_sym;
1184 exp.X_op_symbol = from_sym;
1185 exp.X_add_number = 0;
fac0d250 1186
220e750f
RH
1187 /* The maximum size of the frag is the line delta with a maximum
1188 sized address delta. */
7ddd14de
BW
1189 if (DWARF2_USE_FIXED_ADVANCE_PC)
1190 max_chars = size_fixed_inc_line_addr (line_delta,
1191 -DWARF2_LINE_MIN_INSN_LENGTH);
1192 else
1193 max_chars = size_inc_line_addr (line_delta, -DWARF2_LINE_MIN_INSN_LENGTH);
fac0d250 1194
220e750f 1195 frag_var (rs_dwarf2dbg, max_chars, max_chars, 1,
91d6fa6a 1196 make_expr_symbol (&exp), line_delta, NULL);
220e750f 1197}
fac0d250 1198
220e750f
RH
1199/* The function estimates the size of a rs_dwarf2dbg variant frag
1200 based on the current values of the symbols. It is called before
1201 the relaxation loop. We set fr_subtype to the expected length. */
fac0d250 1202
220e750f 1203int
a2e22468 1204dwarf2dbg_estimate_size_before_relax (fragS *frag)
220e750f
RH
1205{
1206 offsetT addr_delta;
1207 int size;
fac0d250 1208
6386f3a7 1209 addr_delta = resolve_symbol_value (frag->fr_symbol);
7ddd14de
BW
1210 if (DWARF2_USE_FIXED_ADVANCE_PC)
1211 size = size_fixed_inc_line_addr (frag->fr_offset, addr_delta);
1212 else
1213 size = size_inc_line_addr (frag->fr_offset, addr_delta);
fac0d250 1214
220e750f 1215 frag->fr_subtype = size;
fac0d250 1216
220e750f
RH
1217 return size;
1218}
1219
1220/* This function relaxes a rs_dwarf2dbg variant frag based on the
1221 current values of the symbols. fr_subtype is the current length
1222 of the frag. This returns the change in frag length. */
1223
1224int
a2e22468 1225dwarf2dbg_relax_frag (fragS *frag)
220e750f
RH
1226{
1227 int old_size, new_size;
fac0d250 1228
220e750f
RH
1229 old_size = frag->fr_subtype;
1230 new_size = dwarf2dbg_estimate_size_before_relax (frag);
ee515fb7 1231
220e750f 1232 return new_size - old_size;
fac0d250
RH
1233}
1234
220e750f
RH
1235/* This function converts a rs_dwarf2dbg variant frag into a normal
1236 fill frag. This is called after all relaxation has been done.
1237 fr_subtype will be the desired length of the frag. */
1238
1239void
a2e22468 1240dwarf2dbg_convert_frag (fragS *frag)
fac0d250 1241{
220e750f
RH
1242 offsetT addr_diff;
1243
453dc3f0
NC
1244 if (DWARF2_USE_FIXED_ADVANCE_PC)
1245 {
1246 /* If linker relaxation is enabled then the distance bewteen the two
1247 symbols in the frag->fr_symbol expression might change. Hence we
1248 cannot rely upon the value computed by resolve_symbol_value.
1249 Instead we leave the expression unfinalized and allow
1250 emit_fixed_inc_line_addr to create a fixup (which later becomes a
1251 relocation) that will allow the linker to correctly compute the
1252 actual address difference. We have to use a fixed line advance for
1253 this as we cannot (easily) relocate leb128 encoded values. */
1254 int saved_finalize_syms = finalize_syms;
1255
1256 finalize_syms = 0;
1257 addr_diff = resolve_symbol_value (frag->fr_symbol);
1258 finalize_syms = saved_finalize_syms;
1259 }
1260 else
1261 addr_diff = resolve_symbol_value (frag->fr_symbol);
fac0d250 1262
220e750f
RH
1263 /* fr_var carries the max_chars that we created the fragment with.
1264 fr_subtype carries the current expected length. We must, of
1265 course, have allocated enough memory earlier. */
9c2799c2 1266 gas_assert (frag->fr_var >= (int) frag->fr_subtype);
fac0d250 1267
7ddd14de
BW
1268 if (DWARF2_USE_FIXED_ADVANCE_PC)
1269 emit_fixed_inc_line_addr (frag->fr_offset, addr_diff, frag,
1270 frag->fr_literal + frag->fr_fix,
1271 frag->fr_subtype);
1272 else
1273 emit_inc_line_addr (frag->fr_offset, addr_diff,
1274 frag->fr_literal + frag->fr_fix, frag->fr_subtype);
220e750f
RH
1275
1276 frag->fr_fix += frag->fr_subtype;
1277 frag->fr_type = rs_fill;
1278 frag->fr_var = 0;
1279 frag->fr_offset = 0;
1280}
1281
1282/* Generate .debug_line content for the chain of line number entries
1283 beginning at E, for segment SEG. */
1284
1285static void
a2e22468 1286process_entries (segT seg, struct line_entry *e)
220e750f
RH
1287{
1288 unsigned filenum = 1;
1289 unsigned line = 1;
1290 unsigned column = 0;
bd0eb99b
RH
1291 unsigned isa = 0;
1292 unsigned flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
07a53e5c
RH
1293 fragS *last_frag = NULL, *frag;
1294 addressT last_frag_ofs = 0, frag_ofs;
fead5cd9 1295 symbolS *last_lab = NULL, *lab;
220e750f
RH
1296 struct line_entry *next;
1297
b40bf0a2
NC
1298 if (flag_dwarf_sections)
1299 {
1300 char * name;
1301 const char * sec_name;
1302
1303 /* Switch to the relevent sub-section before we start to emit
1304 the line number table.
1305
1306 FIXME: These sub-sections do not have a normal Line Number
1307 Program Header, thus strictly speaking they are not valid
1308 DWARF sections. Unfortunately the DWARF standard assumes
1309 a one-to-one relationship between compilation units and
1310 line number tables. Thus we have to have a .debug_line
1311 section, as well as our sub-sections, and we have to ensure
1312 that all of the sub-sections are merged into a proper
1313 .debug_line section before a debugger sees them. */
1314
1315 sec_name = bfd_get_section_name (stdoutput, seg);
1316 if (strcmp (sec_name, ".text") != 0)
1317 {
1318 unsigned int len;
1319
1320 len = strlen (sec_name);
1321 name = xmalloc (len + 11 + 2);
1322 sprintf (name, ".debug_line%s", sec_name);
1323 subseg_set (subseg_get (name, FALSE), 0);
1324 }
1325 else
1326 /* Don't create a .debug_line.text section -
1327 that is redundant. Instead just switch back to the
1328 normal .debug_line section. */
1329 subseg_set (subseg_get (".debug_line", FALSE), 0);
1330 }
1331
fead5cd9 1332 do
fac0d250 1333 {
07a53e5c 1334 int line_delta;
220e750f
RH
1335
1336 if (filenum != e->loc.filenum)
fac0d250 1337 {
220e750f
RH
1338 filenum = e->loc.filenum;
1339 out_opcode (DW_LNS_set_file);
1340 out_uleb128 (filenum);
220e750f
RH
1341 }
1342
1343 if (column != e->loc.column)
1344 {
1345 column = e->loc.column;
1346 out_opcode (DW_LNS_set_column);
1347 out_uleb128 (column);
220e750f
RH
1348 }
1349
92846e72
CC
1350 if (e->loc.discriminator != 0)
1351 {
1352 out_opcode (DW_LNS_extended_op);
1353 out_leb128 (1 + sizeof_leb128 (e->loc.discriminator, 0));
1354 out_opcode (DW_LNE_set_discriminator);
1355 out_uleb128 (e->loc.discriminator);
1356 }
1357
bd0eb99b
RH
1358 if (isa != e->loc.isa)
1359 {
1360 isa = e->loc.isa;
1361 out_opcode (DW_LNS_set_isa);
1362 out_uleb128 (isa);
bd0eb99b
RH
1363 }
1364
1365 if ((e->loc.flags ^ flags) & DWARF2_FLAG_IS_STMT)
220e750f
RH
1366 {
1367 flags = e->loc.flags;
1368 out_opcode (DW_LNS_negate_stmt);
220e750f
RH
1369 }
1370
bd0eb99b 1371 if (e->loc.flags & DWARF2_FLAG_BASIC_BLOCK)
07a53e5c 1372 out_opcode (DW_LNS_set_basic_block);
220e750f 1373
bd0eb99b 1374 if (e->loc.flags & DWARF2_FLAG_PROLOGUE_END)
07a53e5c 1375 out_opcode (DW_LNS_set_prologue_end);
bd0eb99b
RH
1376
1377 if (e->loc.flags & DWARF2_FLAG_EPILOGUE_BEGIN)
07a53e5c 1378 out_opcode (DW_LNS_set_epilogue_begin);
bd0eb99b 1379
fb81275c
JM
1380 /* Don't try to optimize away redundant entries; gdb wants two
1381 entries for a function where the code starts on the same line as
1382 the {, and there's no way to identify that case here. Trust gcc
1383 to optimize appropriately. */
07a53e5c
RH
1384 line_delta = e->loc.line - line;
1385 lab = e->label;
1386 frag = symbol_get_frag (lab);
1387 frag_ofs = S_GET_VALUE (lab);
220e750f 1388
07a53e5c 1389 if (last_frag == NULL)
220e750f 1390 {
07a53e5c
RH
1391 out_set_addr (lab);
1392 out_inc_line_addr (line_delta, 0);
220e750f 1393 }
7ddd14de 1394 else if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
07a53e5c
RH
1395 out_inc_line_addr (line_delta, frag_ofs - last_frag_ofs);
1396 else
1397 relax_inc_line_addr (line_delta, lab, last_lab);
1398
1399 line = e->loc.line;
1400 last_lab = lab;
1401 last_frag = frag;
1402 last_frag_ofs = frag_ofs;
220e750f
RH
1403
1404 next = e->next;
1405 free (e);
1406 e = next;
fac0d250 1407 }
fead5cd9 1408 while (e);
353e2c69 1409
220e750f 1410 /* Emit a DW_LNE_end_sequence for the end of the section. */
07a53e5c 1411 frag = last_frag_for_seg (seg);
c9049d30 1412 frag_ofs = get_frag_fix (frag, seg);
7ddd14de 1413 if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
07a53e5c 1414 out_inc_line_addr (INT_MAX, frag_ofs - last_frag_ofs);
220e750f 1415 else
07a53e5c
RH
1416 {
1417 lab = symbol_temp_new (seg, frag_ofs, frag);
1418 relax_inc_line_addr (INT_MAX, lab, last_lab);
1419 }
fac0d250
RH
1420}
1421
220e750f
RH
1422/* Emit the directory and file tables for .debug_line. */
1423
fac0d250 1424static void
a2e22468 1425out_file_list (void)
fac0d250
RH
1426{
1427 size_t size;
3d6b762c 1428 const char *dir;
fac0d250 1429 char *cp;
220e750f
RH
1430 unsigned int i;
1431
a7ed1ca2
NC
1432 /* Emit directory list. */
1433 for (i = 1; i < dirs_in_use; ++i)
1434 {
3d6b762c
JM
1435 dir = remap_debug_filename (dirs[i]);
1436 size = strlen (dir) + 1;
a7ed1ca2 1437 cp = frag_more (size);
3d6b762c 1438 memcpy (cp, dir, size);
a7ed1ca2
NC
1439 }
1440 /* Terminate it. */
220e750f 1441 out_byte ('\0');
fac0d250 1442
220e750f 1443 for (i = 1; i < files_in_use; ++i)
fac0d250 1444 {
01e1a5bc
NC
1445 const char *fullfilename;
1446
249e3833
RH
1447 if (files[i].filename == NULL)
1448 {
0e389e77 1449 as_bad (_("unassigned file number %ld"), (long) i);
88b4ca40
RH
1450 /* Prevent a crash later, particularly for file 1. */
1451 files[i].filename = "";
249e3833
RH
1452 continue;
1453 }
1454
01e1a5bc
NC
1455 fullfilename = DWARF2_FILE_NAME (files[i].filename,
1456 files[i].dir ? dirs [files [i].dir] : "");
1457 size = strlen (fullfilename) + 1;
fac0d250 1458 cp = frag_more (size);
01e1a5bc 1459 memcpy (cp, fullfilename, size);
fac0d250 1460
220e750f 1461 out_uleb128 (files[i].dir); /* directory number */
01e1a5bc
NC
1462 /* Output the last modification timestamp. */
1463 out_uleb128 (DWARF2_FILE_TIME_NAME (files[i].filename,
1464 files[i].dir ? dirs [files [i].dir] : ""));
1465 /* Output the filesize. */
1466 out_uleb128 (DWARF2_FILE_SIZE_NAME (files[i].filename,
1467 files[i].dir ? dirs [files [i].dir] : ""));
fac0d250 1468 }
353e2c69
KH
1469
1470 /* Terminate filename list. */
1471 out_byte (0);
fac0d250
RH
1472}
1473
413a266c
AM
1474/* Switch to SEC and output a header length field. Return the size of
1475 offsets used in SEC. The caller must set EXPR->X_add_symbol value
1476 to the end of the section. */
1477
1478static int
91d6fa6a 1479out_header (asection *sec, expressionS *exp)
413a266c
AM
1480{
1481 symbolS *start_sym;
1482 symbolS *end_sym;
1483
1484 subseg_set (sec, 0);
5bb3703f 1485 start_sym = symbol_temp_new_now ();
413a266c
AM
1486 end_sym = symbol_temp_make ();
1487
1488 /* Total length of the information. */
91d6fa6a
NC
1489 exp->X_op = O_subtract;
1490 exp->X_add_symbol = end_sym;
1491 exp->X_op_symbol = start_sym;
413a266c
AM
1492
1493 switch (DWARF2_FORMAT (sec))
1494 {
1495 case dwarf2_format_32bit:
91d6fa6a
NC
1496 exp->X_add_number = -4;
1497 emit_expr (exp, 4);
413a266c
AM
1498 return 4;
1499
1500 case dwarf2_format_64bit:
91d6fa6a 1501 exp->X_add_number = -12;
413a266c 1502 out_four (-1);
91d6fa6a 1503 emit_expr (exp, 8);
413a266c
AM
1504 return 8;
1505
1506 case dwarf2_format_64bit_irix:
91d6fa6a
NC
1507 exp->X_add_number = -8;
1508 emit_expr (exp, 8);
413a266c
AM
1509 return 8;
1510 }
1511
1512 as_fatal (_("internal error: unknown dwarf2 format"));
1513 return 0;
1514}
1515
220e750f
RH
1516/* Emit the collected .debug_line data. */
1517
1518static void
a2e22468 1519out_debug_line (segT line_seg)
220e750f 1520{
91d6fa6a 1521 expressionS exp;
02fe846e 1522 symbolS *prologue_start, *prologue_end;
220e750f
RH
1523 symbolS *line_end;
1524 struct line_seg *s;
14e777e0 1525 int sizeof_offset;
220e750f 1526
91d6fa6a
NC
1527 sizeof_offset = out_header (line_seg, &exp);
1528 line_end = exp.X_add_symbol;
220e750f
RH
1529
1530 /* Version. */
88ebb0a1 1531 out_two (DWARF2_LINE_VERSION);
220e750f
RH
1532
1533 /* Length of the prologue following this length. */
02fe846e 1534 prologue_start = symbol_temp_make ();
413a266c 1535 prologue_end = symbol_temp_make ();
02fe846e 1536 exp.X_op = O_subtract;
91d6fa6a 1537 exp.X_add_symbol = prologue_end;
02fe846e
AM
1538 exp.X_op_symbol = prologue_start;
1539 exp.X_add_number = 0;
91d6fa6a 1540 emit_expr (&exp, sizeof_offset);
02fe846e 1541 symbol_set_value_now (prologue_start);
220e750f
RH
1542
1543 /* Parameters of the state machine. */
1544 out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
1545 out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
1546 out_byte (DWARF2_LINE_BASE);
1547 out_byte (DWARF2_LINE_RANGE);
1548 out_byte (DWARF2_LINE_OPCODE_BASE);
1549
1550 /* Standard opcode lengths. */
1551 out_byte (0); /* DW_LNS_copy */
1552 out_byte (1); /* DW_LNS_advance_pc */
1553 out_byte (1); /* DW_LNS_advance_line */
1554 out_byte (1); /* DW_LNS_set_file */
1555 out_byte (1); /* DW_LNS_set_column */
1556 out_byte (0); /* DW_LNS_negate_stmt */
1557 out_byte (0); /* DW_LNS_set_basic_block */
1558 out_byte (0); /* DW_LNS_const_add_pc */
1559 out_byte (1); /* DW_LNS_fixed_advance_pc */
bd0eb99b
RH
1560 out_byte (0); /* DW_LNS_set_prologue_end */
1561 out_byte (0); /* DW_LNS_set_epilogue_begin */
1562 out_byte (1); /* DW_LNS_set_isa */
220e750f
RH
1563
1564 out_file_list ();
1565
b7d6ed97 1566 symbol_set_value_now (prologue_end);
220e750f
RH
1567
1568 /* For each section, emit a statement program. */
ee515fb7 1569 for (s = all_segs; s; s = s->next)
9aec2026
NC
1570 if (SEG_NORMAL (s->seg))
1571 process_entries (s->seg, s->head->head);
1572 else
1573 as_warn ("dwarf line number information for %s ignored",
1574 segment_name (s->seg));
220e750f 1575
b40bf0a2
NC
1576 if (flag_dwarf_sections)
1577 /* We have to switch to the special .debug_line_end section
1578 before emitting the end-of-debug_line symbol. The linker
1579 script arranges for this section to be placed after all the
1580 (potentially garbage collected) .debug_line.<foo> sections.
1581 This section contains the line_end symbol which is used to
1582 compute the size of the linked .debug_line section, as seen
1583 in the DWARF Line Number header. */
1584 subseg_set (subseg_get (".debug_line_end", FALSE), 0);
1585
b7d6ed97 1586 symbol_set_value_now (line_end);
220e750f
RH
1587}
1588
802f5d9e
NC
1589static void
1590out_debug_ranges (segT ranges_seg)
1591{
1592 unsigned int addr_size = sizeof_address;
1593 struct line_seg *s;
91d6fa6a 1594 expressionS exp;
802f5d9e
NC
1595 unsigned int i;
1596
1597 subseg_set (ranges_seg, 0);
1598
1599 /* Base Address Entry. */
7fd3924a 1600 for (i = 0; i < addr_size; i++)
802f5d9e 1601 out_byte (0xff);
7fd3924a 1602 for (i = 0; i < addr_size; i++)
802f5d9e
NC
1603 out_byte (0);
1604
1605 /* Range List Entry. */
1606 for (s = all_segs; s; s = s->next)
1607 {
1608 fragS *frag;
1609 symbolS *beg, *end;
1610
1611 frag = first_frag_for_seg (s->seg);
1612 beg = symbol_temp_new (s->seg, 0, frag);
1613 s->text_start = beg;
1614
1615 frag = last_frag_for_seg (s->seg);
1616 end = symbol_temp_new (s->seg, get_frag_fix (frag, s->seg), frag);
1617 s->text_end = end;
1618
91d6fa6a
NC
1619 exp.X_op = O_symbol;
1620 exp.X_add_symbol = beg;
1621 exp.X_add_number = 0;
1622 emit_expr (&exp, addr_size);
802f5d9e 1623
91d6fa6a
NC
1624 exp.X_op = O_symbol;
1625 exp.X_add_symbol = end;
1626 exp.X_add_number = 0;
1627 emit_expr (&exp, addr_size);
802f5d9e
NC
1628 }
1629
1630 /* End of Range Entry. */
7fd3924a 1631 for (i = 0; i < addr_size; i++)
802f5d9e 1632 out_byte (0);
7fd3924a 1633 for (i = 0; i < addr_size; i++)
802f5d9e
NC
1634 out_byte (0);
1635}
1636
220e750f
RH
1637/* Emit data for .debug_aranges. */
1638
58b5739a 1639static void
a2e22468 1640out_debug_aranges (segT aranges_seg, segT info_seg)
fac0d250 1641{
220e750f 1642 unsigned int addr_size = sizeof_address;
220e750f 1643 struct line_seg *s;
91d6fa6a 1644 expressionS exp;
413a266c 1645 symbolS *aranges_end;
220e750f 1646 char *p;
413a266c 1647 int sizeof_offset;
fac0d250 1648
91d6fa6a
NC
1649 sizeof_offset = out_header (aranges_seg, &exp);
1650 aranges_end = exp.X_add_symbol;
fac0d250 1651
220e750f 1652 /* Version. */
88ebb0a1 1653 out_two (DWARF2_ARANGES_VERSION);
4dc7ead9 1654
220e750f 1655 /* Offset to .debug_info. */
413a266c 1656 TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), sizeof_offset);
220e750f
RH
1657
1658 /* Size of an address (offset portion). */
1659 out_byte (addr_size);
1660
1661 /* Size of a segment descriptor. */
1662 out_byte (0);
1663
1664 /* Align the header. */
413a266c 1665 frag_align (ffs (2 * addr_size) - 1, 0, 0);
4dc7ead9 1666
ee515fb7 1667 for (s = all_segs; s; s = s->next)
220e750f
RH
1668 {
1669 fragS *frag;
1670 symbolS *beg, *end;
1671
1672 frag = first_frag_for_seg (s->seg);
b7d6ed97 1673 beg = symbol_temp_new (s->seg, 0, frag);
220e750f
RH
1674 s->text_start = beg;
1675
1676 frag = last_frag_for_seg (s->seg);
c9049d30 1677 end = symbol_temp_new (s->seg, get_frag_fix (frag, s->seg), frag);
220e750f
RH
1678 s->text_end = end;
1679
91d6fa6a
NC
1680 exp.X_op = O_symbol;
1681 exp.X_add_symbol = beg;
1682 exp.X_add_number = 0;
1683 emit_expr (&exp, addr_size);
220e750f 1684
91d6fa6a
NC
1685 exp.X_op = O_subtract;
1686 exp.X_add_symbol = end;
1687 exp.X_op_symbol = beg;
1688 exp.X_add_number = 0;
1689 emit_expr (&exp, addr_size);
220e750f 1690 }
4dc7ead9 1691
220e750f
RH
1692 p = frag_more (2 * addr_size);
1693 md_number_to_chars (p, 0, addr_size);
1694 md_number_to_chars (p + addr_size, 0, addr_size);
413a266c
AM
1695
1696 symbol_set_value_now (aranges_end);
4dc7ead9
RH
1697}
1698
220e750f
RH
1699/* Emit data for .debug_abbrev. Note that this must be kept in
1700 sync with out_debug_info below. */
fac0d250 1701
220e750f 1702static void
413a266c
AM
1703out_debug_abbrev (segT abbrev_seg,
1704 segT info_seg ATTRIBUTE_UNUSED,
1705 segT line_seg ATTRIBUTE_UNUSED)
220e750f
RH
1706{
1707 subseg_set (abbrev_seg, 0);
fac0d250 1708
220e750f
RH
1709 out_uleb128 (1);
1710 out_uleb128 (DW_TAG_compile_unit);
1711 out_byte (DW_CHILDREN_no);
413a266c
AM
1712 if (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit)
1713 out_abbrev (DW_AT_stmt_list, DW_FORM_data4);
1714 else
1715 out_abbrev (DW_AT_stmt_list, DW_FORM_data8);
220e750f 1716 if (all_segs->next == NULL)
4dc7ead9 1717 {
220e750f 1718 out_abbrev (DW_AT_low_pc, DW_FORM_addr);
88ebb0a1
MW
1719 if (DWARF2_VERSION < 4)
1720 out_abbrev (DW_AT_high_pc, DW_FORM_addr);
1721 else
1722 out_abbrev (DW_AT_high_pc, (sizeof_address == 4
1723 ? DW_FORM_data4 : DW_FORM_data8));
220e750f 1724 }
802f5d9e
NC
1725 else
1726 {
413a266c 1727 if (DWARF2_FORMAT (info_seg) == dwarf2_format_32bit)
802f5d9e
NC
1728 out_abbrev (DW_AT_ranges, DW_FORM_data4);
1729 else
1730 out_abbrev (DW_AT_ranges, DW_FORM_data8);
1731 }
48b91938 1732 out_abbrev (DW_AT_name, DW_FORM_string);
220e750f
RH
1733 out_abbrev (DW_AT_comp_dir, DW_FORM_string);
1734 out_abbrev (DW_AT_producer, DW_FORM_string);
1735 out_abbrev (DW_AT_language, DW_FORM_data2);
1736 out_abbrev (0, 0);
a987bfc9
RH
1737
1738 /* Terminate the abbreviations for this compilation unit. */
1739 out_byte (0);
220e750f 1740}
4dc7ead9 1741
220e750f 1742/* Emit a description of this compilation unit for .debug_info. */
4dc7ead9 1743
220e750f 1744static void
802f5d9e 1745out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg, segT ranges_seg)
220e750f
RH
1746{
1747 char producer[128];
3d6b762c
JM
1748 const char *comp_dir;
1749 const char *dirname;
91d6fa6a 1750 expressionS exp;
220e750f
RH
1751 symbolS *info_end;
1752 char *p;
1753 int len;
14e777e0 1754 int sizeof_offset;
4dc7ead9 1755
91d6fa6a
NC
1756 sizeof_offset = out_header (info_seg, &exp);
1757 info_end = exp.X_add_symbol;
4dc7ead9 1758
220e750f 1759 /* DWARF version. */
fc0eebac 1760 out_two (DWARF2_VERSION);
4dc7ead9 1761
220e750f 1762 /* .debug_abbrev offset */
6174d9c8 1763 TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
4dc7ead9 1764
220e750f
RH
1765 /* Target address size. */
1766 out_byte (sizeof_address);
fac0d250 1767
220e750f
RH
1768 /* DW_TAG_compile_unit DIE abbrev */
1769 out_uleb128 (1);
fac0d250 1770
220e750f 1771 /* DW_AT_stmt_list */
413a266c
AM
1772 TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg),
1773 (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit
1774 ? 4 : 8));
fac0d250 1775
802f5d9e 1776 /* These two attributes are emitted if all of the code is contiguous. */
220e750f 1777 if (all_segs->next == NULL)
58b5739a 1778 {
220e750f 1779 /* DW_AT_low_pc */
91d6fa6a
NC
1780 exp.X_op = O_symbol;
1781 exp.X_add_symbol = all_segs->text_start;
1782 exp.X_add_number = 0;
1783 emit_expr (&exp, sizeof_address);
220e750f
RH
1784
1785 /* DW_AT_high_pc */
88ebb0a1
MW
1786 if (DWARF2_VERSION < 4)
1787 exp.X_op = O_symbol;
1788 else
1789 {
1790 exp.X_op = O_subtract;
1791 exp.X_op_symbol = all_segs->text_start;
1792 }
91d6fa6a
NC
1793 exp.X_add_symbol = all_segs->text_end;
1794 exp.X_add_number = 0;
1795 emit_expr (&exp, sizeof_address);
58b5739a 1796 }
802f5d9e
NC
1797 else
1798 {
eb1fe072
NC
1799 /* This attribute is emitted if the code is disjoint. */
1800 /* DW_AT_ranges. */
1801 TC_DWARF2_EMIT_OFFSET (section_symbol (ranges_seg), sizeof_offset);
802f5d9e 1802 }
58b5739a 1803
48b91938
RH
1804 /* DW_AT_name. We don't have the actual file name that was present
1805 on the command line, so assume files[1] is the main input file.
1806 We're not supposed to get called unless at least one line number
1807 entry was emitted, so this should always be defined. */
7fd3924a 1808 if (files_in_use == 0)
48b91938 1809 abort ();
a7ed1ca2
NC
1810 if (files[1].dir)
1811 {
3d6b762c
JM
1812 dirname = remap_debug_filename (dirs[files[1].dir]);
1813 len = strlen (dirname);
198f1251
TG
1814#ifdef TE_VMS
1815 /* Already has trailing slash. */
1816 p = frag_more (len);
1817 memcpy (p, dirname, len);
1818#else
a7ed1ca2 1819 p = frag_more (len + 1);
3d6b762c 1820 memcpy (p, dirname, len);
56487c55 1821 INSERT_DIR_SEPARATOR (p, len);
198f1251 1822#endif
a7ed1ca2 1823 }
48b91938
RH
1824 len = strlen (files[1].filename) + 1;
1825 p = frag_more (len);
1826 memcpy (p, files[1].filename, len);
1827
220e750f 1828 /* DW_AT_comp_dir */
3d6b762c 1829 comp_dir = remap_debug_filename (getpwd ());
220e750f
RH
1830 len = strlen (comp_dir) + 1;
1831 p = frag_more (len);
1832 memcpy (p, comp_dir, len);
fac0d250 1833
220e750f
RH
1834 /* DW_AT_producer */
1835 sprintf (producer, "GNU AS %s", VERSION);
1836 len = strlen (producer) + 1;
1837 p = frag_more (len);
1838 memcpy (p, producer, len);
fac0d250 1839
220e750f
RH
1840 /* DW_AT_language. Yes, this is probably not really MIPS, but the
1841 dwarf2 draft has no standard code for assembler. */
1842 out_two (DW_LANG_Mips_Assembler);
1843
b7d6ed97 1844 symbol_set_value_now (info_end);
fac0d250
RH
1845}
1846
1e9cc1c2
NC
1847void
1848dwarf2_init (void)
1849{
1850 all_segs_hash = hash_new ();
1851 last_seg_ptr = &all_segs;
1852}
1853
1854
c6cb92c5
NS
1855/* Finish the dwarf2 debug sections. We emit .debug.line if there
1856 were any .file/.loc directives, or --gdwarf2 was given, or if the
df1c40a7
L
1857 file has a non-empty .debug_info section and an empty .debug_line
1858 section. If we emit .debug_line, and the .debug_info section is
1859 empty, we also emit .debug_info, .debug_aranges and .debug_abbrev.
1860 ALL_SEGS will be non-null if there were any .file/.loc directives,
1861 or --gdwarf2 was given and there were any located instructions
1862 emitted. */
c6cb92c5 1863
fac0d250 1864void
a2e22468 1865dwarf2_finish (void)
fac0d250 1866{
220e750f
RH
1867 segT line_seg;
1868 struct line_seg *s;
c6cb92c5
NS
1869 segT info_seg;
1870 int emit_other_sections = 0;
df1c40a7 1871 int empty_debug_line = 0;
c6cb92c5
NS
1872
1873 info_seg = bfd_get_section_by_name (stdoutput, ".debug_info");
1874 emit_other_sections = info_seg == NULL || !seg_not_empty_p (info_seg);
fac0d250 1875
df1c40a7
L
1876 line_seg = bfd_get_section_by_name (stdoutput, ".debug_line");
1877 empty_debug_line = line_seg == NULL || !seg_not_empty_p (line_seg);
1878
1879 /* We can't construct a new debug_line section if we already have one.
1880 Give an error. */
1881 if (all_segs && !empty_debug_line)
1882 as_fatal ("duplicate .debug_line sections");
1883
1884 if ((!all_segs && emit_other_sections)
1885 || (!emit_other_sections && !empty_debug_line))
1886 /* If there is no line information and no non-empty .debug_info
1887 section, or if there is both a non-empty .debug_info and a non-empty
1888 .debug_line, then we do nothing. */
220e750f 1889 return;
fac0d250 1890
220e750f 1891 /* Calculate the size of an address for the target machine. */
9605f328 1892 sizeof_address = DWARF2_ADDR_SIZE (stdoutput);
fac0d250 1893
220e750f
RH
1894 /* Create and switch to the line number section. */
1895 line_seg = subseg_new (".debug_line", 0);
8a7140c3 1896 bfd_set_section_flags (stdoutput, line_seg, SEC_READONLY | SEC_DEBUGGING);
fac0d250 1897
220e750f 1898 /* For each subsection, chain the debug entries together. */
ee515fb7 1899 for (s = all_segs; s; s = s->next)
fac0d250 1900 {
91d6fa6a
NC
1901 struct line_subseg *lss = s->head;
1902 struct line_entry **ptail = lss->ptail;
220e750f 1903
91d6fa6a 1904 while ((lss = lss->next) != NULL)
220e750f 1905 {
91d6fa6a
NC
1906 *ptail = lss->head;
1907 ptail = lss->ptail;
220e750f 1908 }
fac0d250 1909 }
85a39694 1910
220e750f 1911 out_debug_line (line_seg);
85a39694 1912
c6cb92c5
NS
1913 /* If this is assembler generated line info, and there is no
1914 debug_info already, we need .debug_info and .debug_abbrev
1915 sections as well. */
1916 if (emit_other_sections)
220e750f
RH
1917 {
1918 segT abbrev_seg;
220e750f 1919 segT aranges_seg;
802f5d9e 1920 segT ranges_seg;
4dc7ead9 1921
9c2799c2 1922 gas_assert (all_segs);
7fd3924a 1923
220e750f
RH
1924 info_seg = subseg_new (".debug_info", 0);
1925 abbrev_seg = subseg_new (".debug_abbrev", 0);
1926 aranges_seg = subseg_new (".debug_aranges", 0);
ef99799a 1927
8a7140c3
NC
1928 bfd_set_section_flags (stdoutput, info_seg,
1929 SEC_READONLY | SEC_DEBUGGING);
1930 bfd_set_section_flags (stdoutput, abbrev_seg,
1931 SEC_READONLY | SEC_DEBUGGING);
1932 bfd_set_section_flags (stdoutput, aranges_seg,
1933 SEC_READONLY | SEC_DEBUGGING);
ef99799a 1934
ee515fb7 1935 record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
ef99799a 1936
802f5d9e
NC
1937 if (all_segs->next == NULL)
1938 ranges_seg = NULL;
1939 else
1940 {
1941 ranges_seg = subseg_new (".debug_ranges", 0);
7fd3924a 1942 bfd_set_section_flags (stdoutput, ranges_seg,
802f5d9e
NC
1943 SEC_READONLY | SEC_DEBUGGING);
1944 record_alignment (ranges_seg, ffs (2 * sizeof_address) - 1);
1945 out_debug_ranges (ranges_seg);
1946 }
1947
220e750f 1948 out_debug_aranges (aranges_seg, info_seg);
413a266c 1949 out_debug_abbrev (abbrev_seg, info_seg, line_seg);
802f5d9e 1950 out_debug_info (info_seg, abbrev_seg, line_seg, ranges_seg);
220e750f 1951 }
85a39694 1952}