Subversion Repositories Kolibri OS

Rev

Rev 5222 | Details | Compare with Previous | Last modification | View Log | RSS feed

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