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