c45d598ffc0486c44920eb70c0ab26e4b9669a84
[deliverable/binutils-gdb.git] / gas / dwarf2dbg.c
1 /* dwarf2dbg.c - DWARF2 debug support
2 Copyright (C) 1999 Free Software Foundation, Inc.
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
9 the Free Software Foundation; either version 2, 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, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA. */
21
22 /* Logical line numbers can be controlled by the compiler via the
23 following two directives:
24
25 .file FILENO "file.c"
26 .loc FILENO LINENO [COLUMN]
27
28 FILENO is the filenumber. */
29
30 #include "ansidecl.h"
31
32 #include "as.h"
33 #include "dwarf2dbg.h"
34 #include "subsegs.h"
35
36 #include "elf/dwarf2.h"
37
38 /* Since we can't generate the prolog until the body is complete, we
39 use three different subsegments for .debug_line: one holding the
40 prolog, one for the directory and filename info, and one for the
41 body ("statement program"). */
42 #define DL_PROLOG 0
43 #define DL_FILES 1
44 #define DL_BODY 2
45
46 /* First special line opcde - leave room for the standard opcodes.
47 Note: If you want to change this, you'll have to update the
48 "standard_opcode_lengths" table that is emitted below in
49 dwarf2_finish(). */
50 #define DWARF2_LINE_OPCODE_BASE 10
51
52 #ifndef DWARF2_LINE_BASE
53 /* Minimum line offset in a special line info. opcode. This value
54 was chosen to give a reasonable range of values. */
55 # define DWARF2_LINE_BASE -5
56 #endif
57
58 /* Range of line offsets in a special line info. opcode. */
59 #ifndef DWARF2_LINE_RANGE
60 # define DWARF2_LINE_RANGE 14
61 #endif
62
63 #ifndef DWARF2_LINE_MIN_INSN_LENGTH
64 /* Define the architecture-dependent minimum instruction length (in
65 bytes). This value should be rather too small than too big. */
66 # define DWARF2_LINE_MIN_INSN_LENGTH 4
67 #endif
68
69 /* Flag that indicates the initial value of the is_stmt_start flag.
70 In the present implementation, we do not mark any lines as
71 the beginning of a source statement, because that information
72 is not made available by the GCC front-end. */
73 #define DWARF2_LINE_DEFAULT_IS_STMT 1
74
75 /* Flag that indicates the initial value of the is_stmt_start flag.
76 In the present implementation, we do not mark any lines as
77 the beginning of a source statement, because that information
78 is not made available by the GCC front-end. */
79 #define DWARF2_LINE_DEFAULT_IS_STMT 1
80
81 /* Given a special op, return the line skip amount: */
82 #define SPECIAL_LINE(op) \
83 (((op) - DWARF2_LINE_OPCODE_BASE)%DWARF2_LINE_RANGE + DWARF2_LINE_BASE)
84
85 /* Given a special op, return the address skip amount (in units of
86 DWARF2_LINE_MIN_INSN_LENGTH. */
87 #define SPECIAL_ADDR(op) (((op) - DWARF2_LINE_OPCODE_BASE)/DWARF2_LINE_RANGE)
88
89 /* The maximum address skip amont that can be encoded with a special op: */
90 #define MAX_SPECIAL_ADDR_DELTA SPECIAL_ADDR(255)
91
92 #define INITIAL_STATE \
93 /* initialize as per DWARF2.0 standard: */ \
94 0, /* address */ \
95 1, /* file */ \
96 1, /* line */ \
97 0, /* column */ \
98 DWARF2_LINE_DEFAULT_IS_STMT, /* is_stmt */ \
99 0, /* basic_block */ \
100 1 /* empty_sequence */
101
102 static struct
103 {
104 /* state machine state as per DWARF2 manual: */
105 struct dwarf2_sm
106 {
107 addressT addr;
108 unsigned int filenum;
109 unsigned int line;
110 unsigned int column;
111 unsigned int
112 is_stmt : 1,
113 basic_block : 1,
114 empty_sequence : 1; /* current code sequence has no DWARF2 directives? */
115 }
116 sm;
117
118 unsigned int
119 any_dwarf2_directives : 1; /* did we emit any DWARF2 line debug directives? */
120
121 segT text_seg; /* text segment "addr" is relative to */
122 subsegT text_subseg;
123 segT line_seg; /* ".debug_line" segment */
124 int last_filename; /* index of last filename that was used */
125 int num_filenames; /* index of last filename in use */
126 int filename_len; /* length of the filename array */
127 struct
128 {
129 int dir; /* valid after gen_dir_list() only */
130 char *name; /* full path before gen_dir_list(), filename afterwards */
131 }
132 *file;
133
134 struct dwarf2_line_info current; /* current source info: */
135
136 /* counters for statistical purposes: */
137 unsigned int num_line_entries;
138 unsigned int opcode_hist[256]; /* histogram of opcode frequencies */
139 }
140 ls =
141 {
142 {
143 INITIAL_STATE
144 },
145 0,
146 0,
147 0,
148 0,
149 0,
150 0,
151 0,
152 NULL,
153 { NULL, 0, 0, 0, 0 },
154 0,
155 {
156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
157 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
158 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
159 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
160 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
161 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
162 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
163 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
164 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
165 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
166 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
167 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
168 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
169 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
170 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
171 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
172 }
173 };
174
175
176 /* Function prototypes: */
177 static void out_uleb128 PARAMS ((addressT));
178 static void out_sleb128 PARAMS ((offsetT));
179 static void gen_addr_line PARAMS ((int, addressT));
180 static void reset_state_machine PARAMS ((void));
181 static void out_set_addr PARAMS ((addressT));
182 static void out_end_sequence PARAMS ((void));
183 static int get_filenum PARAMS ((int, char *));
184 static void gen_dir_list PARAMS ((void));
185 static void gen_file_list PARAMS ((void));
186 static void print_stats PARAMS ((unsigned long));
187
188
189 #define out_byte(byte) FRAG_APPEND_1_CHAR(byte)
190 #define out_opcode(opc) (out_byte ((opc)), ++ls.opcode_hist[(opc) & 0xff])
191
192 /* Output an unsigned "little-endian base 128" number. */
193 static void
194 out_uleb128 (value)
195 addressT value;
196 {
197 unsigned char byte, more = 0x80;
198
199 do
200 {
201 byte = value & 0x7f;
202 value >>= 7;
203 if (value == 0)
204 more = 0;
205 out_byte (more | byte);
206 }
207 while (more);
208 }
209
210 /* Output a signed "little-endian base 128" number. */
211 static void
212 out_sleb128 (value)
213 offsetT value;
214 {
215 unsigned char byte, more = 0x80;
216
217 do
218 {
219 byte = value & 0x7f;
220 value >>= 7;
221 if (((value == 0) && ((byte & 0x40) == 0))
222 || ((value == -1) && ((byte & 0x40) != 0)))
223 more = 0;
224 out_byte (more | byte);
225 }
226 while (more);
227 }
228
229 /* Encode a pair of line and address skips as efficiently as possible.
230 Note that the line skip is signed, whereas the address skip is
231 unsigned. */
232 static void
233 gen_addr_line (line_delta, addr_delta)
234 int line_delta;
235 addressT addr_delta;
236 {
237 unsigned int tmp, opcode;
238
239 tmp = line_delta - DWARF2_LINE_BASE;
240
241 if (tmp >= DWARF2_LINE_RANGE)
242 {
243 out_opcode (DW_LNS_advance_line);
244 out_sleb128 (line_delta);
245 tmp = 0 - DWARF2_LINE_BASE;
246 line_delta = 0;
247 }
248
249 tmp += DWARF2_LINE_OPCODE_BASE;
250
251 /* try using a special opcode: */
252 opcode = tmp + addr_delta*DWARF2_LINE_RANGE;
253 if (opcode <= 255)
254 {
255 out_opcode (opcode);
256 return;
257 }
258
259 /* try using DW_LNS_const_add_pc followed by special op: */
260 opcode = tmp + (addr_delta - MAX_SPECIAL_ADDR_DELTA)*DWARF2_LINE_RANGE;
261 if (opcode <= 255)
262 {
263 out_opcode (DW_LNS_const_add_pc);
264 out_opcode (opcode);
265 return;
266 }
267
268 out_opcode (DW_LNS_advance_pc);
269 out_uleb128 (addr_delta);
270
271 if (line_delta)
272 out_opcode (tmp); /* output line-delta */
273 else
274 out_opcode (DW_LNS_copy); /* append new row with current info */
275 }
276
277 static void
278 reset_state_machine ()
279 {
280 static const struct dwarf2_sm initial_state = { INITIAL_STATE };
281
282 ls.sm = initial_state;
283 }
284
285 /* Set an absolute address (may results in a relocation entry): */
286 static void
287 out_set_addr (addr)
288 addressT addr;
289 {
290 subsegT saved_subseg;
291 segT saved_seg;
292 expressionS expr;
293 symbolS *sym;
294 int bytes_per_address;
295
296 saved_seg = now_seg;
297 saved_subseg = now_subseg;
298
299 subseg_set (ls.text_seg, ls.text_subseg);
300 sym = symbol_new (".L0\001", now_seg, addr, frag_now);
301
302 subseg_set (saved_seg, saved_subseg);
303
304 #ifdef BFD_ASSEMBLER
305 bytes_per_address = bfd_arch_bits_per_address (stdoutput) / 8;
306 #else
307 /* FIXME. */
308 bytes_per_address = 4;
309 #endif
310
311 out_opcode (DW_LNS_extended_op);
312 out_uleb128 (bytes_per_address + 1);
313
314 out_opcode (DW_LNE_set_address);
315 expr.X_op = O_symbol;
316 expr.X_add_symbol = sym;
317 expr.X_add_number = 0;
318 emit_expr (&expr, bytes_per_address);
319 }
320
321 /* Emit DW_LNS_end_sequence and reset state machine. Does not
322 preserve the current segment/sub-segment! */
323 static void
324 out_end_sequence ()
325 {
326 addressT addr, delta;
327
328 if (ls.text_seg)
329 {
330 subseg_set (ls.text_seg, ls.text_subseg);
331 #ifdef md_current_text_addr
332 addr = md_current_text_addr ();
333 #else
334 addr = frag_now_fix ();
335 #endif
336 subseg_set (ls.line_seg, DL_BODY);
337 if (addr < ls.sm.addr)
338 {
339 out_set_addr (addr);
340 ls.sm.addr = addr;
341 }
342 else
343 {
344 delta = (addr - ls.sm.addr) / DWARF2_LINE_MIN_INSN_LENGTH;
345 if (delta > 0)
346 {
347 /* Advance address without updating the line-debug
348 matrix---the end_sequence entry is used only to tell
349 the debugger the end of the sequence.*/
350 out_opcode (DW_LNS_advance_pc);
351 out_uleb128 (delta);
352 }
353 }
354 }
355 else
356 subseg_set (ls.line_seg, DL_BODY);
357
358 out_opcode (DW_LNS_extended_op);
359 out_uleb128 (1);
360 out_byte (DW_LNE_end_sequence);
361
362 reset_state_machine ();
363 }
364
365 /* Look up a filenumber either by filename or by filenumber. If both
366 a filenumber and a filename are specified, lookup by filename takes
367 precedence. If the filename cannot be found, it is added to the
368 filetable and the filenumber for the new entry is returned. */
369 static int
370 get_filenum (filenum, file)
371 int filenum;
372 char *file;
373 {
374 int i, last = filenum - 1;
375 char char0 = file[0];
376
377 /* If filenum is out of range of the filename table, then try using the
378 table entry returned from the previous call. */
379 if (last >= ls.num_filenames || last < 0)
380 last = ls.last_filename;
381
382 /* Do a quick check against the specified or previously used filenum. */
383 if (ls.num_filenames > 0 && ls.file[last].name[0] == char0
384 && strcmp (ls.file[last].name + 1, file + 1) == 0)
385 return last + 1;
386
387 /* no match, fall back to simple linear scan: */
388 for (i = 0; i < ls.num_filenames; ++i)
389 {
390 if (ls.file[i].name[0] == char0
391 && strcmp (ls.file[i].name + 1, file + 1) == 0)
392 {
393 ls.last_filename = i;
394 return i + 1;
395 }
396 }
397
398 /* no match: enter new filename */
399 if (ls.num_filenames >= ls.filename_len)
400 {
401 ls.filename_len += 13;
402 ls.file = xrealloc (ls.file, ls.filename_len * sizeof (ls.file[0]));
403 }
404 ls.file[ls.num_filenames].dir = 0;
405 ls.file[ls.num_filenames].name = file;
406 ls.last_filename = ls.num_filenames;
407 return ++ls.num_filenames;
408 }
409
410 void
411 dwarf2_gen_line_info (addr, l)
412 addressT addr;
413 struct dwarf2_line_info *l;
414 {
415 unsigned int filenum = l->filenum;
416 unsigned int any_output = 0;
417 subsegT saved_subseg;
418 segT saved_seg;
419
420 if (flag_debug)
421 fprintf (stderr, "line: addr %lx file `%s' line %u col %u flags %x\n",
422 (unsigned long) addr, l->filename, l->line, l->column, l->flags);
423
424 if (filenum > 0 && !l->filename)
425 {
426 if (filenum >= (unsigned int) ls.num_filenames)
427 {
428 as_warn ("Encountered bad file number in line number debug info!");
429 return;
430 }
431 }
432 else if (l->filename)
433 filenum = get_filenum (filenum, l->filename);
434 else
435 return; /* no filename, no filnum => no play */
436
437 /* Must save these before the subseg_new call, as that call will change
438 them. */
439 saved_seg = now_seg;
440 saved_subseg = now_subseg;
441
442 if (!ls.line_seg)
443 {
444 #ifdef BFD_ASSEMBLER
445 symbolS *secsym;
446 #endif
447
448 ls.line_seg = subseg_new (".debug_line", 0);
449
450 #ifdef BFD_ASSEMBLER
451 bfd_set_section_flags (stdoutput, ls.line_seg, SEC_READONLY);
452
453 /* We're going to need this symbol. */
454 secsym = symbol_find (".debug_line");
455 if (secsym != NULL)
456 symbol_set_bfdsym (secsym, ls.line_seg->symbol);
457 else
458 symbol_table_insert (section_symbol (ls.line_seg));
459 #endif
460 }
461
462 subseg_set (ls.line_seg, DL_BODY);
463
464 if (ls.text_seg != saved_seg || ls.text_subseg != saved_subseg)
465 {
466 if (!ls.sm.empty_sequence)
467 {
468 out_end_sequence (); /* terminate previous sequence */
469 ls.sm.empty_sequence = 1;
470 }
471 any_output = 1;
472 ls.text_seg = saved_seg;
473 ls.text_subseg = saved_subseg;
474 out_set_addr (addr);
475 ls.sm.addr = addr;
476 }
477
478 if (ls.sm.filenum != filenum)
479 {
480 any_output = 1;
481 out_opcode (DW_LNS_set_file);
482 out_uleb128 (filenum);
483 ls.sm.filenum = filenum;
484 }
485
486 if (ls.sm.column != l->column)
487 {
488 any_output = 1;
489 out_opcode (DW_LNS_set_column);
490 out_uleb128 (l->column);
491 ls.sm.column = l->column;
492 }
493
494 if (((l->flags & DWARF2_FLAG_BEGIN_STMT) != 0) != ls.sm.is_stmt)
495 {
496 any_output = 1;
497 out_opcode (DW_LNS_negate_stmt);
498 }
499
500 if (l->flags & DWARF2_FLAG_BEGIN_BLOCK)
501 {
502 any_output = 1;
503 out_opcode (DW_LNS_set_basic_block);
504 }
505
506 if (ls.sm.line != l->line)
507 {
508 any_output = 1;
509 if (addr < ls.sm.addr)
510 {
511 /* This happens when a new frag got allocated (for whatever
512 reason). Deal with it by generating a reference symbol.
513 Note: no end_sequence needs to be generated because the
514 address did not really decrease (only the reference point
515 changed).
516
517 ??? Perhaps we should directly check for a change of
518 frag_now instead? */
519 out_set_addr (addr);
520 ls.sm.addr = addr;
521 }
522 gen_addr_line (l->line - ls.sm.line,
523 (addr - ls.sm.addr) / DWARF2_LINE_MIN_INSN_LENGTH);
524 ls.sm.basic_block = 0;
525 ls.sm.line = l->line;
526 ls.sm.addr = addr;
527 }
528
529 subseg_set (saved_seg, saved_subseg);
530
531 ls.num_line_entries += any_output;
532 if (any_output)
533 ls.sm.empty_sequence = 0;
534 }
535
536 static void
537 gen_dir_list ()
538 {
539 char *str, *slash, *dir_list, *dp, *cp;
540 int i, j, num_dirs;
541
542 dir_list = frag_more (0);
543 num_dirs = 0;
544
545 for (i = 0; i < ls.num_filenames; ++i)
546 {
547 str = ls.file[i].name;
548 slash = strrchr (str, '/');
549 if (slash)
550 {
551 *slash = '\0';
552 for (j = 0, dp = dir_list; j < num_dirs; ++j)
553 {
554 if (strcmp (str, dp) == 0)
555 {
556 ls.file[i].dir = j + 1;
557 break;
558 }
559 dp += strlen (dp);
560 }
561 if (j >= num_dirs)
562 {
563 /* didn't find this directory: append it to the list */
564 size_t size = strlen (str) + 1;
565 cp = frag_more (size);
566 memcpy (cp, str, size);
567 ls.file[i].dir = ++num_dirs;
568 }
569 *slash = '/';
570 ls.file[i].name = slash + 1;
571 }
572 }
573 out_byte ('\0'); /* terminate directory list */
574 }
575
576 static void
577 gen_file_list ()
578 {
579 size_t size;
580 char *cp;
581 int i;
582
583 for (i = 0; i < ls.num_filenames; ++i)
584 {
585 size = strlen (ls.file[i].name) + 1;
586 cp = frag_more (size);
587 memcpy (cp, ls.file[i].name, size);
588
589 out_uleb128 (ls.file[i].dir); /* directory number */
590 out_uleb128 (0); /* last modification timestamp */
591 out_uleb128 (0); /* filesize */
592 }
593 out_byte (0); /* terminate filename list */
594 }
595
596 static void
597 print_stats (total_size)
598 unsigned long total_size;
599 {
600 static const char *opc_name[] =
601 {
602 "extended", "copy", "advance_pc", "advance_line", "set_file",
603 "set_column", "negate_stmt", "set_basic_block", "const_add_pc",
604 "fixed_advance_pc"
605 };
606 size_t i;
607 int j;
608
609 fprintf (stderr, "Average size: %g bytes/line\n",
610 total_size / (double) ls.num_line_entries);
611
612 fprintf (stderr, "\nStandard opcode histogram:\n");
613
614 for (i = 0; i < sizeof (opc_name)/sizeof (opc_name[0]); ++i)
615 {
616 fprintf (stderr, "%s", opc_name[i]);
617 for (j = strlen (opc_name[i]); j < 16; ++j)
618 fprintf (stderr, " ");
619 fprintf (stderr, ": %u\n", ls.opcode_hist[i]);
620 }
621
622 fprintf (stderr, "\nSpecial opcodes:\naddr\t\t\t\tline skip\n");
623
624 fprintf (stderr, "skip: ");
625 for (j = DWARF2_LINE_BASE; j < DWARF2_LINE_BASE + DWARF2_LINE_RANGE; ++j)
626 fprintf (stderr, "%3d", j);
627 fprintf (stderr, "\n-----");
628
629 for (; i < 256; ++i)
630 {
631 j = SPECIAL_LINE (i);
632 if (j == DWARF2_LINE_BASE)
633 fprintf (stderr, "\n%4u: ",
634 DWARF2_LINE_MIN_INSN_LENGTH*SPECIAL_ADDR (i));
635 fprintf (stderr, " %2u", ls.opcode_hist[i]);
636 }
637 fprintf (stderr, "\n");
638 }
639
640 void
641 dwarf2_finish ()
642 {
643 addressT body_size, total_size, prolog_size;
644 subsegT saved_subseg;
645 segT saved_seg;
646 char *cp;
647
648 if (!ls.line_seg)
649 /* no .debug_line segment, no work to do... */
650 return;
651
652 saved_seg = now_seg;
653 saved_subseg = now_subseg;
654
655 if (!ls.sm.empty_sequence)
656 out_end_sequence ();
657 total_size = body_size = frag_now_fix ();
658
659 /* now generate the directory and file lists: */
660 subseg_set (ls.line_seg, DL_FILES);
661 gen_dir_list ();
662 gen_file_list ();
663 total_size += frag_now_fix ();
664
665 /* and now the header ("statement program prolog", in DWARF2 lingo...) */
666 subseg_set (ls.line_seg, DL_PROLOG);
667
668 cp = frag_more (15 + DWARF2_LINE_OPCODE_BASE - 1);
669
670 total_size += frag_now_fix ();
671 prolog_size = total_size - body_size - 10;
672
673 # define STUFF(val,size) md_number_to_chars (cp, val, size); cp += size;
674 STUFF (total_size - 4, 4); /* length */
675 STUFF (2, 2); /* version */
676 STUFF (prolog_size, 4); /* prologue_length */
677 STUFF (DWARF2_LINE_MIN_INSN_LENGTH, 1);
678 STUFF (DWARF2_LINE_DEFAULT_IS_STMT, 1);
679 STUFF (DWARF2_LINE_BASE, 1);
680 STUFF (DWARF2_LINE_RANGE, 1);
681 STUFF (DWARF2_LINE_OPCODE_BASE, 1);
682
683 /* standard_opcode_lengths: */
684 STUFF (0, 1); /* DW_LNS_copy */
685 STUFF (1, 1); /* DW_LNS_advance_pc */
686 STUFF (1, 1); /* DW_LNS_advance_line */
687 STUFF (1, 1); /* DW_LNS_set_file */
688 STUFF (1, 1); /* DW_LNS_set_column */
689 STUFF (0, 1); /* DW_LNS_negate_stmt */
690 STUFF (0, 1); /* DW_LNS_set_basic_block */
691 STUFF (0, 1); /* DW_LNS_const_add_pc */
692 STUFF (1, 1); /* DW_LNS_fixed_advance_pc */
693
694 subseg_set (saved_seg, saved_subseg);
695
696 if (flag_debug)
697 print_stats (total_size);
698 }
699
700 void
701 dwarf2_directive_file (dummy)
702 int dummy ATTRIBUTE_UNUSED;
703 {
704 int len;
705
706 /* Continue to accept a bare string and pass it off. */
707 SKIP_WHITESPACE ();
708 if (*input_line_pointer == '"')
709 {
710 s_app_file (0);
711 return;
712 }
713
714 ls.any_dwarf2_directives = 1;
715
716 if (debug_type == DEBUG_NONE)
717 /* Automatically turn on DWARF2 debug info unless something else
718 has been selected. */
719 debug_type = DEBUG_DWARF2;
720
721 ls.current.filenum = get_absolute_expression ();
722 ls.current.filename = demand_copy_C_string (&len);
723
724 demand_empty_rest_of_line ();
725 }
726
727 void
728 dwarf2_directive_loc (dummy)
729 int dummy ATTRIBUTE_UNUSED;
730 {
731 ls.any_dwarf2_directives = 1;
732
733 ls.current.filenum = get_absolute_expression ();
734 SKIP_WHITESPACE ();
735 ls.current.line = get_absolute_expression ();
736 SKIP_WHITESPACE ();
737 ls.current.column = get_absolute_expression ();
738 demand_empty_rest_of_line ();
739
740 ls.current.flags = DWARF2_FLAG_BEGIN_STMT;
741
742 #ifndef NO_LISTING
743 if (listing)
744 listing_source_line (ls.current.line);
745 #endif
746 }
747
748 void
749 dwarf2_where (line)
750 struct dwarf2_line_info *line;
751 {
752 if (ls.any_dwarf2_directives)
753 *line = ls.current;
754 else
755 {
756 as_where (&line->filename, &line->line);
757 line->filenum = 0;
758 line->column = 0;
759 line->flags = DWARF2_FLAG_BEGIN_STMT;
760 }
761 }
This page took 0.045841 seconds and 4 git commands to generate.