]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gas/dwarf2dbg.c
PR28149, debug info with wrong file association
[thirdparty/binutils-gdb.git] / gas / dwarf2dbg.c
CommitLineData
fac0d250 1/* dwarf2dbg.c - DWARF2 debug support
250d07de 2 Copyright (C) 1999-2021 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"
42dbf88c 33#include <limits.h>
70658493 34#include "dwarf2dbg.h"
a7ed1ca2 35#include <filenames.h>
70658493 36
56487c55
NC
37#ifdef HAVE_DOS_BASED_FILE_SYSTEM
38/* We need to decide which character to use as a directory separator.
39 Just because HAVE_DOS_BASED_FILE_SYSTEM is defined, it does not
40 necessarily mean that the backslash character is the one to use.
41 Some environments, eg Cygwin, can support both naming conventions.
42 So we use the heuristic that we only need to use the backslash if
43 the path is an absolute path starting with a DOS style drive
44 selector. eg C: or D: */
45# define INSERT_DIR_SEPARATOR(string, offset) \
46 do \
47 { \
48 if (offset > 1 \
7fd3924a
AM
49 && string[0] != 0 \
50 && string[1] == ':') \
56487c55
NC
51 string [offset] = '\\'; \
52 else \
53 string [offset] = '/'; \
54 } \
55 while (0)
56#else
57# define INSERT_DIR_SEPARATOR(string, offset) string[offset] = '/'
58#endif
59
14e777e0 60#ifndef DWARF2_FORMAT
413a266c 61# define DWARF2_FORMAT(SEC) dwarf2_format_32bit
14e777e0
KB
62#endif
63
9605f328 64#ifndef DWARF2_ADDR_SIZE
e4475e39 65# define DWARF2_ADDR_SIZE(bfd) (bfd_arch_bits_per_address (bfd) / 8)
9605f328
AO
66#endif
67
01e1a5bc
NC
68#ifndef DWARF2_FILE_NAME
69#define DWARF2_FILE_NAME(FILENAME, DIRNAME) FILENAME
70#endif
71
72#ifndef DWARF2_FILE_TIME_NAME
5496f3c6 73#define DWARF2_FILE_TIME_NAME(FILENAME,DIRNAME) -1
01e1a5bc
NC
74#endif
75
76#ifndef DWARF2_FILE_SIZE_NAME
5496f3c6 77#define DWARF2_FILE_SIZE_NAME(FILENAME,DIRNAME) -1
01e1a5bc
NC
78#endif
79
fc0eebac 80#ifndef DWARF2_VERSION
31bf1864 81#define DWARF2_VERSION dwarf_level
fc0eebac
TG
82#endif
83
88ebb0a1
MW
84/* The .debug_aranges version has been 2 in DWARF version 2, 3 and 4. */
85#ifndef DWARF2_ARANGES_VERSION
86#define DWARF2_ARANGES_VERSION 2
87#endif
88
8acbe8ff 89/* This implementation outputs version 3 .debug_line information. */
88ebb0a1 90#ifndef DWARF2_LINE_VERSION
5496f3c6 91#define DWARF2_LINE_VERSION (dwarf_level > 3 ? dwarf_level : 3)
88ebb0a1
MW
92#endif
93
bdd3b953
MW
94/* The .debug_rnglists has only been in DWARF version 5. */
95#ifndef DWARF2_RNGLISTS_VERSION
96#define DWARF2_RNGLISTS_VERSION 5
97#endif
98
fac0d250
RH
99#include "subsegs.h"
100
fa8f86ff 101#include "dwarf2.h"
fac0d250 102
fac0d250
RH
103/* Since we can't generate the prolog until the body is complete, we
104 use three different subsegments for .debug_line: one holding the
105 prolog, one for the directory and filename info, and one for the
106 body ("statement program"). */
107#define DL_PROLOG 0
108#define DL_FILES 1
109#define DL_BODY 2
110
1737851b
BW
111/* If linker relaxation might change offsets in the code, the DWARF special
112 opcodes and variable-length operands cannot be used. If this macro is
113 nonzero, use the DW_LNS_fixed_advance_pc opcode instead. */
114#ifndef DWARF2_USE_FIXED_ADVANCE_PC
453dc3f0 115# define DWARF2_USE_FIXED_ADVANCE_PC linkrelax
1737851b
BW
116#endif
117
33eaf5de 118/* First special line opcode - leave room for the standard opcodes.
fac0d250
RH
119 Note: If you want to change this, you'll have to update the
120 "standard_opcode_lengths" table that is emitted below in
bd0eb99b
RH
121 out_debug_line(). */
122#define DWARF2_LINE_OPCODE_BASE 13
fac0d250
RH
123
124#ifndef DWARF2_LINE_BASE
125 /* Minimum line offset in a special line info. opcode. This value
126 was chosen to give a reasonable range of values. */
127# define DWARF2_LINE_BASE -5
128#endif
129
130/* Range of line offsets in a special line info. opcode. */
131#ifndef DWARF2_LINE_RANGE
132# define DWARF2_LINE_RANGE 14
133#endif
134
135#ifndef DWARF2_LINE_MIN_INSN_LENGTH
136 /* Define the architecture-dependent minimum instruction length (in
137 bytes). This value should be rather too small than too big. */
4dc7ead9 138# define DWARF2_LINE_MIN_INSN_LENGTH 1
fac0d250
RH
139#endif
140
bd0eb99b 141/* Flag that indicates the initial value of the is_stmt_start flag. */
fac0d250
RH
142#define DWARF2_LINE_DEFAULT_IS_STMT 1
143
5496f3c6
NC
144#ifndef DWARF2_LINE_MAX_OPS_PER_INSN
145#define DWARF2_LINE_MAX_OPS_PER_INSN 1
146#endif
147
cb30237e 148/* Given a special op, return the line skip amount. */
fac0d250
RH
149#define SPECIAL_LINE(op) \
150 (((op) - DWARF2_LINE_OPCODE_BASE)%DWARF2_LINE_RANGE + DWARF2_LINE_BASE)
151
152/* Given a special op, return the address skip amount (in units of
153 DWARF2_LINE_MIN_INSN_LENGTH. */
154#define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
155
cb30237e 156/* The maximum address skip amount that can be encoded with a special op. */
fac0d250
RH
157#define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
158
62ebcb5c
AM
159#ifndef TC_PARSE_CONS_RETURN_NONE
160#define TC_PARSE_CONS_RETURN_NONE BFD_RELOC_NONE
161#endif
162
ba8826a8
AO
163struct line_entry
164{
220e750f 165 struct line_entry *next;
07a53e5c 166 symbolS *label;
220e750f 167 struct dwarf2_line_info loc;
e6c774b4 168};
fac0d250 169
ba8826a8
AO
170/* Don't change the offset of next in line_entry. set_or_check_view
171 calls in dwarf2_gen_line_info_1 depend on it. */
172static char unused[offsetof(struct line_entry, next) ? -1 : 1]
173ATTRIBUTE_UNUSED;
174
175struct line_subseg
176{
220e750f
RH
177 struct line_subseg *next;
178 subsegT subseg;
179 struct line_entry *head;
180 struct line_entry **ptail;
e410add4 181 struct line_entry **pmove_tail;
220e750f 182};
353e2c69 183
ba8826a8
AO
184struct line_seg
185{
220e750f
RH
186 struct line_seg *next;
187 segT seg;
188 struct line_subseg *head;
189 symbolS *text_start;
190 symbolS *text_end;
191};
192
193/* Collects data for all line table entries during assembly. */
194static struct line_seg *all_segs;
1e9cc1c2 195static struct line_seg **last_seg_ptr;
220e750f 196
5496f3c6
NC
197#define NUM_MD5_BYTES 16
198
ba8826a8
AO
199struct file_entry
200{
5496f3c6
NC
201 const char * filename;
202 unsigned int dir;
203 unsigned char md5[NUM_MD5_BYTES];
220e750f
RH
204};
205
206/* Table of files used by .debug_line. */
207static struct file_entry *files;
208static unsigned int files_in_use;
209static unsigned int files_allocated;
210
a7ed1ca2 211/* Table of directories used by .debug_line. */
5496f3c6
NC
212static char ** dirs = NULL;
213static unsigned int dirs_in_use = 0;
214static unsigned int dirs_allocated = 0;
a7ed1ca2 215
b34976b6 216/* TRUE when we've seen a .loc directive recently. Used to avoid
edc7a80a
MW
217 doing work when there's nothing to do. Will be reset by
218 dwarf2_consume_line_info. */
5b7c81bd 219bool dwarf2_loc_directive_seen;
220e750f 220
edc7a80a
MW
221/* TRUE when we've seen any .loc directive at any time during parsing.
222 Indicates the user wants us to generate a .debug_line section.
223 Used in dwarf2_finish as sanity check. */
5b7c81bd 224static bool dwarf2_any_loc_directive_seen;
edc7a80a 225
07a53e5c
RH
226/* TRUE when we're supposed to set the basic block mark whenever a
227 label is seen. */
5b7c81bd 228bool dwarf2_loc_mark_labels;
07a53e5c 229
220e750f 230/* Current location as indicated by the most recent .loc directive. */
ba8826a8
AO
231static struct dwarf2_line_info current =
232{
bd0eb99b 233 1, 1, 0, 0,
92846e72 234 DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0,
51298b33 235 0, { NULL }
bd0eb99b 236};
220e750f 237
ba8826a8
AO
238/* This symbol is used to recognize view number forced resets in loc
239 lists. */
240static symbolS *force_reset_view;
241
242/* This symbol evaluates to an expression that, if nonzero, indicates
243 some view assert check failed. */
244static symbolS *view_assert_failed;
245
220e750f
RH
246/* The size of an address on the target. */
247static unsigned int sizeof_address;
248\f
c5c0a210 249#ifndef TC_DWARF2_EMIT_OFFSET
802f5d9e 250#define TC_DWARF2_EMIT_OFFSET generic_dwarf2_emit_offset
c5c0a210 251
6174d9c8
RH
252/* Create an offset to .dwarf2_*. */
253
254static void
a2e22468 255generic_dwarf2_emit_offset (symbolS *symbol, unsigned int size)
6174d9c8 256{
91d6fa6a 257 expressionS exp;
6174d9c8 258
031e3350 259 memset (&exp, 0, sizeof exp);
91d6fa6a
NC
260 exp.X_op = O_symbol;
261 exp.X_add_symbol = symbol;
262 exp.X_add_number = 0;
263 emit_expr (&exp, size);
6174d9c8 264}
c5c0a210 265#endif
6174d9c8 266
e410add4 267/* Find or create (if CREATE_P) an entry for SEG+SUBSEG in ALL_SEGS. */
220e750f
RH
268
269static struct line_subseg *
5b7c81bd 270get_line_subseg (segT seg, subsegT subseg, bool create_p)
220e750f 271{
5f3fd8b4 272 struct line_seg *s = seg_info (seg)->dwarf2_line_seg;
91d6fa6a 273 struct line_subseg **pss, *lss;
fac0d250 274
1e9cc1c2
NC
275 if (s == NULL)
276 {
e410add4
RS
277 if (!create_p)
278 return NULL;
279
325801bd 280 s = XNEW (struct line_seg);
1e9cc1c2
NC
281 s->next = NULL;
282 s->seg = seg;
283 s->head = NULL;
284 *last_seg_ptr = s;
285 last_seg_ptr = &s->next;
5f3fd8b4 286 seg_info (seg)->dwarf2_line_seg = s;
1e9cc1c2 287 }
5496f3c6 288
1e9cc1c2 289 gas_assert (seg == s->seg);
220e750f 290
91d6fa6a 291 for (pss = &s->head; (lss = *pss) != NULL ; pss = &lss->next)
fac0d250 292 {
91d6fa6a 293 if (lss->subseg == subseg)
ee515fb7 294 goto found_subseg;
91d6fa6a 295 if (lss->subseg > subseg)
220e750f 296 break;
fac0d250 297 }
220e750f 298
325801bd 299 lss = XNEW (struct line_subseg);
91d6fa6a
NC
300 lss->next = *pss;
301 lss->subseg = subseg;
302 lss->head = NULL;
303 lss->ptail = &lss->head;
e410add4 304 lss->pmove_tail = &lss->head;
91d6fa6a 305 *pss = lss;
220e750f
RH
306
307 found_subseg:
91d6fa6a 308 return lss;
fac0d250
RH
309}
310
ba8826a8
AO
311/* (Un)reverse the line_entry list starting from H. */
312
313static struct line_entry *
314reverse_line_entry_list (struct line_entry *h)
315{
316 struct line_entry *p = NULL, *e, *n;
317
318 for (e = h; e; e = n)
319 {
320 n = e->next;
321 e->next = p;
322 p = e;
323 }
324 return p;
325}
326
327/* Compute the view for E based on the previous entry P. If we
328 introduce an (undefined) view symbol for P, and H is given (P must
329 be the tail in this case), introduce view symbols for earlier list
330 entries as well, until one of them is constant. */
331
332static void
333set_or_check_view (struct line_entry *e, struct line_entry *p,
334 struct line_entry *h)
335{
336 expressionS viewx;
337
338 memset (&viewx, 0, sizeof (viewx));
339 viewx.X_unsigned = 1;
340
341 /* First, compute !(E->label > P->label), to tell whether or not
342 we're to reset the view number. If we can't resolve it to a
343 constant, keep it symbolic. */
51298b33 344 if (!p || (e->loc.u.view == force_reset_view && force_reset_view))
ba8826a8
AO
345 {
346 viewx.X_op = O_constant;
347 viewx.X_add_number = 0;
348 viewx.X_add_symbol = NULL;
349 viewx.X_op_symbol = NULL;
350 }
351 else
352 {
353 viewx.X_op = O_gt;
354 viewx.X_add_number = 0;
355 viewx.X_add_symbol = e->label;
356 viewx.X_op_symbol = p->label;
357 resolve_expression (&viewx);
358 if (viewx.X_op == O_constant)
359 viewx.X_add_number = !viewx.X_add_number;
360 else
361 {
362 viewx.X_add_symbol = make_expr_symbol (&viewx);
363 viewx.X_add_number = 0;
364 viewx.X_op_symbol = NULL;
365 viewx.X_op = O_logical_not;
366 }
367 }
368
51298b33 369 if (S_IS_DEFINED (e->loc.u.view) && symbol_constant_p (e->loc.u.view))
ba8826a8 370 {
51298b33 371 expressionS *value = symbol_get_value_expression (e->loc.u.view);
ba8826a8
AO
372 /* We can't compare the view numbers at this point, because in
373 VIEWX we've only determined whether we're to reset it so
374 far. */
375 if (viewx.X_op == O_constant)
376 {
377 if (!value->X_add_number != !viewx.X_add_number)
378 as_bad (_("view number mismatch"));
379 }
380 /* Record the expression to check it later. It is the result of
381 a logical not, thus 0 or 1. We just add up all such deferred
382 expressions, and resolve it at the end. */
383 else if (!value->X_add_number)
384 {
385 symbolS *deferred = make_expr_symbol (&viewx);
386 if (view_assert_failed)
387 {
388 expressionS chk;
031e3350 389
ba8826a8
AO
390 memset (&chk, 0, sizeof (chk));
391 chk.X_unsigned = 1;
392 chk.X_op = O_add;
393 chk.X_add_number = 0;
394 chk.X_add_symbol = view_assert_failed;
395 chk.X_op_symbol = deferred;
396 deferred = make_expr_symbol (&chk);
397 }
398 view_assert_failed = deferred;
399 }
400 }
401
402 if (viewx.X_op != O_constant || viewx.X_add_number)
403 {
404 expressionS incv;
405
51298b33 406 if (!p->loc.u.view)
ba8826a8 407 {
51298b33
AM
408 p->loc.u.view = symbol_temp_make ();
409 gas_assert (!S_IS_DEFINED (p->loc.u.view));
ba8826a8
AO
410 }
411
412 memset (&incv, 0, sizeof (incv));
413 incv.X_unsigned = 1;
414 incv.X_op = O_symbol;
51298b33 415 incv.X_add_symbol = p->loc.u.view;
ba8826a8
AO
416 incv.X_add_number = 1;
417
418 if (viewx.X_op == O_constant)
419 {
420 gas_assert (viewx.X_add_number == 1);
421 viewx = incv;
422 }
423 else
424 {
425 viewx.X_add_symbol = make_expr_symbol (&viewx);
426 viewx.X_add_number = 0;
427 viewx.X_op_symbol = make_expr_symbol (&incv);
428 viewx.X_op = O_multiply;
429 }
430 }
431
51298b33 432 if (!S_IS_DEFINED (e->loc.u.view))
ba8826a8 433 {
51298b33
AM
434 symbol_set_value_expression (e->loc.u.view, &viewx);
435 S_SET_SEGMENT (e->loc.u.view, expr_section);
436 symbol_set_frag (e->loc.u.view, &zero_address_frag);
ba8826a8
AO
437 }
438
439 /* Define and attempt to simplify any earlier views needed to
440 compute E's. */
51298b33 441 if (h && p && p->loc.u.view && !S_IS_DEFINED (p->loc.u.view))
ba8826a8
AO
442 {
443 struct line_entry *h2;
444 /* Reverse the list to avoid quadratic behavior going backwards
445 in a single-linked list. */
446 struct line_entry *r = reverse_line_entry_list (h);
447
448 gas_assert (r == p);
449 /* Set or check views until we find a defined or absent view. */
450 do
62e6b7b3
AO
451 {
452 /* Do not define the head of a (sub?)segment view while
453 handling others. It would be defined too early, without
454 regard to the last view of other subsegments.
455 set_or_check_view will be called for every head segment
456 that needs it. */
457 if (r == h)
458 break;
459 set_or_check_view (r, r->next, NULL);
460 }
51298b33
AM
461 while (r->next
462 && r->next->loc.u.view
463 && !S_IS_DEFINED (r->next->loc.u.view)
ba8826a8
AO
464 && (r = r->next));
465
466 /* Unreverse the list, so that we can go forward again. */
467 h2 = reverse_line_entry_list (p);
468 gas_assert (h2 == h);
469
470 /* Starting from the last view we just defined, attempt to
471 simplify the view expressions, until we do so to P. */
472 do
473 {
62e6b7b3
AO
474 /* The head view of a subsegment may remain undefined while
475 handling other elements, before it is linked to the last
476 view of the previous subsegment. */
477 if (r == h)
478 continue;
51298b33
AM
479 gas_assert (S_IS_DEFINED (r->loc.u.view));
480 resolve_expression (symbol_get_value_expression (r->loc.u.view));
ba8826a8
AO
481 }
482 while (r != p && (r = r->next));
483
484 /* Now that we've defined and computed all earlier views that might
485 be needed to compute E's, attempt to simplify it. */
51298b33 486 resolve_expression (symbol_get_value_expression (e->loc.u.view));
ba8826a8
AO
487 }
488}
489
6a50d470 490/* Record an entry for LOC occurring at LABEL. */
07a53e5c
RH
491
492static void
6a50d470 493dwarf2_gen_line_info_1 (symbolS *label, struct dwarf2_line_info *loc)
07a53e5c 494{
6a50d470 495 struct line_subseg *lss;
07a53e5c 496 struct line_entry *e;
058430b4 497 flagword need_flags = SEC_LOAD | SEC_CODE;
bcb78b47 498
058430b4
AM
499 /* PR 26850: Do not record LOCs in non-executable or non-loaded
500 sections. SEC_ALLOC isn't tested for non-ELF because obj-coff.c
501 obj_coff_section is careless in setting SEC_ALLOC. */
502 if (IS_ELF)
503 need_flags |= SEC_ALLOC;
bcb78b47
NC
504 if ((now_seg->flags & need_flags) != need_flags)
505 {
058430b4 506 /* FIXME: Add code to suppress multiple warnings ? */
be07043e
AM
507 if (debug_type != DEBUG_DWARF2)
508 as_warn ("dwarf line number information for %s ignored",
509 segment_name (now_seg));
bcb78b47
NC
510 return;
511 }
07a53e5c 512
325801bd 513 e = XNEW (struct line_entry);
07a53e5c 514 e->next = NULL;
6a50d470 515 e->label = label;
07a53e5c
RH
516 e->loc = *loc;
517
5b7c81bd 518 lss = get_line_subseg (now_seg, now_subseg, true);
ba8826a8 519
62e6b7b3
AO
520 /* Subseg heads are chained to previous subsegs in
521 dwarf2_finish. */
51298b33
AM
522 if (loc->filenum != -1u && loc->u.view && lss->head)
523 set_or_check_view (e, (struct line_entry *) lss->ptail, lss->head);
ba8826a8 524
6a50d470
RS
525 *lss->ptail = e;
526 lss->ptail = &e->next;
07a53e5c
RH
527}
528
436d9e46 529/* Record an entry for LOC occurring at OFS within the current fragment. */
353e2c69 530
220e750f 531void
a2e22468 532dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
fac0d250 533{
6a50d470
RS
534 symbolS *sym;
535
220e750f 536 /* Early out for as-yet incomplete location information. */
5496f3c6
NC
537 if (loc->line == 0)
538 return;
498ff032 539 if (loc->filenum == 0)
705989f1 540 {
498ff032
AM
541 if (dwarf_level < 5)
542 dwarf_level = 5;
705989f1
L
543 if (DWARF2_LINE_VERSION < 5)
544 return;
545 }
220e750f 546
ffa554ed
GK
547 /* Don't emit sequences of line symbols for the same line when the
548 symbols apply to assembler code. It is necessary to emit
549 duplicate line symbols when a compiler asks for them, because GDB
550 uses them to determine the end of the prologue. */
51298b33
AM
551 if (debug_type == DEBUG_DWARF2)
552 {
553 static unsigned int line = -1;
554 static const char *filename = NULL;
555
556 if (line == loc->line)
557 {
558 if (filename == loc->u.filename)
559 return;
560 if (filename_cmp (filename, loc->u.filename) == 0)
561 {
562 filename = loc->u.filename;
563 return;
564 }
565 }
1ea5c325 566
51298b33
AM
567 line = loc->line;
568 filename = loc->u.filename;
569 }
1ea5c325 570
453dc3f0
NC
571 if (linkrelax)
572 {
51298b33
AM
573 static int label_num = 0;
574 char name[32];
453dc3f0
NC
575
576 /* Use a non-fake name for the line number location,
577 so that it can be referred to by relocations. */
51298b33
AM
578 sprintf (name, ".Loc.%u", label_num);
579 label_num++;
e01e1cee 580 sym = symbol_new (name, now_seg, frag_now, ofs);
453dc3f0
NC
581 }
582 else
e01e1cee 583 sym = symbol_temp_new (now_seg, frag_now, ofs);
6a50d470 584 dwarf2_gen_line_info_1 (sym, loc);
220e750f 585}
fac0d250 586
5496f3c6
NC
587static const char *
588get_basename (const char * pathname)
589{
590 const char * file;
591
592 file = lbasename (pathname);
593 /* Don't make empty string from / or A: from A:/ . */
594#ifdef HAVE_DOS_BASED_FILE_SYSTEM
595 if (file <= pathname + 3)
596 file = pathname;
597#else
598 if (file == pathname + 1)
599 file = pathname;
600#endif
601 return file;
602}
603
604static unsigned int
5b7c81bd 605get_directory_table_entry (const char *dirname,
58f3b6a3 606 const char *file0_dirname,
5b7c81bd
AM
607 size_t dirlen,
608 bool can_use_zero)
5496f3c6
NC
609{
610 unsigned int d;
611
612 if (dirlen == 0)
613 return 0;
614
615#ifndef DWARF2_DIR_SHOULD_END_WITH_SEPARATOR
616 if (IS_DIR_SEPARATOR (dirname[dirlen - 1]))
617 {
618 -- dirlen;
619 if (dirlen == 0)
620 return 0;
621 }
622#endif
623
624 for (d = 0; d < dirs_in_use; ++d)
625 {
626 if (dirs[d] != NULL
627 && filename_ncmp (dirname, dirs[d], dirlen) == 0
628 && dirs[d][dirlen] == '\0')
629 return d;
630 }
631
632 if (can_use_zero)
633 {
634 if (dirs == NULL || dirs[0] == NULL)
3417bfca 635 {
58f3b6a3 636 const char * pwd = file0_dirname ? file0_dirname : getpwd ();
3417bfca 637
51298b33 638 if (dwarf_level >= 5 && filename_cmp (dirname, pwd) != 0)
3417bfca 639 {
51298b33
AM
640 /* In DWARF-5 the 0 entry in the directory table is
641 expected to be the same as the DW_AT_comp_dir (which
642 is set to the current build directory). Since we are
643 about to create a directory entry that is not the
644 same, allocate the current directory first.
645 FIXME: Alternatively we could generate an error
646 message here. */
58f3b6a3
L
647 (void) get_directory_table_entry (pwd, NULL, strlen (pwd),
648 true);
3417bfca
NC
649 d = 1;
650 }
651 else
652 d = 0;
653 }
5496f3c6
NC
654 }
655 else if (d == 0)
656 d = 1;
657
658 if (d >= dirs_allocated)
659 {
660 unsigned int old = dirs_allocated;
3417bfca
NC
661#define DIR_TABLE_INCREMENT 32
662 dirs_allocated = d + DIR_TABLE_INCREMENT;
5496f3c6
NC
663 dirs = XRESIZEVEC (char *, dirs, dirs_allocated);
664 memset (dirs + old, 0, (dirs_allocated - old) * sizeof (char *));
665 }
666
667 dirs[d] = xmemdup0 (dirname, dirlen);
668 if (dirs_in_use <= d)
669 dirs_in_use = d + 1;
670
671 return d;
672}
673
5b7c81bd 674static bool
6915020b 675assign_file_to_slot (unsigned long i, const char *file, unsigned int dir)
714e6c96
NC
676{
677 if (i >= files_allocated)
678 {
679 unsigned int old = files_allocated;
680
681 files_allocated = i + 32;
682 /* Catch wraparound. */
683 if (files_allocated <= old)
684 {
685 as_bad (_("file number %lu is too big"), (unsigned long) i);
5b7c81bd 686 return false;
714e6c96
NC
687 }
688
689 files = XRESIZEVEC (struct file_entry, files, files_allocated);
690 memset (files + old, 0, (i + 32 - old) * sizeof (struct file_entry));
691 }
692
693 files[i].filename = file;
694 files[i].dir = dir;
714e6c96
NC
695 memset (files[i].md5, 0, NUM_MD5_BYTES);
696
697 if (files_in_use < i + 1)
698 files_in_use = i + 1;
699
5b7c81bd 700 return true;
714e6c96
NC
701}
702
5496f3c6
NC
703/* Get a .debug_line file number for PATHNAME. If there is a
704 directory component to PATHNAME, then this will be stored
705 in the directory table, if it is not already present.
706 Returns the slot number allocated to that filename or -1
707 if there was a problem. */
708
709static signed int
710allocate_filenum (const char * pathname)
711{
712 static signed int last_used = -1, last_used_dir_len = 0;
713 const char *file;
714 size_t dir_len;
715 unsigned int i, dir;
716
717 /* Short circuit the common case of adding the same pathname
718 as last time. */
719 if (last_used != -1)
720 {
721 const char * dirname = NULL;
722
723 if (dirs != NULL)
724 dirname = dirs[files[last_used].dir];
725
726 if (dirname == NULL)
727 {
728 if (filename_cmp (pathname, files[last_used].filename) == 0)
729 return last_used;
730 }
731 else
732 {
733 if (filename_ncmp (pathname, dirname, last_used_dir_len) == 0
734 && IS_DIR_SEPARATOR (pathname [last_used_dir_len])
735 && filename_cmp (pathname + last_used_dir_len + 1,
736 files[last_used].filename) == 0)
737 return last_used;
738 }
739 }
740
741 file = get_basename (pathname);
742 dir_len = file - pathname;
743
58f3b6a3 744 dir = get_directory_table_entry (pathname, NULL, dir_len, false);
5496f3c6 745
714e6c96 746 /* Do not use slot-0. That is specifically reserved for use by
5496f3c6
NC
747 the '.file 0 "name"' directive. */
748 for (i = 1; i < files_in_use; ++i)
749 if (files[i].dir == dir
750 && files[i].filename
751 && filename_cmp (file, files[i].filename) == 0)
752 {
753 last_used = i;
754 last_used_dir_len = dir_len;
755 return i;
756 }
757
6915020b 758 if (!assign_file_to_slot (i, file, dir))
714e6c96 759 return -1;
5496f3c6 760
5496f3c6
NC
761 last_used = i;
762 last_used_dir_len = dir_len;
763
764 return i;
765}
766
51298b33
AM
767/* Run through the list of line entries starting at E, allocating
768 file entries for gas generated debug. */
769
770static void
771do_allocate_filenum (struct line_entry *e)
772{
773 do
774 {
775 if (e->loc.filenum == -1u)
776 {
777 e->loc.filenum = allocate_filenum (e->loc.u.filename);
778 e->loc.u.view = NULL;
779 }
780 e = e->next;
781 }
782 while (e);
783}
784
5496f3c6
NC
785/* Allocate slot NUM in the .debug_line file table to FILENAME.
786 If DIRNAME is not NULL or there is a directory component to FILENAME
787 then this will be stored in the directory table, if not already present.
788 if WITH_MD5 is TRUE then there is a md5 value in generic_bignum.
789 Returns TRUE if allocation succeeded, FALSE otherwise. */
790
5b7c81bd
AM
791static bool
792allocate_filename_to_slot (const char *dirname,
793 const char *filename,
794 unsigned int num,
795 bool with_md5)
5496f3c6
NC
796{
797 const char *file;
798 size_t dirlen;
799 unsigned int i, d;
58f3b6a3 800 const char *file0_dirname = dirname;
5496f3c6
NC
801
802 /* Short circuit the common case of adding the same pathname
803 as last time. */
804 if (num < files_allocated && files[num].filename != NULL)
805 {
806 const char * dir = NULL;
807
80b652ef 808 if (dirs != NULL)
5496f3c6
NC
809 dir = dirs[files[num].dir];
810
811 if (with_md5
812 && memcmp (generic_bignum, files[num].md5, NUM_MD5_BYTES) != 0)
813 goto fail;
814
815 if (dirname != NULL)
816 {
817 if (dir != NULL && filename_cmp (dir, dirname) != 0)
818 goto fail;
819
820 if (filename_cmp (filename, files[num].filename) != 0)
821 goto fail;
822
823 /* If the filenames match, but the directory table entry was
824 empty, then fill it with the provided directory name. */
825 if (dir == NULL)
80b652ef
NC
826 {
827 if (dirs == NULL)
828 {
3417bfca 829 dirs_allocated = files[num].dir + DIR_TABLE_INCREMENT;
80b652ef
NC
830 dirs = XCNEWVEC (char *, dirs_allocated);
831 }
832
833 dirs[files[num].dir] = xmemdup0 (dirname, strlen (dirname));
834 }
5496f3c6 835
5b7c81bd 836 return true;
5496f3c6
NC
837 }
838 else if (dir != NULL)
839 {
840 dirlen = strlen (dir);
841 if (filename_ncmp (filename, dir, dirlen) == 0
842 && IS_DIR_SEPARATOR (filename [dirlen])
843 && filename_cmp (filename + dirlen + 1, files[num].filename) == 0)
5b7c81bd 844 return true;
5496f3c6
NC
845 }
846 else /* dir == NULL */
847 {
848 file = get_basename (filename);
849 if (filename_cmp (file, files[num].filename) == 0)
850 {
9a12b194
AM
851 /* The filenames match, but the directory table entry is empty.
852 Fill it with the provided directory name. */
5496f3c6 853 if (file > filename)
9a12b194
AM
854 {
855 if (dirs == NULL)
856 {
3417bfca 857 dirs_allocated = files[num].dir + DIR_TABLE_INCREMENT;
9a12b194
AM
858 dirs = XCNEWVEC (char *, dirs_allocated);
859 }
860
861 dirs[files[num].dir] = xmemdup0 (filename, file - filename);
862 }
5b7c81bd 863 return true;
5496f3c6
NC
864 }
865 }
866
867 fail:
bd0c565e
L
868 as_bad (_("file table slot %u is already occupied by a different file (%s%s%s vs %s%s%s)"),
869 num,
870 dir == NULL ? "" : dir,
871 dir == NULL ? "" : "/",
872 files[num].filename,
873 dirname == NULL ? "" : dirname,
874 dirname == NULL ? "" : "/",
875 filename);
5b7c81bd 876 return false;
5496f3c6
NC
877 }
878
879 if (dirname == NULL)
880 {
881 dirname = filename;
882 file = get_basename (filename);
883 dirlen = file - filename;
884 }
885 else
886 {
887 dirlen = strlen (dirname);
888 file = filename;
889 }
3417bfca 890
58f3b6a3
L
891 d = get_directory_table_entry (dirname, file0_dirname, dirlen,
892 num == 0);
5496f3c6
NC
893 i = num;
894
6915020b 895 if (! assign_file_to_slot (i, file, d))
5b7c81bd 896 return false;
5496f3c6 897
5496f3c6
NC
898 if (with_md5)
899 {
900 if (target_big_endian)
901 {
902 /* md5's are stored in litte endian format. */
903 unsigned int bits_remaining = NUM_MD5_BYTES * BITS_PER_CHAR;
904 unsigned int byte = NUM_MD5_BYTES;
905 unsigned int bignum_index = 0;
906
907 while (bits_remaining)
908 {
909 unsigned int bignum_bits_remaining = LITTLENUM_NUMBER_OF_BITS;
910 valueT bignum_value = generic_bignum [bignum_index];
911 bignum_index ++;
912
913 while (bignum_bits_remaining)
914 {
915 files[i].md5[--byte] = bignum_value & 0xff;
916 bignum_value >>= 8;
917 bignum_bits_remaining -= 8;
918 bits_remaining -= 8;
919 }
920 }
921 }
922 else
923 {
924 unsigned int bits_remaining = NUM_MD5_BYTES * BITS_PER_CHAR;
925 unsigned int byte = 0;
926 unsigned int bignum_index = 0;
927
928 while (bits_remaining)
929 {
930 unsigned int bignum_bits_remaining = LITTLENUM_NUMBER_OF_BITS;
931 valueT bignum_value = generic_bignum [bignum_index];
932
933 bignum_index ++;
934
935 while (bignum_bits_remaining)
936 {
937 files[i].md5[byte++] = bignum_value & 0xff;
938 bignum_value >>= 8;
939 bignum_bits_remaining -= 8;
940 bits_remaining -= 8;
941 }
942 }
943 }
944 }
945 else
946 memset (files[i].md5, 0, NUM_MD5_BYTES);
947
5b7c81bd 948 return true;
5496f3c6
NC
949}
950
ecea7679
RH
951/* Returns the current source information. If .file directives have
952 been encountered, the info for the corresponding source file is
953 returned. Otherwise, the info for the assembly source file is
954 returned. */
955
220e750f 956void
a2e22468 957dwarf2_where (struct dwarf2_line_info *line)
220e750f
RH
958{
959 if (debug_type == DEBUG_DWARF2)
fac0d250 960 {
51298b33
AM
961 line->u.filename = as_where (&line->line);
962 line->filenum = -1u;
220e750f 963 line->column = 0;
bd0eb99b 964 line->flags = DWARF2_FLAG_IS_STMT;
ecea7679 965 line->isa = current.isa;
92846e72 966 line->discriminator = current.discriminator;
fac0d250 967 }
220e750f
RH
968 else
969 *line = current;
fac0d250
RH
970}
971
7fd3924a 972/* A hook to allow the target backend to inform the line number state
ecea7679
RH
973 machine of isa changes when assembler debug info is enabled. */
974
975void
976dwarf2_set_isa (unsigned int isa)
977{
978 current.isa = isa;
979}
980
220e750f
RH
981/* Called for each machine instruction, or relatively atomic group of
982 machine instructions (ie built-in macro). The instruction or group
983 is SIZE bytes in length. If dwarf2 line number generation is called
984 for, emit a line statement appropriately. */
353e2c69 985
220e750f 986void
a2e22468 987dwarf2_emit_insn (int size)
fac0d250 988{
220e750f 989 struct dwarf2_line_info loc;
fac0d250 990
ba8826a8
AO
991 if (debug_type != DEBUG_DWARF2
992 ? !dwarf2_loc_directive_seen
993 : !seen_at_least_1_file ())
220e750f 994 return;
7fd3924a
AM
995
996 dwarf2_where (&loc);
b6675117 997
71250b94 998 dwarf2_gen_line_info ((frag_now_fix_octets () - size) / OCTETS_PER_BYTE, &loc);
661ba50f
BW
999 dwarf2_consume_line_info ();
1000}
1001
e410add4
RS
1002/* Move all previously-emitted line entries for the current position by
1003 DELTA bytes. This function cannot be used to move the same entries
1004 twice. */
1005
1006void
1007dwarf2_move_insn (int delta)
1008{
1009 struct line_subseg *lss;
1010 struct line_entry *e;
1011 valueT now;
1012
1013 if (delta == 0)
1014 return;
1015
5b7c81bd 1016 lss = get_line_subseg (now_seg, now_subseg, false);
e410add4
RS
1017 if (!lss)
1018 return;
1019
1020 now = frag_now_fix ();
1021 while ((e = *lss->pmove_tail))
1022 {
1023 if (S_GET_VALUE (e->label) == now)
1024 S_SET_VALUE (e->label, now + delta);
1025 lss->pmove_tail = &e->next;
1026 }
1027}
1028
661ba50f
BW
1029/* Called after the current line information has been either used with
1030 dwarf2_gen_line_info or saved with a machine instruction for later use.
1031 This resets the state of the line number information to reflect that
1032 it has been used. */
1033
1034void
1035dwarf2_consume_line_info (void)
1036{
1037 /* Unless we generate DWARF2 debugging information for each
1038 assembler line, we only emit one line symbol for one LOC. */
5b7c81bd 1039 dwarf2_loc_directive_seen = false;
bd0eb99b
RH
1040
1041 current.flags &= ~(DWARF2_FLAG_BASIC_BLOCK
1042 | DWARF2_FLAG_PROLOGUE_END
1043 | DWARF2_FLAG_EPILOGUE_BEGIN);
92846e72 1044 current.discriminator = 0;
51298b33 1045 current.u.view = NULL;
220e750f 1046}
fac0d250 1047
07a53e5c
RH
1048/* Called for each (preferably code) label. If dwarf2_loc_mark_labels
1049 is enabled, emit a basic block marker. */
1050
1051void
1052dwarf2_emit_label (symbolS *label)
1053{
1054 struct dwarf2_line_info loc;
1055
1056 if (!dwarf2_loc_mark_labels)
1057 return;
1058 if (S_GET_SEGMENT (label) != now_seg)
1059 return;
fd361982 1060 if (!(bfd_section_flags (now_seg) & SEC_CODE))
07a53e5c 1061 return;
7fd3924a
AM
1062 if (files_in_use == 0 && debug_type != DEBUG_DWARF2)
1063 return;
1064
1065 dwarf2_where (&loc);
07a53e5c
RH
1066
1067 loc.flags |= DWARF2_FLAG_BASIC_BLOCK;
1068
6a50d470 1069 dwarf2_gen_line_info_1 (label, &loc);
7fd3924a 1070 dwarf2_consume_line_info ();
07a53e5c
RH
1071}
1072
ecb4347a
DJ
1073/* Handle two forms of .file directive:
1074 - Pass .file "source.c" to s_app_file
1075 - Handle .file 1 "source.c" by adding an entry to the DWARF-2 file table
220e750f 1076
68d20676 1077 If an entry is added to the file table, return a pointer to the filename. */
ecb4347a
DJ
1078
1079char *
68d20676 1080dwarf2_directive_filename (void)
220e750f 1081{
5b7c81bd 1082 bool with_md5 = false;
8f02ae5b 1083 valueT num;
e46d99eb 1084 char *filename;
5496f3c6 1085 const char * dirname = NULL;
220e750f
RH
1086 int filename_len;
1087
1088 /* Continue to accept a bare string and pass it off. */
1089 SKIP_WHITESPACE ();
1090 if (*input_line_pointer == '"')
fac0d250 1091 {
220e750f 1092 s_app_file (0);
ecb4347a 1093 return NULL;
fac0d250
RH
1094 }
1095
220e750f 1096 num = get_absolute_expression ();
220e750f 1097
498ff032 1098 if ((offsetT) num < 1)
fac0d250 1099 {
498ff032
AM
1100 if (num == 0 && dwarf_level < 5)
1101 dwarf_level = 5;
1102 if ((offsetT) num < 0 || DWARF2_LINE_VERSION < 5)
705989f1
L
1103 {
1104 as_bad (_("file number less than one"));
1105 ignore_rest_of_line ();
1106 return NULL;
1107 }
fac0d250
RH
1108 }
1109
5496f3c6
NC
1110 /* FIXME: Should we allow ".file <N>\n" as an expression meaning
1111 "switch back to the already allocated file <N> as the current
1112 file" ? */
84d9ab33
NC
1113
1114 filename = demand_copy_C_string (&filename_len);
1115 if (filename == NULL)
1116 /* demand_copy_C_string will have already generated an error message. */
1117 return NULL;
1118
5496f3c6
NC
1119 /* For DWARF-5 support we also accept:
1120 .file <NUM> ["<dir>"] "<file>" [md5 <NUM>] */
1121 if (DWARF2_LINE_VERSION > 4)
1122 {
1123 SKIP_WHITESPACE ();
1124 if (*input_line_pointer == '"')
1125 {
1126 dirname = filename;
1127 filename = demand_copy_C_string (&filename_len);
1128 SKIP_WHITESPACE ();
1129 }
1130
d34049e8 1131 if (startswith (input_line_pointer, "md5"))
5496f3c6
NC
1132 {
1133 input_line_pointer += 3;
1134 SKIP_WHITESPACE ();
1135
1136 expressionS exp;
1137 expression_and_evaluate (& exp);
1138 if (exp.X_op != O_big)
1139 as_bad (_("md5 value too small or not a constant"));
1140 else
5b7c81bd 1141 with_md5 = true;
5496f3c6
NC
1142 }
1143 }
1144
84d9ab33
NC
1145 demand_empty_rest_of_line ();
1146
7cadeb2c
AM
1147 /* A .file directive implies compiler generated debug information is
1148 being supplied. Turn off gas generated debug info. */
1149 debug_type = DEBUG_NONE;
1150
8f02ae5b
AM
1151 if (num != (unsigned int) num
1152 || num >= (size_t) -1 / sizeof (struct file_entry) - 32)
220e750f 1153 {
8f02ae5b 1154 as_bad (_("file number %lu is too big"), (unsigned long) num);
ecb4347a 1155 return NULL;
249e3833 1156 }
220e750f 1157
5496f3c6
NC
1158 if (! allocate_filename_to_slot (dirname, filename, (unsigned int) num,
1159 with_md5))
1160 return NULL;
ecb4347a
DJ
1161
1162 return filename;
fac0d250
RH
1163}
1164
68d20676
NC
1165/* Calls dwarf2_directive_filename, but discards its result.
1166 Used in pseudo-op tables where the function result is ignored. */
1167
1168void
1169dwarf2_directive_file (int dummy ATTRIBUTE_UNUSED)
1170{
1171 (void) dwarf2_directive_filename ();
1172}
1173
220e750f 1174void
a2e22468 1175dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
220e750f 1176{
ecea7679
RH
1177 offsetT filenum, line;
1178
851feff8
DJ
1179 /* If we see two .loc directives in a row, force the first one to be
1180 output now. */
7cadeb2c 1181 if (dwarf2_loc_directive_seen)
6a50d470 1182 dwarf2_emit_insn (0);
851feff8 1183
ecea7679
RH
1184 filenum = get_absolute_expression ();
1185 SKIP_WHITESPACE ();
1186 line = get_absolute_expression ();
1187
1188 if (filenum < 1)
1189 {
498ff032
AM
1190 if (filenum == 0 && dwarf_level < 5)
1191 dwarf_level = 5;
1192 if (filenum < 0 || DWARF2_LINE_VERSION < 5)
5496f3c6 1193 {
498ff032
AM
1194 as_bad (_("file number less than one"));
1195 return;
5496f3c6 1196 }
ecea7679 1197 }
5496f3c6 1198
498ff032 1199 if ((valueT) filenum >= files_in_use || files[filenum].filename == NULL)
ecea7679
RH
1200 {
1201 as_bad (_("unassigned file number %ld"), (long) filenum);
1202 return;
1203 }
1204
51298b33
AM
1205 /* debug_type will be turned off by dwarf2_directive_filename, and
1206 if we don't have a dwarf style .file then files_in_use will be
1207 zero and the above error will trigger. */
1208 gas_assert (debug_type == DEBUG_NONE);
1209
ecea7679
RH
1210 current.filenum = filenum;
1211 current.line = line;
92846e72 1212 current.discriminator = 0;
ecea7679
RH
1213
1214#ifndef NO_LISTING
1215 if (listing)
1216 {
1217 if (files[filenum].dir)
1218 {
1219 size_t dir_len = strlen (dirs[files[filenum].dir]);
1220 size_t file_len = strlen (files[filenum].filename);
add39d23 1221 char *cp = XNEWVEC (char, dir_len + 1 + file_len + 1);
ecea7679
RH
1222
1223 memcpy (cp, dirs[files[filenum].dir], dir_len);
56487c55 1224 INSERT_DIR_SEPARATOR (cp, dir_len);
ecea7679
RH
1225 memcpy (cp + dir_len + 1, files[filenum].filename, file_len);
1226 cp[dir_len + file_len + 1] = '\0';
1227 listing_source_file (cp);
e1fa0163 1228 free (cp);
ecea7679
RH
1229 }
1230 else
1231 listing_source_file (files[filenum].filename);
1232 listing_source_line (line);
1233 }
1234#endif
1235
220e750f 1236 SKIP_WHITESPACE ();
ecea7679
RH
1237 if (ISDIGIT (*input_line_pointer))
1238 {
1239 current.column = get_absolute_expression ();
1240 SKIP_WHITESPACE ();
1241 }
1242
1243 while (ISALPHA (*input_line_pointer))
220e750f 1244 {
bd0eb99b
RH
1245 char *p, c;
1246 offsetT value;
1247
d02603dc 1248 c = get_symbol_name (& p);
bd0eb99b
RH
1249
1250 if (strcmp (p, "basic_block") == 0)
1251 {
1252 current.flags |= DWARF2_FLAG_BASIC_BLOCK;
1253 *input_line_pointer = c;
1254 }
1255 else if (strcmp (p, "prologue_end") == 0)
1256 {
1257 current.flags |= DWARF2_FLAG_PROLOGUE_END;
1258 *input_line_pointer = c;
1259 }
1260 else if (strcmp (p, "epilogue_begin") == 0)
1261 {
1262 current.flags |= DWARF2_FLAG_EPILOGUE_BEGIN;
1263 *input_line_pointer = c;
1264 }
1265 else if (strcmp (p, "is_stmt") == 0)
1266 {
d02603dc 1267 (void) restore_line_pointer (c);
bd0eb99b
RH
1268 value = get_absolute_expression ();
1269 if (value == 0)
1270 current.flags &= ~DWARF2_FLAG_IS_STMT;
1271 else if (value == 1)
1272 current.flags |= DWARF2_FLAG_IS_STMT;
1273 else
ecea7679
RH
1274 {
1275 as_bad (_("is_stmt value not 0 or 1"));
1276 return;
1277 }
bd0eb99b
RH
1278 }
1279 else if (strcmp (p, "isa") == 0)
1280 {
d02603dc 1281 (void) restore_line_pointer (c);
bd0eb99b 1282 value = get_absolute_expression ();
ecea7679 1283 if (value >= 0)
bd0eb99b 1284 current.isa = value;
ecea7679
RH
1285 else
1286 {
1287 as_bad (_("isa number less than zero"));
1288 return;
1289 }
bd0eb99b 1290 }
92846e72
CC
1291 else if (strcmp (p, "discriminator") == 0)
1292 {
d02603dc 1293 (void) restore_line_pointer (c);
92846e72
CC
1294 value = get_absolute_expression ();
1295 if (value >= 0)
1296 current.discriminator = value;
1297 else
1298 {
1299 as_bad (_("discriminator less than zero"));
1300 return;
1301 }
1302 }
ba8826a8
AO
1303 else if (strcmp (p, "view") == 0)
1304 {
1305 symbolS *sym;
1306
1307 (void) restore_line_pointer (c);
1308 SKIP_WHITESPACE ();
1309
1310 if (ISDIGIT (*input_line_pointer)
1311 || *input_line_pointer == '-')
1312 {
5b7c81bd 1313 bool force_reset = *input_line_pointer == '-';
ba8826a8
AO
1314
1315 value = get_absolute_expression ();
1316 if (value != 0)
1317 {
1318 as_bad (_("numeric view can only be asserted to zero"));
1319 return;
1320 }
1321 if (force_reset && force_reset_view)
1322 sym = force_reset_view;
1323 else
1324 {
e01e1cee
AM
1325 sym = symbol_temp_new (absolute_section, &zero_address_frag,
1326 value);
ba8826a8
AO
1327 if (force_reset)
1328 force_reset_view = sym;
1329 }
1330 }
1331 else
1332 {
1333 char *name = read_symbol_name ();
1334
1335 if (!name)
1336 return;
1337 sym = symbol_find_or_make (name);
38cf168b 1338 if (S_IS_DEFINED (sym) || symbol_equated_p (sym))
ba8826a8 1339 {
38cf168b 1340 if (S_IS_VOLATILE (sym))
ba8826a8 1341 sym = symbol_clone (sym, 1);
38cf168b
AM
1342 else if (!S_CAN_BE_REDEFINED (sym))
1343 {
1344 as_bad (_("symbol `%s' is already defined"), name);
1345 return;
1346 }
ba8826a8 1347 }
38cf168b
AM
1348 S_SET_SEGMENT (sym, undefined_section);
1349 S_SET_VALUE (sym, 0);
1350 symbol_set_frag (sym, &zero_address_frag);
ba8826a8 1351 }
51298b33 1352 current.u.view = sym;
ba8826a8 1353 }
bd0eb99b
RH
1354 else
1355 {
ecea7679 1356 as_bad (_("unknown .loc sub-directive `%s'"), p);
d02603dc 1357 (void) restore_line_pointer (c);
bd0eb99b
RH
1358 return;
1359 }
1360
d02603dc 1361 SKIP_WHITESPACE_AFTER_NAME ();
bd0eb99b
RH
1362 }
1363
1364 demand_empty_rest_of_line ();
5b7c81bd 1365 dwarf2_any_loc_directive_seen = dwarf2_loc_directive_seen = true;
ba8826a8
AO
1366
1367 /* If we were given a view id, emit the row right away. */
51298b33 1368 if (current.u.view)
ba8826a8 1369 dwarf2_emit_insn (0);
220e750f 1370}
07a53e5c
RH
1371
1372void
1373dwarf2_directive_loc_mark_labels (int dummy ATTRIBUTE_UNUSED)
1374{
1375 offsetT value = get_absolute_expression ();
1376
1377 if (value != 0 && value != 1)
1378 {
1379 as_bad (_("expected 0 or 1"));
1380 ignore_rest_of_line ();
1381 }
1382 else
1383 {
1384 dwarf2_loc_mark_labels = value != 0;
1385 demand_empty_rest_of_line ();
1386 }
1387}
220e750f
RH
1388\f
1389static struct frag *
a2e22468 1390first_frag_for_seg (segT seg)
220e750f 1391{
c9049d30 1392 return seg_info (seg)->frchainP->frch_root;
220e750f
RH
1393}
1394
1395static struct frag *
a2e22468 1396last_frag_for_seg (segT seg)
220e750f 1397{
c9049d30 1398 frchainS *f = seg_info (seg)->frchainP;
220e750f 1399
c9049d30
AM
1400 while (f->frch_next != NULL)
1401 f = f->frch_next;
220e750f 1402
c9049d30 1403 return f->frch_last;
220e750f
RH
1404}
1405\f
1406/* Emit a single byte into the current segment. */
1407
1408static inline void
a2e22468 1409out_byte (int byte)
220e750f
RH
1410{
1411 FRAG_APPEND_1_CHAR (byte);
1412}
1413
1414/* Emit a statement program opcode into the current segment. */
1415
1416static inline void
a2e22468 1417out_opcode (int opc)
220e750f
RH
1418{
1419 out_byte (opc);
1420}
1421
1422/* Emit a two-byte word into the current segment. */
1423
1424static inline void
a2e22468 1425out_two (int data)
220e750f
RH
1426{
1427 md_number_to_chars (frag_more (2), data, 2);
1428}
1429
1430/* Emit a four byte word into the current segment. */
1431
1432static inline void
a2e22468 1433out_four (int data)
220e750f
RH
1434{
1435 md_number_to_chars (frag_more (4), data, 4);
1436}
1437
1438/* Emit an unsigned "little-endian base 128" number. */
1439
fac0d250 1440static void
a2e22468 1441out_uleb128 (addressT value)
220e750f
RH
1442{
1443 output_leb128 (frag_more (sizeof_leb128 (value, 0)), value, 0);
1444}
1445
92846e72
CC
1446/* Emit a signed "little-endian base 128" number. */
1447
1448static void
1449out_leb128 (addressT value)
1450{
1451 output_leb128 (frag_more (sizeof_leb128 (value, 1)), value, 1);
1452}
1453
220e750f
RH
1454/* Emit a tuple for .debug_abbrev. */
1455
1456static inline void
a2e22468 1457out_abbrev (int name, int form)
fac0d250 1458{
220e750f
RH
1459 out_uleb128 (name);
1460 out_uleb128 (form);
1461}
fac0d250 1462
220e750f 1463/* Get the size of a fragment. */
fac0d250 1464
220e750f 1465static offsetT
c9049d30 1466get_frag_fix (fragS *frag, segT seg)
220e750f
RH
1467{
1468 frchainS *fr;
1469
1470 if (frag->fr_next)
1471 return frag->fr_fix;
1472
1473 /* If a fragment is the last in the chain, special measures must be
1474 taken to find its size before relaxation, since it may be pending
1475 on some subsegment chain. */
c9049d30 1476 for (fr = seg_info (seg)->frchainP; fr; fr = fr->frch_next)
220e750f 1477 if (fr->frch_last == frag)
c5c0a210 1478 return (char *) obstack_next_free (&fr->frch_obstack) - frag->fr_literal;
220e750f
RH
1479
1480 abort ();
1481}
fac0d250 1482
220e750f 1483/* Set an absolute address (may result in a relocation entry). */
fac0d250 1484
220e750f 1485static void
07a53e5c 1486out_set_addr (symbolS *sym)
220e750f 1487{
91d6fa6a 1488 expressionS exp;
9e3af0e7 1489
031e3350 1490 memset (&exp, 0, sizeof exp);
e2b9a97e
CE
1491 out_opcode (DW_LNS_extended_op);
1492 out_uleb128 (sizeof_address + 1);
fac0d250 1493
e2b9a97e 1494 out_opcode (DW_LNE_set_address);
91d6fa6a
NC
1495 exp.X_op = O_symbol;
1496 exp.X_add_symbol = sym;
1497 exp.X_add_number = 0;
1498 emit_expr (&exp, sizeof_address);
fac0d250
RH
1499}
1500
a2e22468 1501static void scale_addr_delta (addressT *);
c8970b4b 1502
a3b75434 1503static void
d7342424 1504scale_addr_delta (addressT *addr_delta)
a3b75434
DD
1505{
1506 static int printed_this = 0;
8fbf7334 1507 if (DWARF2_LINE_MIN_INSN_LENGTH > 1)
a3b75434 1508 {
8fbf7334 1509 if (*addr_delta % DWARF2_LINE_MIN_INSN_LENGTH != 0 && !printed_this)
8f02ae5b 1510 {
8fbf7334 1511 as_bad("unaligned opcodes detected in executable segment");
8f02ae5b
AM
1512 printed_this = 1;
1513 }
8fbf7334 1514 *addr_delta /= DWARF2_LINE_MIN_INSN_LENGTH;
a3b75434 1515 }
a3b75434 1516}
a3b75434 1517
220e750f
RH
1518/* Encode a pair of line and address skips as efficiently as possible.
1519 Note that the line skip is signed, whereas the address skip is unsigned.
353e2c69 1520
220e750f
RH
1521 The following two routines *must* be kept in sync. This is
1522 enforced by making emit_inc_line_addr abort if we do not emit
1523 exactly the expected number of bytes. */
1524
1525static int
a2e22468 1526size_inc_line_addr (int line_delta, addressT addr_delta)
fac0d250 1527{
220e750f
RH
1528 unsigned int tmp, opcode;
1529 int len = 0;
fac0d250 1530
220e750f 1531 /* Scale the address delta by the minimum instruction length. */
a3b75434 1532 scale_addr_delta (&addr_delta);
220e750f
RH
1533
1534 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
1535 We cannot use special opcodes here, since we want the end_sequence
1536 to emit the matrix entry. */
1537 if (line_delta == INT_MAX)
fac0d250 1538 {
220e750f
RH
1539 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
1540 len = 1;
62e6b7b3 1541 else if (addr_delta)
220e750f
RH
1542 len = 1 + sizeof_leb128 (addr_delta, 0);
1543 return len + 3;
fac0d250 1544 }
fac0d250 1545
220e750f
RH
1546 /* Bias the line delta by the base. */
1547 tmp = line_delta - DWARF2_LINE_BASE;
fac0d250 1548
220e750f
RH
1549 /* If the line increment is out of range of a special opcode, we
1550 must encode it with DW_LNS_advance_line. */
1551 if (tmp >= DWARF2_LINE_RANGE)
1552 {
1553 len = 1 + sizeof_leb128 (line_delta, 1);
1554 line_delta = 0;
1555 tmp = 0 - DWARF2_LINE_BASE;
1556 }
fac0d250 1557
220e750f
RH
1558 /* Bias the opcode by the special opcode base. */
1559 tmp += DWARF2_LINE_OPCODE_BASE;
353e2c69 1560
220e750f
RH
1561 /* Avoid overflow when addr_delta is large. */
1562 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
1563 {
1564 /* Try using a special opcode. */
1565 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1566 if (opcode <= 255)
1567 return len + 1;
1568
1569 /* Try using DW_LNS_const_add_pc followed by special op. */
1570 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1571 if (opcode <= 255)
1572 return len + 2;
1573 }
1574
1575 /* Otherwise use DW_LNS_advance_pc. */
1576 len += 1 + sizeof_leb128 (addr_delta, 0);
1577
1578 /* DW_LNS_copy or special opcode. */
1579 len += 1;
1580
1581 return len;
1582}
fac0d250 1583
220e750f 1584static void
a2e22468 1585emit_inc_line_addr (int line_delta, addressT addr_delta, char *p, int len)
220e750f
RH
1586{
1587 unsigned int tmp, opcode;
1588 int need_copy = 0;
1589 char *end = p + len;
fac0d250 1590
07a53e5c
RH
1591 /* Line number sequences cannot go backward in addresses. This means
1592 we've incorrectly ordered the statements in the sequence. */
9c2799c2 1593 gas_assert ((offsetT) addr_delta >= 0);
07a53e5c 1594
220e750f 1595 /* Scale the address delta by the minimum instruction length. */
a3b75434
DD
1596 scale_addr_delta (&addr_delta);
1597
220e750f
RH
1598 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence.
1599 We cannot use special opcodes here, since we want the end_sequence
1600 to emit the matrix entry. */
1601 if (line_delta == INT_MAX)
fac0d250 1602 {
220e750f
RH
1603 if (addr_delta == MAX_SPECIAL_ADDR_DELTA)
1604 *p++ = DW_LNS_const_add_pc;
62e6b7b3 1605 else if (addr_delta)
fac0d250 1606 {
220e750f
RH
1607 *p++ = DW_LNS_advance_pc;
1608 p += output_leb128 (p, addr_delta, 0);
fac0d250 1609 }
220e750f
RH
1610
1611 *p++ = DW_LNS_extended_op;
1612 *p++ = 1;
1613 *p++ = DW_LNE_end_sequence;
1614 goto done;
fac0d250
RH
1615 }
1616
220e750f
RH
1617 /* Bias the line delta by the base. */
1618 tmp = line_delta - DWARF2_LINE_BASE;
1619
1620 /* If the line increment is out of range of a special opcode, we
1621 must encode it with DW_LNS_advance_line. */
1622 if (tmp >= DWARF2_LINE_RANGE)
fac0d250 1623 {
220e750f
RH
1624 *p++ = DW_LNS_advance_line;
1625 p += output_leb128 (p, line_delta, 1);
fac0d250 1626
220e750f
RH
1627 line_delta = 0;
1628 tmp = 0 - DWARF2_LINE_BASE;
1629 need_copy = 1;
1630 }
fac0d250 1631
bd0eb99b
RH
1632 /* Prettier, I think, to use DW_LNS_copy instead of a "line +0, addr +0"
1633 special opcode. */
1634 if (line_delta == 0 && addr_delta == 0)
1635 {
1636 *p++ = DW_LNS_copy;
1637 goto done;
1638 }
1639
220e750f
RH
1640 /* Bias the opcode by the special opcode base. */
1641 tmp += DWARF2_LINE_OPCODE_BASE;
fac0d250 1642
220e750f
RH
1643 /* Avoid overflow when addr_delta is large. */
1644 if (addr_delta < 256 + MAX_SPECIAL_ADDR_DELTA)
fac0d250 1645 {
220e750f
RH
1646 /* Try using a special opcode. */
1647 opcode = tmp + addr_delta * DWARF2_LINE_RANGE;
1648 if (opcode <= 255)
1649 {
1650 *p++ = opcode;
1651 goto done;
1652 }
1653
1654 /* Try using DW_LNS_const_add_pc followed by special op. */
1655 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA) * DWARF2_LINE_RANGE;
1656 if (opcode <= 255)
fac0d250 1657 {
220e750f
RH
1658 *p++ = DW_LNS_const_add_pc;
1659 *p++ = opcode;
1660 goto done;
fac0d250
RH
1661 }
1662 }
220e750f
RH
1663
1664 /* Otherwise use DW_LNS_advance_pc. */
1665 *p++ = DW_LNS_advance_pc;
1666 p += output_leb128 (p, addr_delta, 0);
1667
1668 if (need_copy)
1669 *p++ = DW_LNS_copy;
fac0d250 1670 else
220e750f 1671 *p++ = tmp;
fac0d250 1672
220e750f 1673 done:
9c2799c2 1674 gas_assert (p == end);
220e750f 1675}
a8316fe2 1676
220e750f 1677/* Handy routine to combine calls to the above two routines. */
e1c05f12 1678
220e750f 1679static void
a2e22468 1680out_inc_line_addr (int line_delta, addressT addr_delta)
220e750f
RH
1681{
1682 int len = size_inc_line_addr (line_delta, addr_delta);
1683 emit_inc_line_addr (line_delta, addr_delta, frag_more (len), len);
1684}
9de8d8f1 1685
1737851b
BW
1686/* Write out an alternative form of line and address skips using
1687 DW_LNS_fixed_advance_pc opcodes. This uses more space than the default
7ddd14de
BW
1688 line and address information, but it is required if linker relaxation
1689 could change the code offsets. The following two routines *must* be
1690 kept in sync. */
453dc3f0 1691#define ADDR_DELTA_LIMIT 50000
1737851b 1692
7ddd14de
BW
1693static int
1694size_fixed_inc_line_addr (int line_delta, addressT addr_delta)
1737851b 1695{
7ddd14de 1696 int len = 0;
1737851b
BW
1697
1698 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence. */
7ddd14de
BW
1699 if (line_delta != INT_MAX)
1700 len = 1 + sizeof_leb128 (line_delta, 1);
1701
453dc3f0 1702 if (addr_delta > ADDR_DELTA_LIMIT)
7ddd14de
BW
1703 {
1704 /* DW_LNS_extended_op */
1705 len += 1 + sizeof_leb128 (sizeof_address + 1, 0);
1706 /* DW_LNE_set_address */
1707 len += 1 + sizeof_address;
1708 }
1709 else
1710 /* DW_LNS_fixed_advance_pc */
1711 len += 3;
1712
1737851b 1713 if (line_delta == INT_MAX)
7ddd14de
BW
1714 /* DW_LNS_extended_op + DW_LNE_end_sequence */
1715 len += 3;
1716 else
1717 /* DW_LNS_copy */
1718 len += 1;
1719
1720 return len;
1721}
1722
1723static void
1724emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
1725 char *p, int len)
1726{
91d6fa6a 1727 expressionS *pexp;
7ddd14de
BW
1728 char *end = p + len;
1729
1730 /* Line number sequences cannot go backward in addresses. This means
1731 we've incorrectly ordered the statements in the sequence. */
9c2799c2 1732 gas_assert ((offsetT) addr_delta >= 0);
7ddd14de 1733
b40bf0a2
NC
1734 /* Verify that we have kept in sync with size_fixed_inc_line_addr. */
1735 gas_assert (len == size_fixed_inc_line_addr (line_delta, addr_delta));
1736
7ddd14de
BW
1737 /* INT_MAX is a signal that this is actually a DW_LNE_end_sequence. */
1738 if (line_delta != INT_MAX)
1739 {
1740 *p++ = DW_LNS_advance_line;
1741 p += output_leb128 (p, line_delta, 1);
1742 }
1743
91d6fa6a 1744 pexp = symbol_get_value_expression (frag->fr_symbol);
7ddd14de
BW
1745
1746 /* The DW_LNS_fixed_advance_pc opcode has a 2-byte operand so it can
1747 advance the address by at most 64K. Linker relaxation (without
1748 which this function would not be used) could change the operand by
1749 an unknown amount. If the address increment is getting close to
1750 the limit, just reset the address. */
453dc3f0 1751 if (addr_delta > ADDR_DELTA_LIMIT)
1737851b 1752 {
7ddd14de 1753 symbolS *to_sym;
91d6fa6a 1754 expressionS exp;
7ddd14de 1755
031e3350 1756 memset (&exp, 0, sizeof exp);
9f6db0d3 1757 gas_assert (pexp->X_op == O_subtract);
91d6fa6a 1758 to_sym = pexp->X_add_symbol;
7ddd14de
BW
1759
1760 *p++ = DW_LNS_extended_op;
1761 p += output_leb128 (p, sizeof_address + 1, 0);
1762 *p++ = DW_LNE_set_address;
91d6fa6a
NC
1763 exp.X_op = O_symbol;
1764 exp.X_add_symbol = to_sym;
1765 exp.X_add_number = 0;
62ebcb5c 1766 emit_expr_fix (&exp, sizeof_address, frag, p, TC_PARSE_CONS_RETURN_NONE);
7ddd14de
BW
1767 p += sizeof_address;
1768 }
1769 else
1770 {
1771 *p++ = DW_LNS_fixed_advance_pc;
62ebcb5c 1772 emit_expr_fix (pexp, 2, frag, p, TC_PARSE_CONS_RETURN_NONE);
7ddd14de 1773 p += 2;
1737851b
BW
1774 }
1775
7ddd14de
BW
1776 if (line_delta == INT_MAX)
1777 {
1778 *p++ = DW_LNS_extended_op;
1779 *p++ = 1;
1780 *p++ = DW_LNE_end_sequence;
1781 }
1782 else
1783 *p++ = DW_LNS_copy;
1737851b 1784
9c2799c2 1785 gas_assert (p == end);
1737851b
BW
1786}
1787
220e750f
RH
1788/* Generate a variant frag that we can use to relax address/line
1789 increments between fragments of the target segment. */
9e3af0e7 1790
220e750f 1791static void
07a53e5c 1792relax_inc_line_addr (int line_delta, symbolS *to_sym, symbolS *from_sym)
220e750f 1793{
91d6fa6a 1794 expressionS exp;
220e750f 1795 int max_chars;
6576f0b5 1796
031e3350 1797 memset (&exp, 0, sizeof exp);
91d6fa6a
NC
1798 exp.X_op = O_subtract;
1799 exp.X_add_symbol = to_sym;
1800 exp.X_op_symbol = from_sym;
1801 exp.X_add_number = 0;
fac0d250 1802
220e750f
RH
1803 /* The maximum size of the frag is the line delta with a maximum
1804 sized address delta. */
7ddd14de
BW
1805 if (DWARF2_USE_FIXED_ADVANCE_PC)
1806 max_chars = size_fixed_inc_line_addr (line_delta,
1807 -DWARF2_LINE_MIN_INSN_LENGTH);
1808 else
1809 max_chars = size_inc_line_addr (line_delta, -DWARF2_LINE_MIN_INSN_LENGTH);
fac0d250 1810
220e750f 1811 frag_var (rs_dwarf2dbg, max_chars, max_chars, 1,
91d6fa6a 1812 make_expr_symbol (&exp), line_delta, NULL);
220e750f 1813}
fac0d250 1814
220e750f
RH
1815/* The function estimates the size of a rs_dwarf2dbg variant frag
1816 based on the current values of the symbols. It is called before
1817 the relaxation loop. We set fr_subtype to the expected length. */
fac0d250 1818
220e750f 1819int
a2e22468 1820dwarf2dbg_estimate_size_before_relax (fragS *frag)
220e750f
RH
1821{
1822 offsetT addr_delta;
1823 int size;
fac0d250 1824
6386f3a7 1825 addr_delta = resolve_symbol_value (frag->fr_symbol);
7ddd14de
BW
1826 if (DWARF2_USE_FIXED_ADVANCE_PC)
1827 size = size_fixed_inc_line_addr (frag->fr_offset, addr_delta);
1828 else
1829 size = size_inc_line_addr (frag->fr_offset, addr_delta);
fac0d250 1830
220e750f 1831 frag->fr_subtype = size;
fac0d250 1832
220e750f
RH
1833 return size;
1834}
1835
1836/* This function relaxes a rs_dwarf2dbg variant frag based on the
1837 current values of the symbols. fr_subtype is the current length
1838 of the frag. This returns the change in frag length. */
1839
1840int
a2e22468 1841dwarf2dbg_relax_frag (fragS *frag)
220e750f
RH
1842{
1843 int old_size, new_size;
fac0d250 1844
220e750f
RH
1845 old_size = frag->fr_subtype;
1846 new_size = dwarf2dbg_estimate_size_before_relax (frag);
ee515fb7 1847
220e750f 1848 return new_size - old_size;
fac0d250
RH
1849}
1850
220e750f
RH
1851/* This function converts a rs_dwarf2dbg variant frag into a normal
1852 fill frag. This is called after all relaxation has been done.
1853 fr_subtype will be the desired length of the frag. */
1854
1855void
a2e22468 1856dwarf2dbg_convert_frag (fragS *frag)
fac0d250 1857{
220e750f
RH
1858 offsetT addr_diff;
1859
453dc3f0
NC
1860 if (DWARF2_USE_FIXED_ADVANCE_PC)
1861 {
2b0f3761 1862 /* If linker relaxation is enabled then the distance between the two
453dc3f0
NC
1863 symbols in the frag->fr_symbol expression might change. Hence we
1864 cannot rely upon the value computed by resolve_symbol_value.
1865 Instead we leave the expression unfinalized and allow
1866 emit_fixed_inc_line_addr to create a fixup (which later becomes a
1867 relocation) that will allow the linker to correctly compute the
1868 actual address difference. We have to use a fixed line advance for
1869 this as we cannot (easily) relocate leb128 encoded values. */
1870 int saved_finalize_syms = finalize_syms;
1871
1872 finalize_syms = 0;
1873 addr_diff = resolve_symbol_value (frag->fr_symbol);
1874 finalize_syms = saved_finalize_syms;
1875 }
1876 else
1877 addr_diff = resolve_symbol_value (frag->fr_symbol);
fac0d250 1878
220e750f
RH
1879 /* fr_var carries the max_chars that we created the fragment with.
1880 fr_subtype carries the current expected length. We must, of
1881 course, have allocated enough memory earlier. */
9c2799c2 1882 gas_assert (frag->fr_var >= (int) frag->fr_subtype);
fac0d250 1883
7ddd14de
BW
1884 if (DWARF2_USE_FIXED_ADVANCE_PC)
1885 emit_fixed_inc_line_addr (frag->fr_offset, addr_diff, frag,
1886 frag->fr_literal + frag->fr_fix,
1887 frag->fr_subtype);
1888 else
1889 emit_inc_line_addr (frag->fr_offset, addr_diff,
1890 frag->fr_literal + frag->fr_fix, frag->fr_subtype);
220e750f
RH
1891
1892 frag->fr_fix += frag->fr_subtype;
1893 frag->fr_type = rs_fill;
1894 frag->fr_var = 0;
1895 frag->fr_offset = 0;
1896}
1897
1898/* Generate .debug_line content for the chain of line number entries
1899 beginning at E, for segment SEG. */
1900
1901static void
a2e22468 1902process_entries (segT seg, struct line_entry *e)
220e750f
RH
1903{
1904 unsigned filenum = 1;
1905 unsigned line = 1;
1906 unsigned column = 0;
bd0eb99b
RH
1907 unsigned isa = 0;
1908 unsigned flags = DWARF2_LINE_DEFAULT_IS_STMT ? DWARF2_FLAG_IS_STMT : 0;
07a53e5c
RH
1909 fragS *last_frag = NULL, *frag;
1910 addressT last_frag_ofs = 0, frag_ofs;
fead5cd9 1911 symbolS *last_lab = NULL, *lab;
220e750f
RH
1912 struct line_entry *next;
1913
b40bf0a2
NC
1914 if (flag_dwarf_sections)
1915 {
1916 char * name;
1917 const char * sec_name;
1918
2b0f3761 1919 /* Switch to the relevant sub-section before we start to emit
b40bf0a2
NC
1920 the line number table.
1921
1922 FIXME: These sub-sections do not have a normal Line Number
1923 Program Header, thus strictly speaking they are not valid
1924 DWARF sections. Unfortunately the DWARF standard assumes
1925 a one-to-one relationship between compilation units and
1926 line number tables. Thus we have to have a .debug_line
1927 section, as well as our sub-sections, and we have to ensure
1928 that all of the sub-sections are merged into a proper
1929 .debug_line section before a debugger sees them. */
3739860c 1930
fd361982 1931 sec_name = bfd_section_name (seg);
b40bf0a2
NC
1932 if (strcmp (sec_name, ".text") != 0)
1933 {
29a2809e 1934 name = concat (".debug_line", sec_name, (char *) NULL);
5b7c81bd 1935 subseg_set (subseg_get (name, false), 0);
b40bf0a2
NC
1936 }
1937 else
1938 /* Don't create a .debug_line.text section -
1939 that is redundant. Instead just switch back to the
1940 normal .debug_line section. */
5b7c81bd 1941 subseg_set (subseg_get (".debug_line", false), 0);
b40bf0a2
NC
1942 }
1943
fead5cd9 1944 do
fac0d250 1945 {
07a53e5c 1946 int line_delta;
220e750f
RH
1947
1948 if (filenum != e->loc.filenum)
fac0d250 1949 {
220e750f
RH
1950 filenum = e->loc.filenum;
1951 out_opcode (DW_LNS_set_file);
1952 out_uleb128 (filenum);
220e750f
RH
1953 }
1954
1955 if (column != e->loc.column)
1956 {
1957 column = e->loc.column;
1958 out_opcode (DW_LNS_set_column);
1959 out_uleb128 (column);
220e750f
RH
1960 }
1961
92846e72
CC
1962 if (e->loc.discriminator != 0)
1963 {
1964 out_opcode (DW_LNS_extended_op);
1965 out_leb128 (1 + sizeof_leb128 (e->loc.discriminator, 0));
1966 out_opcode (DW_LNE_set_discriminator);
1967 out_uleb128 (e->loc.discriminator);
1968 }
1969
bd0eb99b
RH
1970 if (isa != e->loc.isa)
1971 {
1972 isa = e->loc.isa;
1973 out_opcode (DW_LNS_set_isa);
1974 out_uleb128 (isa);
bd0eb99b
RH
1975 }
1976
1977 if ((e->loc.flags ^ flags) & DWARF2_FLAG_IS_STMT)
220e750f
RH
1978 {
1979 flags = e->loc.flags;
1980 out_opcode (DW_LNS_negate_stmt);
220e750f
RH
1981 }
1982
bd0eb99b 1983 if (e->loc.flags & DWARF2_FLAG_BASIC_BLOCK)
07a53e5c 1984 out_opcode (DW_LNS_set_basic_block);
220e750f 1985
bd0eb99b 1986 if (e->loc.flags & DWARF2_FLAG_PROLOGUE_END)
07a53e5c 1987 out_opcode (DW_LNS_set_prologue_end);
bd0eb99b
RH
1988
1989 if (e->loc.flags & DWARF2_FLAG_EPILOGUE_BEGIN)
07a53e5c 1990 out_opcode (DW_LNS_set_epilogue_begin);
bd0eb99b 1991
fb81275c
JM
1992 /* Don't try to optimize away redundant entries; gdb wants two
1993 entries for a function where the code starts on the same line as
1994 the {, and there's no way to identify that case here. Trust gcc
1995 to optimize appropriately. */
07a53e5c
RH
1996 line_delta = e->loc.line - line;
1997 lab = e->label;
1998 frag = symbol_get_frag (lab);
1999 frag_ofs = S_GET_VALUE (lab);
220e750f 2000
ba8826a8 2001 if (last_frag == NULL
51298b33 2002 || (e->loc.u.view == force_reset_view && force_reset_view
ba8826a8
AO
2003 /* If we're going to reset the view, but we know we're
2004 advancing the PC, we don't have to force with
2005 set_address. We know we do when we're at the same
2006 address of the same frag, and we know we might when
2007 we're in the beginning of a frag, and we were at the
2008 end of the previous frag. */
2009 && (frag == last_frag
2010 ? (last_frag_ofs == frag_ofs)
2011 : (frag_ofs == 0
2012 && ((offsetT)last_frag_ofs
2013 >= get_frag_fix (last_frag, seg))))))
220e750f 2014 {
07a53e5c
RH
2015 out_set_addr (lab);
2016 out_inc_line_addr (line_delta, 0);
220e750f 2017 }
7ddd14de 2018 else if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
07a53e5c
RH
2019 out_inc_line_addr (line_delta, frag_ofs - last_frag_ofs);
2020 else
2021 relax_inc_line_addr (line_delta, lab, last_lab);
2022
2023 line = e->loc.line;
2024 last_lab = lab;
2025 last_frag = frag;
2026 last_frag_ofs = frag_ofs;
220e750f
RH
2027
2028 next = e->next;
2029 free (e);
2030 e = next;
fac0d250 2031 }
fead5cd9 2032 while (e);
353e2c69 2033
220e750f 2034 /* Emit a DW_LNE_end_sequence for the end of the section. */
07a53e5c 2035 frag = last_frag_for_seg (seg);
c9049d30 2036 frag_ofs = get_frag_fix (frag, seg);
7ddd14de 2037 if (frag == last_frag && ! DWARF2_USE_FIXED_ADVANCE_PC)
07a53e5c 2038 out_inc_line_addr (INT_MAX, frag_ofs - last_frag_ofs);
220e750f 2039 else
07a53e5c 2040 {
e01e1cee 2041 lab = symbol_temp_new (seg, frag, frag_ofs);
07a53e5c
RH
2042 relax_inc_line_addr (INT_MAX, lab, last_lab);
2043 }
fac0d250
RH
2044}
2045
d2a54558
MW
2046/* Switch to LINE_STR_SEG and output the given STR. Return the
2047 symbol pointing to the new string in the section. */
2048
2049static symbolS *
2050add_line_strp (segT line_str_seg, const char *str)
2051{
2052 char *cp;
2053 size_t size;
2054 symbolS *sym;
2055
2056 subseg_set (line_str_seg, 0);
2057
2058 sym = symbol_temp_new_now_octets ();
2059
2060 size = strlen (str) + 1;
2061 cp = frag_more (size);
2062 memcpy (cp, str, size);
2063
2064 return sym;
2065}
2066
2067
220e750f
RH
2068/* Emit the directory and file tables for .debug_line. */
2069
fac0d250 2070static void
d2a54558 2071out_dir_and_file_list (segT line_seg, int sizeof_offset)
fac0d250
RH
2072{
2073 size_t size;
3d6b762c 2074 const char *dir;
fac0d250 2075 char *cp;
220e750f 2076 unsigned int i;
5b7c81bd
AM
2077 bool emit_md5 = false;
2078 bool emit_timestamps = true;
2079 bool emit_filesize = true;
d2a54558
MW
2080 segT line_str_seg = NULL;
2081 symbolS *line_strp;
220e750f 2082
5496f3c6 2083 /* Output the Directory Table. */
5496f3c6
NC
2084 if (DWARF2_LINE_VERSION >= 5)
2085 {
546cb2d8 2086 /* We only have one column in the directory table. */
5496f3c6 2087 out_byte (1);
546cb2d8
NC
2088
2089 /* Describe the purpose and format of the column. */
5496f3c6 2090 out_uleb128 (DW_LNCT_path);
d2a54558
MW
2091 /* Store these strings in the .debug_line_str section so they
2092 can be shared. */
2093 out_uleb128 (DW_FORM_line_strp);
546cb2d8 2094
f63d03dd
MW
2095 /* Now state how many rows there are in the table. We need at
2096 least 1 if there is one or more file names to store the
2097 "working directory". */
2098 if (dirs_in_use == 0 && files_in_use > 0)
2099 out_uleb128 (1);
2100 else
2101 out_uleb128 (dirs_in_use);
5496f3c6
NC
2102 }
2103
a7ed1ca2 2104 /* Emit directory list. */
f63d03dd 2105 if (DWARF2_LINE_VERSION >= 5 && (dirs_in_use > 0 || files_in_use > 0))
5496f3c6 2106 {
d2a54558
MW
2107 line_str_seg = subseg_new (".debug_line_str", 0);
2108 bfd_set_section_flags (line_str_seg,
2109 SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS
2110 | SEC_MERGE | SEC_STRINGS);
2111 line_str_seg->entsize = 1;
2112
f63d03dd
MW
2113 /* DWARF5 uses slot zero, but that is only set explicitly
2114 using a .file 0 directive. If that isn't used, but dir
2115 one is used, then use that as main file directory.
2116 Otherwise use pwd as main file directory. */
2117 if (dirs_in_use > 0 && dirs != NULL && dirs[0] != NULL)
5496f3c6 2118 dir = remap_debug_filename (dirs[0]);
3417bfca
NC
2119 else if (dirs_in_use > 1
2120 && dirs != NULL
2121 && dirs[1] != NULL
2122 /* DWARF-5 directory tables expect dir[0] to be the same as
2123 DW_AT_comp_dir, which is the same as pwd. */
2124 && dwarf_level < 5)
f63d03dd
MW
2125 dir = remap_debug_filename (dirs[1]);
2126 else
2127 dir = remap_debug_filename (getpwd ());
2128
d2a54558
MW
2129 line_strp = add_line_strp (line_str_seg, dir);
2130 subseg_set (line_seg, 0);
2131 TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
5496f3c6 2132 }
a7ed1ca2
NC
2133 for (i = 1; i < dirs_in_use; ++i)
2134 {
3d6b762c 2135 dir = remap_debug_filename (dirs[i]);
d2a54558
MW
2136 if (DWARF2_LINE_VERSION < 5)
2137 {
2138 size = strlen (dir) + 1;
2139 cp = frag_more (size);
2140 memcpy (cp, dir, size);
2141 }
2142 else
2143 {
2144 line_strp = add_line_strp (line_str_seg, dir);
2145 subseg_set (line_seg, 0);
2146 TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
2147 }
a7ed1ca2 2148 }
fac0d250 2149
5496f3c6
NC
2150 if (DWARF2_LINE_VERSION < 5)
2151 /* Terminate it. */
2152 out_byte ('\0');
2153
2154 /* Output the File Name Table. */
5496f3c6
NC
2155 if (DWARF2_LINE_VERSION >= 5)
2156 {
2157 unsigned int columns = 4;
2158
2159 if (((unsigned long) DWARF2_FILE_TIME_NAME ("", "")) == -1UL)
2160 {
5b7c81bd 2161 emit_timestamps = false;
5496f3c6
NC
2162 -- columns;
2163 }
2164
2165 if (DWARF2_FILE_SIZE_NAME ("", "") == -1)
2166 {
5b7c81bd 2167 emit_filesize = false;
5496f3c6
NC
2168 -- columns;
2169 }
2170
2171 for (i = 0; i < files_in_use; ++i)
2172 if (files[i].md5[0] != 0)
2173 break;
2174 if (i < files_in_use)
2175 {
5b7c81bd 2176 emit_md5 = true;
5496f3c6
NC
2177 ++ columns;
2178 }
2179
2180 /* The number of format entries to follow. */
2181 out_byte (columns);
5496f3c6
NC
2182 /* The format of the file name. */
2183 out_uleb128 (DW_LNCT_path);
d2a54558
MW
2184 /* Store these strings in the .debug_line_str section so they
2185 can be shared. */
2186 out_uleb128 (DW_FORM_line_strp);
5496f3c6
NC
2187
2188 /* The format of the directory index. */
2189 out_uleb128 (DW_LNCT_directory_index);
2190 out_uleb128 (DW_FORM_udata);
2191
2192 if (emit_timestamps)
2193 {
2194 /* The format of the timestamp. */
2195 out_uleb128 (DW_LNCT_timestamp);
2196 out_uleb128 (DW_FORM_udata);
2197 }
2198
2199 if (emit_filesize)
2200 {
2201 /* The format of the file size. */
2202 out_uleb128 (DW_LNCT_size);
2203 out_uleb128 (DW_FORM_udata);
2204 }
2205
2206 if (emit_md5)
2207 {
2208 /* The format of the MD5 sum. */
2209 out_uleb128 (DW_LNCT_MD5);
2210 out_uleb128 (DW_FORM_data16);
2211 }
2212
2213 /* The number of entries in the table. */
2214 out_uleb128 (files_in_use);
2215 }
2216
2217 for (i = DWARF2_LINE_VERSION > 4 ? 0 : 1; i < files_in_use; ++i)
fac0d250 2218 {
01e1a5bc
NC
2219 const char *fullfilename;
2220
249e3833
RH
2221 if (files[i].filename == NULL)
2222 {
f63d03dd
MW
2223 /* Prevent a crash later, particularly for file 1. DWARF5
2224 uses slot zero, but that is only set explicitly using a
2225 .file 0 directive. If that isn't used, but file 1 is,
2226 then use that as main file name. */
3417bfca
NC
2227 if (DWARF2_LINE_VERSION >= 5 && i == 0 && files_in_use >= 1 && files[0].filename == NULL)
2228 files[0].filename = files[1].filename;
f63d03dd
MW
2229 else
2230 files[i].filename = "";
5496f3c6
NC
2231 if (DWARF2_LINE_VERSION < 5 || i != 0)
2232 {
2233 as_bad (_("unassigned file number %ld"), (long) i);
2234 continue;
2235 }
249e3833
RH
2236 }
2237
01e1a5bc
NC
2238 fullfilename = DWARF2_FILE_NAME (files[i].filename,
2239 files[i].dir ? dirs [files [i].dir] : "");
d2a54558
MW
2240 if (DWARF2_LINE_VERSION < 5)
2241 {
2242 size = strlen (fullfilename) + 1;
2243 cp = frag_more (size);
2244 memcpy (cp, fullfilename, size);
2245 }
2246 else
2247 {
2248 line_strp = add_line_strp (line_str_seg, fullfilename);
2249 subseg_set (line_seg, 0);
2250 TC_DWARF2_EMIT_OFFSET (line_strp, sizeof_offset);
2251 }
fac0d250 2252
5496f3c6
NC
2253 /* Directory number. */
2254 out_uleb128 (files[i].dir);
2255
01e1a5bc 2256 /* Output the last modification timestamp. */
5496f3c6
NC
2257 if (emit_timestamps)
2258 {
2259 offsetT timestamp;
2260
2261 timestamp = DWARF2_FILE_TIME_NAME (files[i].filename,
2262 files[i].dir ? dirs [files [i].dir] : "");
2263 if (timestamp == -1)
2264 timestamp = 0;
2265 out_uleb128 (timestamp);
2266 }
2267
01e1a5bc 2268 /* Output the filesize. */
5496f3c6
NC
2269 if (emit_filesize)
2270 {
2271 offsetT filesize;
2272 filesize = DWARF2_FILE_SIZE_NAME (files[i].filename,
2273 files[i].dir ? dirs [files [i].dir] : "");
2274 if (filesize == -1)
2275 filesize = 0;
2276 out_uleb128 (filesize);
2277 }
2278
2279 /* Output the md5 sum. */
2280 if (emit_md5)
2281 {
2282 int b;
2283
2284 for (b = 0; b < NUM_MD5_BYTES; b++)
2285 out_byte (files[i].md5[b]);
2286 }
fac0d250 2287 }
353e2c69 2288
5496f3c6
NC
2289 if (DWARF2_LINE_VERSION < 5)
2290 /* Terminate filename list. */
2291 out_byte (0);
fac0d250
RH
2292}
2293
413a266c
AM
2294/* Switch to SEC and output a header length field. Return the size of
2295 offsets used in SEC. The caller must set EXPR->X_add_symbol value
d025d5e5
MW
2296 to the end of the section. EXPR->X_add_number will be set to the
2297 negative size of the header. */
413a266c
AM
2298
2299static int
91d6fa6a 2300out_header (asection *sec, expressionS *exp)
413a266c
AM
2301{
2302 symbolS *start_sym;
2303 symbolS *end_sym;
2304
2305 subseg_set (sec, 0);
b57dc16f 2306
0f8f0c57
NC
2307 if (flag_dwarf_sections)
2308 {
2309 /* If we are going to put the start and end symbols in different
2310 sections, then we need real symbols, not just fake, local ones. */
2311 frag_now_fix ();
2312 start_sym = symbol_make (".Ldebug_line_start");
2313 end_sym = symbol_make (".Ldebug_line_end");
2314 symbol_set_value_now (start_sym);
2315 }
2316 else
0f8f0c57 2317 {
72354279 2318 start_sym = symbol_temp_new_now_octets ();
0f8f0c57
NC
2319 end_sym = symbol_temp_make ();
2320 }
413a266c
AM
2321
2322 /* Total length of the information. */
91d6fa6a
NC
2323 exp->X_op = O_subtract;
2324 exp->X_add_symbol = end_sym;
2325 exp->X_op_symbol = start_sym;
413a266c
AM
2326
2327 switch (DWARF2_FORMAT (sec))
2328 {
2329 case dwarf2_format_32bit:
91d6fa6a
NC
2330 exp->X_add_number = -4;
2331 emit_expr (exp, 4);
413a266c
AM
2332 return 4;
2333
2334 case dwarf2_format_64bit:
91d6fa6a 2335 exp->X_add_number = -12;
413a266c 2336 out_four (-1);
91d6fa6a 2337 emit_expr (exp, 8);
413a266c
AM
2338 return 8;
2339
2340 case dwarf2_format_64bit_irix:
91d6fa6a
NC
2341 exp->X_add_number = -8;
2342 emit_expr (exp, 8);
413a266c
AM
2343 return 8;
2344 }
2345
2346 as_fatal (_("internal error: unknown dwarf2 format"));
2347 return 0;
2348}
2349
220e750f
RH
2350/* Emit the collected .debug_line data. */
2351
2352static void
a2e22468 2353out_debug_line (segT line_seg)
220e750f 2354{
91d6fa6a 2355 expressionS exp;
02fe846e 2356 symbolS *prologue_start, *prologue_end;
220e750f
RH
2357 symbolS *line_end;
2358 struct line_seg *s;
14e777e0 2359 int sizeof_offset;
220e750f 2360
031e3350 2361 memset (&exp, 0, sizeof exp);
91d6fa6a
NC
2362 sizeof_offset = out_header (line_seg, &exp);
2363 line_end = exp.X_add_symbol;
220e750f
RH
2364
2365 /* Version. */
88ebb0a1 2366 out_two (DWARF2_LINE_VERSION);
220e750f 2367
5496f3c6
NC
2368 if (DWARF2_LINE_VERSION >= 5)
2369 {
2370 out_byte (sizeof_address);
2371 out_byte (0); /* Segment Selector size. */
2372 }
220e750f 2373 /* Length of the prologue following this length. */
02fe846e 2374 prologue_start = symbol_temp_make ();
413a266c 2375 prologue_end = symbol_temp_make ();
02fe846e 2376 exp.X_op = O_subtract;
91d6fa6a 2377 exp.X_add_symbol = prologue_end;
02fe846e
AM
2378 exp.X_op_symbol = prologue_start;
2379 exp.X_add_number = 0;
91d6fa6a 2380 emit_expr (&exp, sizeof_offset);
e2b9a97e 2381 symbol_set_value_now (prologue_start);
220e750f
RH
2382
2383 /* Parameters of the state machine. */
2384 out_byte (DWARF2_LINE_MIN_INSN_LENGTH);
5496f3c6
NC
2385 if (DWARF2_LINE_VERSION >= 4)
2386 out_byte (DWARF2_LINE_MAX_OPS_PER_INSN);
220e750f
RH
2387 out_byte (DWARF2_LINE_DEFAULT_IS_STMT);
2388 out_byte (DWARF2_LINE_BASE);
2389 out_byte (DWARF2_LINE_RANGE);
2390 out_byte (DWARF2_LINE_OPCODE_BASE);
2391
2392 /* Standard opcode lengths. */
2393 out_byte (0); /* DW_LNS_copy */
2394 out_byte (1); /* DW_LNS_advance_pc */
2395 out_byte (1); /* DW_LNS_advance_line */
2396 out_byte (1); /* DW_LNS_set_file */
2397 out_byte (1); /* DW_LNS_set_column */
2398 out_byte (0); /* DW_LNS_negate_stmt */
2399 out_byte (0); /* DW_LNS_set_basic_block */
2400 out_byte (0); /* DW_LNS_const_add_pc */
2401 out_byte (1); /* DW_LNS_fixed_advance_pc */
bd0eb99b
RH
2402 out_byte (0); /* DW_LNS_set_prologue_end */
2403 out_byte (0); /* DW_LNS_set_epilogue_begin */
2404 out_byte (1); /* DW_LNS_set_isa */
5496f3c6
NC
2405 /* We have emitted 12 opcode lengths, so make that this
2406 matches up to the opcode base value we have been using. */
2407 gas_assert (DWARF2_LINE_OPCODE_BASE == 13);
220e750f 2408
d2a54558 2409 out_dir_and_file_list (line_seg, sizeof_offset);
220e750f 2410
e2b9a97e 2411 symbol_set_value_now (prologue_end);
220e750f
RH
2412
2413 /* For each section, emit a statement program. */
ee515fb7 2414 for (s = all_segs; s; s = s->next)
bcb78b47
NC
2415 /* Paranoia - this check should have already have
2416 been handled in dwarf2_gen_line_info_1(). */
9aec2026
NC
2417 if (SEG_NORMAL (s->seg))
2418 process_entries (s->seg, s->head->head);
220e750f 2419
b40bf0a2
NC
2420 if (flag_dwarf_sections)
2421 /* We have to switch to the special .debug_line_end section
2422 before emitting the end-of-debug_line symbol. The linker
2423 script arranges for this section to be placed after all the
2424 (potentially garbage collected) .debug_line.<foo> sections.
2425 This section contains the line_end symbol which is used to
2426 compute the size of the linked .debug_line section, as seen
2427 in the DWARF Line Number header. */
5b7c81bd 2428 subseg_set (subseg_get (".debug_line_end", false), 0);
b40bf0a2 2429
e2b9a97e 2430 symbol_set_value_now (line_end);
220e750f
RH
2431}
2432
802f5d9e 2433static void
bdd3b953 2434out_debug_ranges (segT ranges_seg, symbolS **ranges_sym)
802f5d9e
NC
2435{
2436 unsigned int addr_size = sizeof_address;
2437 struct line_seg *s;
91d6fa6a 2438 expressionS exp;
802f5d9e
NC
2439 unsigned int i;
2440
031e3350 2441 memset (&exp, 0, sizeof exp);
802f5d9e
NC
2442 subseg_set (ranges_seg, 0);
2443
bdd3b953
MW
2444 /* For DW_AT_ranges to point at (there is no header, so really start
2445 of section, but see out_debug_rnglists). */
2446 *ranges_sym = symbol_temp_new_now_octets ();
2447
802f5d9e 2448 /* Base Address Entry. */
7fd3924a 2449 for (i = 0; i < addr_size; i++)
802f5d9e 2450 out_byte (0xff);
7fd3924a 2451 for (i = 0; i < addr_size; i++)
802f5d9e
NC
2452 out_byte (0);
2453
2454 /* Range List Entry. */
2455 for (s = all_segs; s; s = s->next)
2456 {
2457 fragS *frag;
2458 symbolS *beg, *end;
2459
2460 frag = first_frag_for_seg (s->seg);
e01e1cee 2461 beg = symbol_temp_new (s->seg, frag, 0);
802f5d9e
NC
2462 s->text_start = beg;
2463
2464 frag = last_frag_for_seg (s->seg);
e01e1cee 2465 end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
802f5d9e
NC
2466 s->text_end = end;
2467
91d6fa6a
NC
2468 exp.X_op = O_symbol;
2469 exp.X_add_symbol = beg;
2470 exp.X_add_number = 0;
2471 emit_expr (&exp, addr_size);
802f5d9e 2472
91d6fa6a
NC
2473 exp.X_op = O_symbol;
2474 exp.X_add_symbol = end;
2475 exp.X_add_number = 0;
2476 emit_expr (&exp, addr_size);
802f5d9e
NC
2477 }
2478
2479 /* End of Range Entry. */
7fd3924a 2480 for (i = 0; i < addr_size; i++)
802f5d9e 2481 out_byte (0);
7fd3924a 2482 for (i = 0; i < addr_size; i++)
802f5d9e
NC
2483 out_byte (0);
2484}
2485
bdd3b953
MW
2486static void
2487out_debug_rnglists (segT ranges_seg, symbolS **ranges_sym)
2488{
2489 expressionS exp;
2490 symbolS *ranges_end;
2491 struct line_seg *s;
2492
2493 /* Unit length. */
2494 memset (&exp, 0, sizeof exp);
2495 out_header (ranges_seg, &exp);
2496 ranges_end = exp.X_add_symbol;
2497
2498 out_two (DWARF2_RNGLISTS_VERSION);
2499 out_byte (sizeof_address);
2500 out_byte (0); /* Segment Selector size. */
2501 out_four (0); /* Offset entry count. */
2502
2503 /* For DW_AT_ranges to point at (must be after the header). */
2504 *ranges_sym = symbol_temp_new_now_octets ();
2505
2506 for (s = all_segs; s; s = s->next)
2507 {
2508 fragS *frag;
2509 symbolS *beg, *end;
2510
2511 out_byte (DW_RLE_start_length);
2512
2513 frag = first_frag_for_seg (s->seg);
2514 beg = symbol_temp_new (s->seg, frag, 0);
2515 s->text_start = beg;
2516
2517 frag = last_frag_for_seg (s->seg);
2518 end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
2519 s->text_end = end;
2520
2521 exp.X_op = O_symbol;
2522 exp.X_add_symbol = beg;
2523 exp.X_add_number = 0;
2524 emit_expr (&exp, sizeof_address);
2525
2526 exp.X_op = O_symbol;
2527 exp.X_add_symbol = end;
2528 exp.X_add_number = 0;
2529 emit_leb128_expr (&exp, 0);
2530 }
2531
2532 out_byte (DW_RLE_end_of_list);
2533
2534 symbol_set_value_now (ranges_end);
2535}
2536
220e750f
RH
2537/* Emit data for .debug_aranges. */
2538
58b5739a 2539static void
a2e22468 2540out_debug_aranges (segT aranges_seg, segT info_seg)
fac0d250 2541{
220e750f 2542 unsigned int addr_size = sizeof_address;
d025d5e5 2543 offsetT size;
220e750f 2544 struct line_seg *s;
91d6fa6a 2545 expressionS exp;
413a266c 2546 symbolS *aranges_end;
220e750f 2547 char *p;
413a266c 2548 int sizeof_offset;
fac0d250 2549
031e3350 2550 memset (&exp, 0, sizeof exp);
91d6fa6a
NC
2551 sizeof_offset = out_header (aranges_seg, &exp);
2552 aranges_end = exp.X_add_symbol;
d025d5e5 2553 size = -exp.X_add_number;
fac0d250 2554
220e750f 2555 /* Version. */
88ebb0a1 2556 out_two (DWARF2_ARANGES_VERSION);
d025d5e5 2557 size += 2;
4dc7ead9 2558
220e750f 2559 /* Offset to .debug_info. */
413a266c 2560 TC_DWARF2_EMIT_OFFSET (section_symbol (info_seg), sizeof_offset);
d025d5e5 2561 size += sizeof_offset;
220e750f
RH
2562
2563 /* Size of an address (offset portion). */
2564 out_byte (addr_size);
d025d5e5 2565 size++;
220e750f
RH
2566
2567 /* Size of a segment descriptor. */
2568 out_byte (0);
d025d5e5 2569 size++;
220e750f
RH
2570
2571 /* Align the header. */
d025d5e5
MW
2572 while ((size++ % (2 * addr_size)) > 0)
2573 out_byte (0);
4dc7ead9 2574
ee515fb7 2575 for (s = all_segs; s; s = s->next)
220e750f
RH
2576 {
2577 fragS *frag;
2578 symbolS *beg, *end;
2579
2580 frag = first_frag_for_seg (s->seg);
e01e1cee 2581 beg = symbol_temp_new (s->seg, frag, 0);
220e750f
RH
2582 s->text_start = beg;
2583
2584 frag = last_frag_for_seg (s->seg);
e01e1cee 2585 end = symbol_temp_new (s->seg, frag, get_frag_fix (frag, s->seg));
220e750f
RH
2586 s->text_end = end;
2587
91d6fa6a
NC
2588 exp.X_op = O_symbol;
2589 exp.X_add_symbol = beg;
2590 exp.X_add_number = 0;
2591 emit_expr (&exp, addr_size);
220e750f 2592
91d6fa6a
NC
2593 exp.X_op = O_subtract;
2594 exp.X_add_symbol = end;
2595 exp.X_op_symbol = beg;
2596 exp.X_add_number = 0;
2597 emit_expr (&exp, addr_size);
220e750f 2598 }
4dc7ead9 2599
220e750f
RH
2600 p = frag_more (2 * addr_size);
2601 md_number_to_chars (p, 0, addr_size);
2602 md_number_to_chars (p + addr_size, 0, addr_size);
413a266c 2603
e2b9a97e 2604 symbol_set_value_now (aranges_end);
4dc7ead9
RH
2605}
2606
220e750f
RH
2607/* Emit data for .debug_abbrev. Note that this must be kept in
2608 sync with out_debug_info below. */
fac0d250 2609
220e750f 2610static void
413a266c
AM
2611out_debug_abbrev (segT abbrev_seg,
2612 segT info_seg ATTRIBUTE_UNUSED,
2613 segT line_seg ATTRIBUTE_UNUSED)
220e750f 2614{
dd216e07 2615 int secoff_form;
220e750f 2616 subseg_set (abbrev_seg, 0);
fac0d250 2617
220e750f
RH
2618 out_uleb128 (1);
2619 out_uleb128 (DW_TAG_compile_unit);
2620 out_byte (DW_CHILDREN_no);
dd216e07
MW
2621 if (DWARF2_VERSION < 4)
2622 {
2623 if (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit)
2624 secoff_form = DW_FORM_data4;
2625 else
2626 secoff_form = DW_FORM_data8;
2627 }
413a266c 2628 else
dd216e07
MW
2629 secoff_form = DW_FORM_sec_offset;
2630 out_abbrev (DW_AT_stmt_list, secoff_form);
220e750f 2631 if (all_segs->next == NULL)
4dc7ead9 2632 {
220e750f 2633 out_abbrev (DW_AT_low_pc, DW_FORM_addr);
88ebb0a1
MW
2634 if (DWARF2_VERSION < 4)
2635 out_abbrev (DW_AT_high_pc, DW_FORM_addr);
2636 else
6b9a135d 2637 out_abbrev (DW_AT_high_pc, DW_FORM_udata);
220e750f 2638 }
802f5d9e 2639 else
dd216e07 2640 out_abbrev (DW_AT_ranges, secoff_form);
49fced12
MW
2641 out_abbrev (DW_AT_name, DW_FORM_strp);
2642 out_abbrev (DW_AT_comp_dir, DW_FORM_strp);
2643 out_abbrev (DW_AT_producer, DW_FORM_strp);
220e750f
RH
2644 out_abbrev (DW_AT_language, DW_FORM_data2);
2645 out_abbrev (0, 0);
a987bfc9
RH
2646
2647 /* Terminate the abbreviations for this compilation unit. */
2648 out_byte (0);
220e750f 2649}
4dc7ead9 2650
220e750f 2651/* Emit a description of this compilation unit for .debug_info. */
4dc7ead9 2652
220e750f 2653static void
bdd3b953
MW
2654out_debug_info (segT info_seg, segT abbrev_seg, segT line_seg,
2655 symbolS *ranges_sym, symbolS *name_sym,
2656 symbolS *comp_dir_sym, symbolS *producer_sym)
220e750f 2657{
91d6fa6a 2658 expressionS exp;
220e750f 2659 symbolS *info_end;
14e777e0 2660 int sizeof_offset;
4dc7ead9 2661
031e3350 2662 memset (&exp, 0, sizeof exp);
91d6fa6a
NC
2663 sizeof_offset = out_header (info_seg, &exp);
2664 info_end = exp.X_add_symbol;
4dc7ead9 2665
220e750f 2666 /* DWARF version. */
fc0eebac 2667 out_two (DWARF2_VERSION);
4dc7ead9 2668
a3b3e858
MW
2669 if (DWARF2_VERSION < 5)
2670 {
2671 /* .debug_abbrev offset */
2672 TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
2673 }
2674 else
2675 {
2676 /* unit (header) type */
2677 out_byte (DW_UT_compile);
2678 }
4dc7ead9 2679
220e750f
RH
2680 /* Target address size. */
2681 out_byte (sizeof_address);
fac0d250 2682
a3b3e858
MW
2683 if (DWARF2_VERSION >= 5)
2684 {
2685 /* .debug_abbrev offset */
2686 TC_DWARF2_EMIT_OFFSET (section_symbol (abbrev_seg), sizeof_offset);
2687 }
2688
220e750f
RH
2689 /* DW_TAG_compile_unit DIE abbrev */
2690 out_uleb128 (1);
fac0d250 2691
220e750f 2692 /* DW_AT_stmt_list */
413a266c
AM
2693 TC_DWARF2_EMIT_OFFSET (section_symbol (line_seg),
2694 (DWARF2_FORMAT (line_seg) == dwarf2_format_32bit
2695 ? 4 : 8));
fac0d250 2696
802f5d9e 2697 /* These two attributes are emitted if all of the code is contiguous. */
220e750f 2698 if (all_segs->next == NULL)
58b5739a 2699 {
220e750f 2700 /* DW_AT_low_pc */
91d6fa6a
NC
2701 exp.X_op = O_symbol;
2702 exp.X_add_symbol = all_segs->text_start;
2703 exp.X_add_number = 0;
2704 emit_expr (&exp, sizeof_address);
220e750f
RH
2705
2706 /* DW_AT_high_pc */
88ebb0a1
MW
2707 if (DWARF2_VERSION < 4)
2708 exp.X_op = O_symbol;
2709 else
2710 {
2711 exp.X_op = O_subtract;
2712 exp.X_op_symbol = all_segs->text_start;
2713 }
91d6fa6a
NC
2714 exp.X_add_symbol = all_segs->text_end;
2715 exp.X_add_number = 0;
6b9a135d
MW
2716 if (DWARF2_VERSION < 4)
2717 emit_expr (&exp, sizeof_address);
2718 else
2719 emit_leb128_expr (&exp, 0);
58b5739a 2720 }
802f5d9e
NC
2721 else
2722 {
eb1fe072
NC
2723 /* This attribute is emitted if the code is disjoint. */
2724 /* DW_AT_ranges. */
bdd3b953 2725 TC_DWARF2_EMIT_OFFSET (ranges_sym, sizeof_offset);
802f5d9e 2726 }
58b5739a 2727
49fced12
MW
2728 /* DW_AT_name, DW_AT_comp_dir and DW_AT_producer. Symbols in .debug_str
2729 setup in out_debug_str below. */
2730 TC_DWARF2_EMIT_OFFSET (name_sym, sizeof_offset);
2731 TC_DWARF2_EMIT_OFFSET (comp_dir_sym, sizeof_offset);
2732 TC_DWARF2_EMIT_OFFSET (producer_sym, sizeof_offset);
2733
2734 /* DW_AT_language. Yes, this is probably not really MIPS, but the
2735 dwarf2 draft has no standard code for assembler. */
2736 out_two (DW_LANG_Mips_Assembler);
2737
e2b9a97e 2738 symbol_set_value_now (info_end);
49fced12
MW
2739}
2740
2741/* Emit the three debug strings needed in .debug_str and setup symbols
2742 to them for use in out_debug_info. */
2743static void
2744out_debug_str (segT str_seg, symbolS **name_sym, symbolS **comp_dir_sym,
2745 symbolS **producer_sym)
2746{
2747 char producer[128];
2748 const char *comp_dir;
2749 const char *dirname;
2750 char *p;
2751 int len;
5496f3c6 2752 int first_file = DWARF2_LINE_VERSION > 4 ? 0 : 1;
49fced12
MW
2753
2754 subseg_set (str_seg, 0);
2755
48b91938 2756 /* DW_AT_name. We don't have the actual file name that was present
5496f3c6 2757 on the command line, so assume files[first_file] is the main input file.
48b91938
RH
2758 We're not supposed to get called unless at least one line number
2759 entry was emitted, so this should always be defined. */
5c4e5fe6 2760 *name_sym = symbol_temp_new_now_octets ();
7fd3924a 2761 if (files_in_use == 0)
48b91938 2762 abort ();
5496f3c6 2763 if (files[first_file].dir)
a7ed1ca2 2764 {
5496f3c6 2765 dirname = remap_debug_filename (dirs[files[first_file].dir]);
3d6b762c 2766 len = strlen (dirname);
198f1251
TG
2767#ifdef TE_VMS
2768 /* Already has trailing slash. */
2769 p = frag_more (len);
2770 memcpy (p, dirname, len);
2771#else
a7ed1ca2 2772 p = frag_more (len + 1);
3d6b762c 2773 memcpy (p, dirname, len);
56487c55 2774 INSERT_DIR_SEPARATOR (p, len);
198f1251 2775#endif
a7ed1ca2 2776 }
5496f3c6 2777 len = strlen (files[first_file].filename) + 1;
48b91938 2778 p = frag_more (len);
5496f3c6 2779 memcpy (p, files[first_file].filename, len);
48b91938 2780
220e750f 2781 /* DW_AT_comp_dir */
5c4e5fe6 2782 *comp_dir_sym = symbol_temp_new_now_octets ();
3d6b762c 2783 comp_dir = remap_debug_filename (getpwd ());
220e750f
RH
2784 len = strlen (comp_dir) + 1;
2785 p = frag_more (len);
2786 memcpy (p, comp_dir, len);
fac0d250 2787
220e750f 2788 /* DW_AT_producer */
5c4e5fe6 2789 *producer_sym = symbol_temp_new_now_octets ();
220e750f
RH
2790 sprintf (producer, "GNU AS %s", VERSION);
2791 len = strlen (producer) + 1;
2792 p = frag_more (len);
2793 memcpy (p, producer, len);
fac0d250
RH
2794}
2795
1e9cc1c2
NC
2796void
2797dwarf2_init (void)
2798{
1e9cc1c2 2799 last_seg_ptr = &all_segs;
0ac2b354
AB
2800
2801 /* Select the default CIE version to produce here. The global
2802 starts with a value of -1 and will be modified to a valid value
2803 either by the user providing a command line option, or some
2804 targets will select their own default in md_after_parse_args. If
2805 we get here and the global still contains -1 then it is up to us
2806 to pick a sane default. The default we choose is 1, this is the
2807 CIE version gas has produced for a long time, and there seems no
2808 reason to change it yet. */
2809 if (flag_dwarf_cie_version == -1)
2810 flag_dwarf_cie_version = 1;
1e9cc1c2
NC
2811}
2812
c6cb92c5 2813/* Finish the dwarf2 debug sections. We emit .debug.line if there
edc7a80a 2814 were any .file/.loc directives, or --gdwarf2 was given, and if the
df1c40a7
L
2815 file has a non-empty .debug_info section and an empty .debug_line
2816 section. If we emit .debug_line, and the .debug_info section is
2817 empty, we also emit .debug_info, .debug_aranges and .debug_abbrev.
2818 ALL_SEGS will be non-null if there were any .file/.loc directives,
2819 or --gdwarf2 was given and there were any located instructions
2820 emitted. */
c6cb92c5 2821
fac0d250 2822void
a2e22468 2823dwarf2_finish (void)
fac0d250 2824{
220e750f
RH
2825 segT line_seg;
2826 struct line_seg *s;
c6cb92c5
NS
2827 segT info_seg;
2828 int emit_other_sections = 0;
df1c40a7 2829 int empty_debug_line = 0;
c6cb92c5
NS
2830
2831 info_seg = bfd_get_section_by_name (stdoutput, ".debug_info");
2832 emit_other_sections = info_seg == NULL || !seg_not_empty_p (info_seg);
fac0d250 2833
df1c40a7
L
2834 line_seg = bfd_get_section_by_name (stdoutput, ".debug_line");
2835 empty_debug_line = line_seg == NULL || !seg_not_empty_p (line_seg);
2836
2837 /* We can't construct a new debug_line section if we already have one.
edc7a80a
MW
2838 Give an error if we have seen any .loc, otherwise trust the user
2839 knows what they are doing and want to generate the .debug_line
2840 (and all other debug sections) themselves. */
2841 if (all_segs && !empty_debug_line && dwarf2_any_loc_directive_seen)
df1c40a7
L
2842 as_fatal ("duplicate .debug_line sections");
2843
2844 if ((!all_segs && emit_other_sections)
2845 || (!emit_other_sections && !empty_debug_line))
2846 /* If there is no line information and no non-empty .debug_info
2847 section, or if there is both a non-empty .debug_info and a non-empty
2848 .debug_line, then we do nothing. */
220e750f 2849 return;
fac0d250 2850
220e750f 2851 /* Calculate the size of an address for the target machine. */
9605f328 2852 sizeof_address = DWARF2_ADDR_SIZE (stdoutput);
fac0d250 2853
220e750f 2854 /* Create and switch to the line number section. */
edc7a80a
MW
2855 if (empty_debug_line)
2856 {
2857 line_seg = subseg_new (".debug_line", 0);
2858 bfd_set_section_flags (line_seg,
2859 SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
2860 }
fac0d250 2861
220e750f 2862 /* For each subsection, chain the debug entries together. */
ee515fb7 2863 for (s = all_segs; s; s = s->next)
fac0d250 2864 {
91d6fa6a
NC
2865 struct line_subseg *lss = s->head;
2866 struct line_entry **ptail = lss->ptail;
220e750f 2867
51298b33
AM
2868 if (lss->head && SEG_NORMAL (s->seg))
2869 do_allocate_filenum (lss->head);
2870
62e6b7b3
AO
2871 /* Reset the initial view of the first subsection of the
2872 section. */
51298b33 2873 if (lss->head && lss->head->loc.u.view)
62e6b7b3
AO
2874 set_or_check_view (lss->head, NULL, NULL);
2875
91d6fa6a 2876 while ((lss = lss->next) != NULL)
220e750f 2877 {
62e6b7b3
AO
2878 /* Link the first view of subsequent subsections to the
2879 previous view. */
51298b33 2880 if (lss->head && lss->head->loc.u.view)
62e6b7b3
AO
2881 set_or_check_view (lss->head,
2882 !s->head ? NULL : (struct line_entry *)ptail,
2883 s->head ? s->head->head : NULL);
91d6fa6a
NC
2884 *ptail = lss->head;
2885 ptail = lss->ptail;
220e750f 2886 }
fac0d250 2887 }
85a39694 2888
edc7a80a
MW
2889 if (empty_debug_line)
2890 out_debug_line (line_seg);
85a39694 2891
c6cb92c5 2892 /* If this is assembler generated line info, and there is no
49fced12
MW
2893 debug_info already, we need .debug_info, .debug_abbrev and
2894 .debug_str sections as well. */
c6cb92c5 2895 if (emit_other_sections)
220e750f
RH
2896 {
2897 segT abbrev_seg;
220e750f 2898 segT aranges_seg;
49fced12 2899 segT str_seg;
bdd3b953 2900 symbolS *name_sym, *comp_dir_sym, *producer_sym, *ranges_sym;
4dc7ead9 2901
9c2799c2 2902 gas_assert (all_segs);
7fd3924a 2903
220e750f
RH
2904 info_seg = subseg_new (".debug_info", 0);
2905 abbrev_seg = subseg_new (".debug_abbrev", 0);
2906 aranges_seg = subseg_new (".debug_aranges", 0);
49fced12 2907 str_seg = subseg_new (".debug_str", 0);
ef99799a 2908
61826503
CE
2909 bfd_set_section_flags (info_seg,
2910 SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
2911 bfd_set_section_flags (abbrev_seg,
2912 SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
2913 bfd_set_section_flags (aranges_seg,
2914 SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS);
2915 bfd_set_section_flags (str_seg,
2916 SEC_READONLY | SEC_DEBUGGING | SEC_OCTETS
2917 | SEC_MERGE | SEC_STRINGS);
49fced12 2918 str_seg->entsize = 1;
ef99799a 2919
ee515fb7 2920 record_alignment (aranges_seg, ffs (2 * sizeof_address) - 1);
ef99799a 2921
802f5d9e 2922 if (all_segs->next == NULL)
bdd3b953 2923 ranges_sym = NULL;
802f5d9e
NC
2924 else
2925 {
bdd3b953
MW
2926 if (DWARF2_VERSION < 5)
2927 {
2928 segT ranges_seg = subseg_new (".debug_ranges", 0);
2929 bfd_set_section_flags (ranges_seg, (SEC_READONLY
2930 | SEC_DEBUGGING
2931 | SEC_OCTETS));
2932 record_alignment (ranges_seg, ffs (2 * sizeof_address) - 1);
2933 out_debug_ranges (ranges_seg, &ranges_sym);
2934 }
2935 else
2936 {
2937 segT rnglists_seg = subseg_new (".debug_rnglists", 0);
2938 bfd_set_section_flags (rnglists_seg, (SEC_READONLY
2939 | SEC_DEBUGGING
2940 | SEC_OCTETS));
2941 out_debug_rnglists (rnglists_seg, &ranges_sym);
2942 }
802f5d9e
NC
2943 }
2944
220e750f 2945 out_debug_aranges (aranges_seg, info_seg);
413a266c 2946 out_debug_abbrev (abbrev_seg, info_seg, line_seg);
49fced12 2947 out_debug_str (str_seg, &name_sym, &comp_dir_sym, &producer_sym);
bdd3b953 2948 out_debug_info (info_seg, abbrev_seg, line_seg, ranges_sym,
49fced12 2949 name_sym, comp_dir_sym, producer_sym);
220e750f 2950 }
85a39694 2951}
ba8826a8
AO
2952
2953/* Perform any deferred checks pertaining to debug information. */
2954
2955void
2956dwarf2dbg_final_check (void)
2957{
2958 /* Perform reset-view checks. Don't evaluate view_assert_failed
2959 recursively: it could be very deep. It's a chain of adds, with
2960 each chain element pointing to the next in X_add_symbol, and
2961 holding the check value in X_op_symbol. */
2962 while (view_assert_failed)
2963 {
723dfee7 2964 expressionS *exp;
ba8826a8
AO
2965 symbolS *sym;
2966 offsetT failed;
2967
2968 gas_assert (!symbol_resolved_p (view_assert_failed));
2969
723dfee7 2970 exp = symbol_get_value_expression (view_assert_failed);
ba8826a8
AO
2971 sym = view_assert_failed;
2972
2973 /* If view_assert_failed looks like a compound check in the
2974 chain, break it up. */
723dfee7 2975 if (exp->X_op == O_add && exp->X_add_number == 0 && exp->X_unsigned)
ba8826a8 2976 {
723dfee7
HPN
2977 view_assert_failed = exp->X_add_symbol;
2978 sym = exp->X_op_symbol;
ba8826a8
AO
2979 }
2980 else
2981 view_assert_failed = NULL;
2982
2983 failed = resolve_symbol_value (sym);
2984 if (!symbol_resolved_p (sym) || failed)
2985 {
2986 as_bad (_("view number mismatch"));
2987 break;
2988 }
2989 }
2990}