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