2009-10-23 Kai Tietz <kai.tietz@onevision.com>
[binutils.git] / gas / listing.c
blobd1c291c3aeb3b340c29e1fd7110a752b430d92dd
1 /* listing.c - maintain assembly listings
2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
3 2001, 2002, 2003, 2005, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
6 This file is part of GAS, the GNU Assembler.
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
23 /* Contributed by Steve Chamberlain <sac@cygnus.com>
25 A listing page looks like:
27 LISTING_HEADER sourcefilename pagenumber
28 TITLE LINE
29 SUBTITLE LINE
30 linenumber address data source
31 linenumber address data source
32 linenumber address data source
33 linenumber address data source
35 If not overridden, the listing commands are:
37 .title "stuff"
38 Put "stuff" onto the title line
39 .sbttl "stuff"
40 Put stuff onto the subtitle line
42 If these commands come within 10 lines of the top of the page, they
43 will affect the page they are on, as well as any subsequent page
45 .eject
46 Thow a page
47 .list
48 Increment the enable listing counter
49 .nolist
50 Decrement the enable listing counter
52 .psize Y[,X]
53 Set the paper size to X wide and Y high. Setting a psize Y of
54 zero will suppress form feeds except where demanded by .eject
56 If the counter goes below zero, listing is suppressed.
58 Listings are a maintained by read calling various listing_<foo>
59 functions. What happens most is that the macro NO_LISTING is not
60 defined (from the Makefile), then the macro LISTING_NEWLINE expands
61 into a call to listing_newline. The call is done from read.c, every
62 time it sees a newline, and -l is on the command line.
64 The function listing_newline remembers the frag associated with the
65 newline, and creates a new frag - note that this is wasteful, but not
66 a big deal, since listing slows things down a lot anyway. The
67 function also remembers when the filename changes.
69 When all the input has finished, and gas has had a chance to settle
70 down, the listing is output. This is done by running down the list of
71 frag/source file records, and opening the files as needed and printing
72 out the bytes and chars associated with them.
74 The only things which the architecture can change about the listing
75 are defined in these macros:
77 LISTING_HEADER The name of the architecture
78 LISTING_WORD_SIZE The make of the number of bytes in a word, this determines
79 the clumping of the output data. eg a value of
80 2 makes words look like 1234 5678, whilst 1
81 would make the same value look like 12 34 56
83 LISTING_LHS_WIDTH Number of words of above size for the lhs
85 LISTING_LHS_WIDTH_SECOND Number of words for the data on the lhs
86 for the second line
88 LISTING_LHS_CONT_LINES Max number of lines to use up for a continuation
89 LISTING_RHS_WIDTH Number of chars from the input file to print
90 on a line. */
92 #include "as.h"
93 #include "obstack.h"
94 #include "safe-ctype.h"
95 #include "input-file.h"
96 #include "subsegs.h"
97 #include "bfdver.h"
98 #include <time.h>
99 #include <stdarg.h>
101 #ifndef NO_LISTING
103 #ifndef LISTING_HEADER
104 #define LISTING_HEADER "GAS LISTING"
105 #endif
106 #ifndef LISTING_WORD_SIZE
107 #define LISTING_WORD_SIZE 4
108 #endif
109 #ifndef LISTING_LHS_WIDTH
110 #define LISTING_LHS_WIDTH ((LISTING_WORD_SIZE) > 4 ? 1 : 4 / (LISTING_WORD_SIZE))
111 #endif
112 #ifndef LISTING_LHS_WIDTH_SECOND
113 #define LISTING_LHS_WIDTH_SECOND LISTING_LHS_WIDTH
114 #endif
115 #ifndef LISTING_RHS_WIDTH
116 #define LISTING_RHS_WIDTH 100
117 #endif
118 #ifndef LISTING_LHS_CONT_LINES
119 #define LISTING_LHS_CONT_LINES 4
120 #endif
121 #define MAX_DATELEN 30
123 /* This structure remembers which .s were used. */
124 typedef struct file_info_struct
126 struct file_info_struct * next;
127 char * filename;
128 long pos;
129 unsigned int linenum;
130 int at_end;
131 } file_info_type;
133 enum edict_enum
135 EDICT_NONE,
136 EDICT_SBTTL,
137 EDICT_TITLE,
138 EDICT_NOLIST,
139 EDICT_LIST,
140 EDICT_NOLIST_NEXT,
141 EDICT_EJECT
145 /* This structure remembers which line from which file goes into which
146 frag. */
147 struct list_info_struct
149 /* Frag which this line of source is nearest to. */
150 fragS *frag;
152 /* The actual line in the source file. */
153 unsigned int line;
155 /* Pointer to the file info struct for the file which this line
156 belongs to. */
157 file_info_type *file;
159 /* The expanded text of any macro that may have been executing. */
160 char *line_contents;
162 /* Next in list. */
163 struct list_info_struct *next;
165 /* Pointer to the file info struct for the high level language
166 source line that belongs here. */
167 file_info_type *hll_file;
169 /* High level language source line. */
170 unsigned int hll_line;
172 /* Pointer to any error message associated with this line. */
173 char *message;
175 enum edict_enum edict;
176 char *edict_arg;
178 /* Nonzero if this line is to be omitted because it contains
179 debugging information. This can become a flags field if we come
180 up with more information to store here. */
181 int debugging;
184 typedef struct list_info_struct list_info_type;
186 int listing_lhs_width = LISTING_LHS_WIDTH;
187 int listing_lhs_width_second = LISTING_LHS_WIDTH_SECOND;
188 int listing_lhs_cont_lines = LISTING_LHS_CONT_LINES;
189 int listing_rhs_width = LISTING_RHS_WIDTH;
191 struct list_info_struct * listing_tail;
193 static file_info_type * file_info_head;
194 static file_info_type * last_open_file_info;
195 static FILE * last_open_file;
196 static struct list_info_struct * head;
197 static int paper_width = 200;
198 static int paper_height = 60;
200 extern int listing;
202 /* File to output listings to. */
203 static FILE *list_file;
205 /* This static array is used to keep the text of data to be printed
206 before the start of the line. */
208 #define MAX_BYTES \
209 (((LISTING_WORD_SIZE * 2) + 1) * listing_lhs_width \
210 + ((((LISTING_WORD_SIZE * 2) + 1) * listing_lhs_width_second) \
211 * listing_lhs_cont_lines) \
212 + 20)
214 static char *data_buffer;
216 /* Prototypes. */
217 static void listing_message (const char *, const char *);
218 static file_info_type *file_info (const char *);
219 static void new_frag (void);
220 static void listing_page (list_info_type *);
221 static unsigned int calc_hex (list_info_type *);
222 static void print_lines (list_info_type *, unsigned int, char *, unsigned int);
223 static void list_symbol_table (void);
224 static int debugging_pseudo (list_info_type *, const char *);
225 static void listing_listing (char *);
227 static void
228 listing_message (const char *name, const char *message)
230 if (listing_tail != (list_info_type *) NULL)
232 unsigned int l = strlen (name) + strlen (message) + 1;
233 char *n = (char *) xmalloc (l);
234 strcpy (n, name);
235 strcat (n, message);
236 listing_tail->message = n;
240 void
241 listing_warning (const char *message)
243 listing_message (_("Warning:"), message);
246 void
247 listing_error (const char *message)
249 listing_message (_("Error:"), message);
252 static file_info_type *
253 file_info (const char *file_name)
255 /* Find an entry with this file name. */
256 file_info_type *p = file_info_head;
258 while (p != (file_info_type *) NULL)
260 if (strcmp (p->filename, file_name) == 0)
261 return p;
262 p = p->next;
265 /* Make new entry. */
266 p = (file_info_type *) xmalloc (sizeof (file_info_type));
267 p->next = file_info_head;
268 file_info_head = p;
269 p->filename = xstrdup (file_name);
270 p->pos = 0;
271 p->linenum = 0;
272 p->at_end = 0;
274 return p;
277 static void
278 new_frag (void)
280 frag_wane (frag_now);
281 frag_new (0);
284 void
285 listing_newline (char *ps)
287 char *file;
288 unsigned int line;
289 static unsigned int last_line = 0xffff;
290 static char *last_file = NULL;
291 list_info_type *new_i = NULL;
293 if (listing == 0)
294 return;
296 if (now_seg == absolute_section)
297 return;
299 #ifdef OBJ_ELF
300 /* In ELF, anything in a section beginning with .debug or .line is
301 considered to be debugging information. This includes the
302 statement which switches us into the debugging section, which we
303 can only set after we are already in the debugging section. */
304 if ((listing & LISTING_NODEBUG) != 0
305 && listing_tail != NULL
306 && ! listing_tail->debugging)
308 const char *segname;
310 segname = segment_name (now_seg);
311 if (strncmp (segname, ".debug", sizeof ".debug" - 1) == 0
312 || strncmp (segname, ".line", sizeof ".line" - 1) == 0)
313 listing_tail->debugging = 1;
315 #endif
317 as_where (&file, &line);
318 if (ps == NULL)
320 if (line == last_line
321 && !(last_file && file && strcmp (file, last_file)))
322 return;
324 new_i = (list_info_type *) xmalloc (sizeof (list_info_type));
326 /* Detect if we are reading from stdin by examining the file
327 name returned by as_where().
329 [FIXME: We rely upon the name in the strcmp below being the
330 same as the one used by input_scrub_new_file(), if that is
331 not true, then this code will fail].
333 If we are reading from stdin, then we need to save each input
334 line here (assuming of course that we actually have a line of
335 input to read), so that it can be displayed in the listing
336 that is produced at the end of the assembly. */
337 if (strcmp (file, _("{standard input}")) == 0
338 && input_line_pointer != NULL)
340 char *copy;
341 int len;
342 int seen_quote = 0;
343 int seen_slash = 0;
345 for (copy = input_line_pointer;
346 *copy && (seen_quote
347 || is_end_of_line [(unsigned char) *copy] != 1);
348 copy++)
350 if (*copy == '\\')
351 seen_slash = ! seen_slash;
352 else if (*copy == '"' && seen_slash)
353 seen_quote = ! seen_quote;
356 len = copy - input_line_pointer + 1;
358 copy = (char *) xmalloc (len);
360 if (copy != NULL)
362 char *src = input_line_pointer;
363 char *dest = copy;
365 while (--len)
367 unsigned char c = *src++;
369 /* Omit control characters in the listing. */
370 if (!ISCNTRL (c))
371 *dest++ = c;
374 *dest = 0;
377 new_i->line_contents = copy;
379 else
380 new_i->line_contents = NULL;
382 else
384 new_i = (list_info_type *) xmalloc (sizeof (list_info_type));
385 new_i->line_contents = ps;
388 last_line = line;
389 last_file = file;
391 new_frag ();
393 if (listing_tail)
394 listing_tail->next = new_i;
395 else
396 head = new_i;
398 listing_tail = new_i;
400 new_i->frag = frag_now;
401 new_i->line = line;
402 new_i->file = file_info (file);
403 new_i->next = (list_info_type *) NULL;
404 new_i->message = (char *) NULL;
405 new_i->edict = EDICT_NONE;
406 new_i->hll_file = (file_info_type *) NULL;
407 new_i->hll_line = 0;
408 new_i->debugging = 0;
410 new_frag ();
412 #ifdef OBJ_ELF
413 /* In ELF, anything in a section beginning with .debug or .line is
414 considered to be debugging information. */
415 if ((listing & LISTING_NODEBUG) != 0)
417 const char *segname;
419 segname = segment_name (now_seg);
420 if (strncmp (segname, ".debug", sizeof ".debug" - 1) == 0
421 || strncmp (segname, ".line", sizeof ".line" - 1) == 0)
422 new_i->debugging = 1;
424 #endif
427 /* Attach all current frags to the previous line instead of the
428 current line. This is called by the MIPS backend when it discovers
429 that it needs to add some NOP instructions; the added NOP
430 instructions should go with the instruction that has the delay, not
431 with the new instruction. */
433 void
434 listing_prev_line (void)
436 list_info_type *l;
437 fragS *f;
439 if (head == (list_info_type *) NULL
440 || head == listing_tail)
441 return;
443 new_frag ();
445 for (l = head; l->next != listing_tail; l = l->next)
448 for (f = frchain_now->frch_root; f != (fragS *) NULL; f = f->fr_next)
449 if (f->line == listing_tail)
450 f->line = l;
452 listing_tail->frag = frag_now;
453 new_frag ();
456 /* This function returns the next source line from the file supplied,
457 truncated to size. It appends a fake line to the end of each input
458 file to make using the returned buffer simpler. */
460 static char *
461 buffer_line (file_info_type *file, char *line, unsigned int size)
463 unsigned int count = 0;
464 int c;
465 char *p = line;
467 /* If we couldn't open the file, return an empty line. */
468 if (file->at_end)
469 return "";
471 /* Check the cache and see if we last used this file. */
472 if (!last_open_file_info || file != last_open_file_info)
474 if (last_open_file)
476 last_open_file_info->pos = ftell (last_open_file);
477 fclose (last_open_file);
480 /* Open the file in the binary mode so that ftell above can
481 return a reliable value that we can feed to fseek below. */
482 last_open_file_info = file;
483 last_open_file = fopen (file->filename, FOPEN_RB);
484 if (last_open_file == NULL)
486 file->at_end = 1;
487 return "";
490 /* Seek to where we were last time this file was open. */
491 if (file->pos)
492 fseek (last_open_file, file->pos, SEEK_SET);
495 /* Leave room for null. */
496 size -= 1;
498 c = fgetc (last_open_file);
500 while (c != EOF && c != '\n' && c != '\r')
502 if (count < size)
503 *p++ = c;
504 count++;
506 c = fgetc (last_open_file);
509 /* If '\r' is followed by '\n', swallow that. Likewise, if '\n'
510 is followed by '\r', swallow that as well. */
511 if (c == '\r' || c == '\n')
513 int next = fgetc (last_open_file);
515 if ((c == '\r' && next != '\n')
516 || (c == '\n' && next != '\r'))
517 ungetc (next, last_open_file);
520 if (c == EOF)
522 file->at_end = 1;
523 if (count + 2 < size)
525 *p++ = '.';
526 *p++ = '.';
527 *p++ = '.';
530 file->linenum++;
531 *p++ = 0;
532 return line;
536 /* This function rewinds the requested file back to the line requested,
537 reads it in again into the buffer provided and then restores the file
538 back to its original location. */
540 static char *
541 rebuffer_line (file_info_type * file,
542 unsigned int linenum,
543 char * buffer,
544 unsigned int size)
546 unsigned int count = 0;
547 unsigned int current_line = 1;
548 char * p = buffer;
549 long pos;
550 int c;
552 /* Sanity checks. */
553 if (file == NULL || buffer == NULL || size == 0 || file->linenum <= linenum)
554 return "";
556 /* Check the cache and see if we last used this file. */
557 if (last_open_file_info == NULL || file != last_open_file_info)
559 if (last_open_file)
561 last_open_file_info->pos = ftell (last_open_file);
562 fclose (last_open_file);
565 /* Open the file in the binary mode so that ftell above can
566 return a reliable value that we can feed to fseek below. */
567 last_open_file_info = file;
568 last_open_file = fopen (file->filename, FOPEN_RB);
569 if (last_open_file == NULL)
571 file->at_end = 1;
572 return "";
575 /* Seek to where we were last time this file was open. */
576 if (file->pos)
577 fseek (last_open_file, file->pos, SEEK_SET);
580 /* Remember where we are in the current file. */
581 pos = ftell (last_open_file);
583 /* Go back to the beginning. */
584 fseek (last_open_file, 0, SEEK_SET);
586 /* Skip lines prior to the one we are interested in. */
587 while (current_line < linenum)
589 /* fgets only stops on newlines and has a size limit,
590 so we read one character at a time instead. */
593 c = fgetc (last_open_file);
595 while (c != EOF && c != '\n' && c != '\r');
597 ++ current_line;
599 if (c == '\r' || c == '\n')
601 int next = fgetc (last_open_file);
603 /* If '\r' is followed by '\n', swallow that. Likewise, if '\n'
604 is followed by '\r', swallow that as well. */
605 if ((c == '\r' && next != '\n')
606 || (c == '\n' && next != '\r'))
607 ungetc (next, last_open_file);
611 /* Leave room for the nul at the end of the buffer. */
612 size -= 1;
614 /* Read in the line. */
615 c = fgetc (last_open_file);
617 while (c != EOF && c != '\n' && c != '\r')
619 if (count < size)
620 *p++ = c;
621 count++;
623 c = fgetc (last_open_file);
626 /* If '\r' is followed by '\n', swallow that. Likewise, if '\n'
627 is followed by '\r', swallow that as well. */
628 if (c == '\r' || c == '\n')
630 int next = fgetc (last_open_file);
632 if ((c == '\r' && next != '\n')
633 || (c == '\n' && next != '\r'))
634 ungetc (next, last_open_file);
637 /* Terminate the line. */
638 *p++ = 0;
640 /* Reset the file position. */
641 fseek (last_open_file, pos, SEEK_SET);
643 return buffer;
646 static const char *fn;
648 static unsigned int eject; /* Eject pending */
649 static unsigned int page; /* Current page number */
650 static char *title; /* Current title */
651 static char *subtitle; /* Current subtitle */
652 static unsigned int on_page; /* Number of lines printed on current page */
654 static void
655 listing_page (list_info_type *list)
657 /* Grope around, see if we can see a title or subtitle edict coming up
658 soon. (we look down 10 lines of the page and see if it's there) */
659 if ((eject || (on_page >= (unsigned int) paper_height))
660 && paper_height != 0)
662 unsigned int c = 10;
663 int had_title = 0;
664 int had_subtitle = 0;
666 page++;
668 while (c != 0 && list)
670 if (list->edict == EDICT_SBTTL && !had_subtitle)
672 had_subtitle = 1;
673 subtitle = list->edict_arg;
675 if (list->edict == EDICT_TITLE && !had_title)
677 had_title = 1;
678 title = list->edict_arg;
680 list = list->next;
681 c--;
684 if (page > 1)
686 fprintf (list_file, "\f");
689 fprintf (list_file, "%s %s \t\t\tpage %d\n", LISTING_HEADER, fn, page);
690 fprintf (list_file, "%s\n", title);
691 fprintf (list_file, "%s\n", subtitle);
692 on_page = 3;
693 eject = 0;
697 /* Print a line into the list_file. Update the line count
698 and if necessary start a new page. */
700 static void
701 emit_line (list_info_type * list, const char * format, ...)
703 va_list args;
705 va_start (args, format);
707 vfprintf (list_file, format, args);
708 on_page++;
709 listing_page (list);
711 va_end (args);
714 static unsigned int
715 calc_hex (list_info_type *list)
717 int data_buffer_size;
718 list_info_type *first = list;
719 unsigned int address = ~(unsigned int) 0;
720 fragS *frag;
721 fragS *frag_ptr;
722 unsigned int octet_in_frag;
724 /* Find first frag which says it belongs to this line. */
725 frag = list->frag;
726 while (frag && frag->line != list)
727 frag = frag->fr_next;
729 frag_ptr = frag;
731 data_buffer_size = 0;
733 /* Dump all the frags which belong to this line. */
734 while (frag_ptr != (fragS *) NULL && frag_ptr->line == first)
736 /* Print as many bytes from the fixed part as is sensible. */
737 octet_in_frag = 0;
738 while ((offsetT) octet_in_frag < frag_ptr->fr_fix
739 && data_buffer_size < MAX_BYTES - 3)
741 if (address == ~(unsigned int) 0)
742 address = frag_ptr->fr_address / OCTETS_PER_BYTE;
744 sprintf (data_buffer + data_buffer_size,
745 "%02X",
746 (frag_ptr->fr_literal[octet_in_frag]) & 0xff);
747 data_buffer_size += 2;
748 octet_in_frag++;
750 if (frag_ptr->fr_type == rs_fill)
752 unsigned int var_rep_max = octet_in_frag;
753 unsigned int var_rep_idx = octet_in_frag;
755 /* Print as many bytes from the variable part as is sensible. */
756 while (((offsetT) octet_in_frag
757 < (frag_ptr->fr_fix + frag_ptr->fr_var * frag_ptr->fr_offset))
758 && data_buffer_size < MAX_BYTES - 3)
760 if (address == ~(unsigned int) 0)
761 address = frag_ptr->fr_address / OCTETS_PER_BYTE;
763 sprintf (data_buffer + data_buffer_size,
764 "%02X",
765 (frag_ptr->fr_literal[var_rep_idx]) & 0xff);
766 data_buffer_size += 2;
768 var_rep_idx++;
769 octet_in_frag++;
771 if ((offsetT) var_rep_idx >= frag_ptr->fr_fix + frag_ptr->fr_var)
772 var_rep_idx = var_rep_max;
776 frag_ptr = frag_ptr->fr_next;
778 data_buffer[data_buffer_size] = '\0';
779 return address;
782 static void
783 print_lines (list_info_type *list, unsigned int lineno,
784 char *string, unsigned int address)
786 unsigned int idx;
787 unsigned int nchars;
788 unsigned int lines;
789 unsigned int octet_in_word = 0;
790 char *src = data_buffer;
791 int cur;
793 /* Print the stuff on the first line. */
794 listing_page (list);
795 nchars = (LISTING_WORD_SIZE * 2 + 1) * listing_lhs_width;
797 /* Print the hex for the first line. */
798 if (address == ~(unsigned int) 0)
800 fprintf (list_file, "% 4d ", lineno);
801 for (idx = 0; idx < nchars; idx++)
802 fprintf (list_file, " ");
804 emit_line (NULL, "\t%s\n", string ? string : "");
805 return;
808 if (had_errors ())
809 fprintf (list_file, "% 4d ???? ", lineno);
810 else
811 fprintf (list_file, "% 4d %04x ", lineno, address);
813 /* And the data to go along with it. */
814 idx = 0;
815 cur = 0;
816 while (src[cur] && idx < nchars)
818 int offset;
819 offset = cur;
820 fprintf (list_file, "%c%c", src[offset], src[offset + 1]);
821 cur += 2;
822 octet_in_word++;
824 if (octet_in_word == LISTING_WORD_SIZE)
826 fprintf (list_file, " ");
827 idx++;
828 octet_in_word = 0;
831 idx += 2;
834 for (; idx < nchars; idx++)
835 fprintf (list_file, " ");
837 emit_line (list, "\t%s\n", string ? string : "");
839 if (list->message)
840 emit_line (list, "**** %s\n", list->message);
842 for (lines = 0;
843 lines < (unsigned int) listing_lhs_cont_lines
844 && src[cur];
845 lines++)
847 nchars = ((LISTING_WORD_SIZE * 2) + 1) * listing_lhs_width_second - 1;
848 idx = 0;
850 /* Print any more lines of data, but more compactly. */
851 fprintf (list_file, "% 4d ", lineno);
853 while (src[cur] && idx < nchars)
855 int offset;
856 offset = cur;
857 fprintf (list_file, "%c%c", src[offset], src[offset + 1]);
858 cur += 2;
859 idx += 2;
860 octet_in_word++;
862 if (octet_in_word == LISTING_WORD_SIZE)
864 fprintf (list_file, " ");
865 idx++;
866 octet_in_word = 0;
870 emit_line (list, "\n");
874 static void
875 list_symbol_table (void)
877 extern symbolS *symbol_rootP;
878 int got_some = 0;
880 symbolS *ptr;
881 eject = 1;
882 listing_page (NULL);
884 for (ptr = symbol_rootP; ptr != (symbolS *) NULL; ptr = symbol_next (ptr))
886 if (SEG_NORMAL (S_GET_SEGMENT (ptr))
887 || S_GET_SEGMENT (ptr) == absolute_section)
889 /* Don't report section symbols. They are not interesting. */
890 if (symbol_section_p (ptr))
891 continue;
893 if (S_GET_NAME (ptr))
895 char buf[30], fmt[8];
896 valueT val = S_GET_VALUE (ptr);
898 /* @@ Note that this is dependent on the compilation options,
899 not solely on the target characteristics. */
900 if (sizeof (val) == 4 && sizeof (int) == 4)
901 sprintf (buf, "%08lx", (unsigned long) val);
902 else if (sizeof (val) <= sizeof (unsigned long))
904 sprintf (fmt, "%%0%lulx",
905 (unsigned long) (sizeof (val) * 2));
906 sprintf (buf, fmt, (unsigned long) val);
908 #if defined (BFD64)
909 else if (sizeof (val) > 4)
910 sprintf_vma (buf, val);
911 #endif
912 else
913 abort ();
915 if (!got_some)
917 fprintf (list_file, "DEFINED SYMBOLS\n");
918 on_page++;
919 got_some = 1;
922 if (symbol_get_frag (ptr) && symbol_get_frag (ptr)->line)
924 fprintf (list_file, "%20s:%-5d %s:%s %s\n",
925 symbol_get_frag (ptr)->line->file->filename,
926 symbol_get_frag (ptr)->line->line,
927 segment_name (S_GET_SEGMENT (ptr)),
928 buf, S_GET_NAME (ptr));
930 else
932 fprintf (list_file, "%33s:%s %s\n",
933 segment_name (S_GET_SEGMENT (ptr)),
934 buf, S_GET_NAME (ptr));
937 on_page++;
938 listing_page (NULL);
943 if (!got_some)
945 fprintf (list_file, "NO DEFINED SYMBOLS\n");
946 on_page++;
948 emit_line (NULL, "\n");
950 got_some = 0;
952 for (ptr = symbol_rootP; ptr != (symbolS *) NULL; ptr = symbol_next (ptr))
954 if (S_GET_NAME (ptr) && strlen (S_GET_NAME (ptr)) != 0)
956 if (S_GET_SEGMENT (ptr) == undefined_section)
958 if (!got_some)
960 got_some = 1;
962 emit_line (NULL, "UNDEFINED SYMBOLS\n");
965 emit_line (NULL, "%s\n", S_GET_NAME (ptr));
970 if (!got_some)
971 emit_line (NULL, "NO UNDEFINED SYMBOLS\n");
974 typedef struct cached_line
976 file_info_type * file;
977 unsigned int line;
978 char buffer [LISTING_RHS_WIDTH];
979 } cached_line;
981 static void
982 print_source (file_info_type * current_file,
983 list_info_type * list,
984 unsigned int width)
986 #define NUM_CACHE_LINES 3
987 static cached_line cached_lines[NUM_CACHE_LINES];
988 static int next_free_line = 0;
989 cached_line * cache = NULL;
991 if (current_file->linenum > list->hll_line
992 && list->hll_line > 0)
994 /* This can happen with modern optimizing compilers. The source
995 lines from the high level language input program are split up
996 and interleaved, meaning the line number we want to display
997 (list->hll_line) can have already been displayed. We have
998 three choices:
1000 a. Do nothing, since we have already displayed the source
1001 line. This was the old behaviour.
1003 b. Display the particular line requested again, but only
1004 that line. This is the new behaviour.
1006 c. Display the particular line requested again and reset
1007 the current_file->line_num value so that we redisplay
1008 all the following lines as well the next time we
1009 encounter a larger line number. */
1010 int i;
1012 /* Check the cache, maybe we already have the line saved. */
1013 for (i = 0; i < NUM_CACHE_LINES; i++)
1014 if (cached_lines[i].file == current_file
1015 && cached_lines[i].line == list->hll_line)
1017 cache = cached_lines + i;
1018 break;
1021 if (i == NUM_CACHE_LINES)
1023 cache = cached_lines + next_free_line;
1024 next_free_line ++;
1025 if (next_free_line == NUM_CACHE_LINES)
1026 next_free_line = 0;
1028 cache->file = current_file;
1029 cache->line = list->hll_line;
1030 cache->buffer[0] = 0;
1031 rebuffer_line (current_file, cache->line, cache->buffer, width);
1034 emit_line (list, "%4u:%-13s **** %s\n",
1035 cache->line, cache->file->filename, cache->buffer);
1036 return;
1039 if (!current_file->at_end)
1041 int num_lines_shown = 0;
1043 while (current_file->linenum < list->hll_line
1044 && !current_file->at_end)
1046 cached_line * cache = cached_lines + next_free_line;
1047 char *p;
1049 cache->file = current_file;
1050 cache->line = current_file->linenum;
1051 cache->buffer[0] = 0;
1052 p = buffer_line (current_file, cache->buffer, width);
1054 /* Cache optimization: If printing a group of lines
1055 cache the first and last lines in the group. */
1056 if (num_lines_shown == 0)
1058 next_free_line ++;
1059 if (next_free_line == NUM_CACHE_LINES)
1060 next_free_line = 0;
1063 emit_line (list, "%4u:%-13s **** %s\n",
1064 cache->line, cache->file->filename, p);
1065 num_lines_shown ++;
1070 /* Sometimes the user doesn't want to be bothered by the debugging
1071 records inserted by the compiler, see if the line is suspicious. */
1073 static int
1074 debugging_pseudo (list_info_type *list, const char *line)
1076 static int in_debug;
1077 int was_debug;
1079 if (list->debugging)
1081 in_debug = 1;
1082 return 1;
1085 was_debug = in_debug;
1086 in_debug = 0;
1088 while (ISSPACE (*line))
1089 line++;
1091 if (*line != '.')
1093 #ifdef OBJ_ELF
1094 /* The ELF compiler sometimes emits blank lines after switching
1095 out of a debugging section. If the next line drops us back
1096 into debugging information, then don't print the blank line.
1097 This is a hack for a particular compiler behaviour, not a
1098 general case. */
1099 if (was_debug
1100 && *line == '\0'
1101 && list->next != NULL
1102 && list->next->debugging)
1104 in_debug = 1;
1105 return 1;
1107 #endif
1109 return 0;
1112 line++;
1114 if (strncmp (line, "def", 3) == 0)
1115 return 1;
1116 if (strncmp (line, "val", 3) == 0)
1117 return 1;
1118 if (strncmp (line, "scl", 3) == 0)
1119 return 1;
1120 if (strncmp (line, "line", 4) == 0)
1121 return 1;
1122 if (strncmp (line, "endef", 5) == 0)
1123 return 1;
1124 if (strncmp (line, "ln", 2) == 0)
1125 return 1;
1126 if (strncmp (line, "type", 4) == 0)
1127 return 1;
1128 if (strncmp (line, "size", 4) == 0)
1129 return 1;
1130 if (strncmp (line, "dim", 3) == 0)
1131 return 1;
1132 if (strncmp (line, "tag", 3) == 0)
1133 return 1;
1134 if (strncmp (line, "stabs", 5) == 0)
1135 return 1;
1136 if (strncmp (line, "stabn", 5) == 0)
1137 return 1;
1139 return 0;
1142 static void
1143 listing_listing (char *name ATTRIBUTE_UNUSED)
1145 list_info_type *list = head;
1146 file_info_type *current_hll_file = (file_info_type *) NULL;
1147 char *message;
1148 char *buffer;
1149 char *p;
1150 int show_listing = 1;
1151 unsigned int width;
1153 buffer = (char *) xmalloc (listing_rhs_width);
1154 data_buffer = (char *) xmalloc (MAX_BYTES);
1155 eject = 1;
1156 list = head->next;
1158 while (list)
1160 unsigned int list_line;
1162 width = listing_rhs_width > paper_width ? paper_width :
1163 listing_rhs_width;
1165 list_line = list->line;
1166 switch (list->edict)
1168 case EDICT_LIST:
1169 /* Skip all lines up to the current. */
1170 list_line--;
1171 break;
1172 case EDICT_NOLIST:
1173 show_listing--;
1174 break;
1175 case EDICT_NOLIST_NEXT:
1176 if (show_listing == 0)
1177 list_line--;
1178 break;
1179 case EDICT_EJECT:
1180 break;
1181 case EDICT_NONE:
1182 break;
1183 case EDICT_TITLE:
1184 title = list->edict_arg;
1185 break;
1186 case EDICT_SBTTL:
1187 subtitle = list->edict_arg;
1188 break;
1189 default:
1190 abort ();
1193 if (show_listing <= 0)
1195 while (list->file->linenum < list_line
1196 && !list->file->at_end)
1197 p = buffer_line (list->file, buffer, width);
1200 if (list->edict == EDICT_LIST
1201 || (list->edict == EDICT_NOLIST_NEXT && show_listing == 0))
1203 /* Enable listing for the single line that caused the enable. */
1204 list_line++;
1205 show_listing++;
1208 if (show_listing > 0)
1210 /* Scan down the list and print all the stuff which can be done
1211 with this line (or lines). */
1212 message = 0;
1214 if (list->hll_file)
1215 current_hll_file = list->hll_file;
1217 if (current_hll_file && list->hll_line && (listing & LISTING_HLL))
1218 print_source (current_hll_file, list, width);
1220 if (list->line_contents)
1222 if (!((listing & LISTING_NODEBUG)
1223 && debugging_pseudo (list, list->line_contents)))
1224 print_lines (list,
1225 list->file->linenum == 0 ? list->line : list->file->linenum,
1226 list->line_contents, calc_hex (list));
1228 free (list->line_contents);
1229 list->line_contents = NULL;
1231 else
1233 while (list->file->linenum < list_line
1234 && !list->file->at_end)
1236 unsigned int address;
1238 p = buffer_line (list->file, buffer, width);
1240 if (list->file->linenum < list_line)
1241 address = ~(unsigned int) 0;
1242 else
1243 address = calc_hex (list);
1245 if (!((listing & LISTING_NODEBUG)
1246 && debugging_pseudo (list, p)))
1247 print_lines (list, list->file->linenum, p, address);
1251 if (list->edict == EDICT_EJECT)
1252 eject = 1;
1255 if (list->edict == EDICT_NOLIST_NEXT && show_listing == 1)
1256 --show_listing;
1258 list = list->next;
1261 free (buffer);
1262 free (data_buffer);
1263 data_buffer = NULL;
1266 /* Print time stamp in ISO format: yyyy-mm-ddThh:mm:ss.ss+/-zzzz. */
1268 static void
1269 print_timestamp (void)
1271 const time_t now = time (NULL);
1272 struct tm * timestamp;
1273 char stampstr[MAX_DATELEN];
1275 /* Any portable way to obtain subsecond values??? */
1276 timestamp = localtime (&now);
1277 strftime (stampstr, MAX_DATELEN, "%Y-%m-%dT%H:%M:%S.000%z", timestamp);
1278 fprintf (list_file, _("\n time stamp \t: %s\n\n"), stampstr);
1281 static void
1282 print_single_option (char * opt, int *pos)
1284 int opt_len = strlen (opt);
1286 if ((*pos + opt_len) < paper_width)
1288 fprintf (list_file, _("%s "), opt);
1289 *pos = *pos + opt_len;
1291 else
1293 fprintf (list_file, _("\n\t%s "), opt);
1294 *pos = opt_len;
1298 /* Print options passed to as. */
1300 static void
1301 print_options (char ** argv)
1303 const char *field_name = _("\n options passed\t: ");
1304 int pos = strlen (field_name);
1305 char **p;
1307 fputs (field_name, list_file);
1308 for (p = &argv[1]; *p != NULL; p++)
1309 if (**p == '-')
1311 /* Ignore these. */
1312 if (strcmp (*p, "-o") == 0)
1314 if (p[1] != NULL)
1315 p++;
1316 continue;
1318 if (strcmp (*p, "-v") == 0)
1319 continue;
1321 print_single_option (*p, &pos);
1325 /* Print a first section with basic info like file names, as version,
1326 options passed, target, and timestamp.
1327 The format of this section is as follows:
1329 AS VERSION
1331 fieldname TAB ':' fieldcontents
1332 { TAB fieldcontents-cont } */
1334 static void
1335 listing_general_info (char ** argv)
1337 /* Print the stuff on the first line. */
1338 eject = 1;
1339 listing_page (NULL);
1341 fprintf (list_file,
1342 _(" GNU assembler version %s (%s)\n\t using BFD version %s."),
1343 VERSION, TARGET_ALIAS, BFD_VERSION_STRING);
1344 print_options (argv);
1345 fprintf (list_file, _("\n input file \t: %s"), fn);
1346 fprintf (list_file, _("\n output file \t: %s"), out_file_name);
1347 fprintf (list_file, _("\n target \t: %s"), TARGET_CANONICAL);
1348 print_timestamp ();
1351 void
1352 listing_print (char *name, char **argv)
1354 int using_stdout;
1356 title = "";
1357 subtitle = "";
1359 if (name == NULL)
1361 list_file = stdout;
1362 using_stdout = 1;
1364 else
1366 list_file = fopen (name, FOPEN_WT);
1367 if (list_file != NULL)
1368 using_stdout = 0;
1369 else
1371 as_warn (_("can't open %s: %s"), name, xstrerror (errno));
1372 list_file = stdout;
1373 using_stdout = 1;
1377 if (listing & LISTING_NOFORM)
1378 paper_height = 0;
1380 if (listing & LISTING_GENERAL)
1381 listing_general_info (argv);
1383 if (listing & LISTING_LISTING)
1384 listing_listing (name);
1386 if (listing & LISTING_SYMBOLS)
1387 list_symbol_table ();
1389 if (! using_stdout)
1391 if (fclose (list_file) == EOF)
1392 as_warn (_("can't close %s: %s"), name, xstrerror (errno));
1395 if (last_open_file)
1396 fclose (last_open_file);
1399 void
1400 listing_file (const char *name)
1402 fn = name;
1405 void
1406 listing_eject (int ignore ATTRIBUTE_UNUSED)
1408 if (listing)
1409 listing_tail->edict = EDICT_EJECT;
1412 void
1413 listing_flags (int ignore ATTRIBUTE_UNUSED)
1415 while ((*input_line_pointer++) && (*input_line_pointer != '\n'))
1416 input_line_pointer++;
1420 /* Turn listing on or off. An argument of 0 means to turn off
1421 listing. An argument of 1 means to turn on listing. An argument
1422 of 2 means to turn off listing, but as of the next line; that is,
1423 the current line should be listed, but the next line should not. */
1425 void
1426 listing_list (int on)
1428 if (listing)
1430 switch (on)
1432 case 0:
1433 if (listing_tail->edict == EDICT_LIST)
1434 listing_tail->edict = EDICT_NONE;
1435 else
1436 listing_tail->edict = EDICT_NOLIST;
1437 break;
1438 case 1:
1439 if (listing_tail->edict == EDICT_NOLIST
1440 || listing_tail->edict == EDICT_NOLIST_NEXT)
1441 listing_tail->edict = EDICT_NONE;
1442 else
1443 listing_tail->edict = EDICT_LIST;
1444 break;
1445 case 2:
1446 listing_tail->edict = EDICT_NOLIST_NEXT;
1447 break;
1448 default:
1449 abort ();
1454 void
1455 listing_psize (int width_only)
1457 if (! width_only)
1459 paper_height = get_absolute_expression ();
1461 if (paper_height < 0 || paper_height > 1000)
1463 paper_height = 0;
1464 as_warn (_("strange paper height, set to no form"));
1467 if (*input_line_pointer != ',')
1469 demand_empty_rest_of_line ();
1470 return;
1473 ++input_line_pointer;
1476 paper_width = get_absolute_expression ();
1478 demand_empty_rest_of_line ();
1481 void
1482 listing_nopage (int ignore ATTRIBUTE_UNUSED)
1484 paper_height = 0;
1487 void
1488 listing_title (int depth)
1490 int quoted;
1491 char *start;
1492 char *ttl;
1493 unsigned int length;
1495 SKIP_WHITESPACE ();
1496 if (*input_line_pointer != '\"')
1497 quoted = 0;
1498 else
1500 quoted = 1;
1501 ++input_line_pointer;
1504 start = input_line_pointer;
1506 while (*input_line_pointer)
1508 if (quoted
1509 ? *input_line_pointer == '\"'
1510 : is_end_of_line[(unsigned char) *input_line_pointer])
1512 if (listing)
1514 length = input_line_pointer - start;
1515 ttl = (char *) xmalloc (length + 1);
1516 memcpy (ttl, start, length);
1517 ttl[length] = 0;
1518 listing_tail->edict = depth ? EDICT_SBTTL : EDICT_TITLE;
1519 listing_tail->edict_arg = ttl;
1521 if (quoted)
1522 input_line_pointer++;
1523 demand_empty_rest_of_line ();
1524 return;
1526 else if (*input_line_pointer == '\n')
1528 as_bad (_("new line in title"));
1529 demand_empty_rest_of_line ();
1530 return;
1532 else
1534 input_line_pointer++;
1539 void
1540 listing_source_line (unsigned int line)
1542 if (listing)
1544 new_frag ();
1545 listing_tail->hll_line = line;
1546 new_frag ();
1550 void
1551 listing_source_file (const char *file)
1553 if (listing)
1554 listing_tail->hll_file = file_info (file);
1557 #else
1559 /* Dummy functions for when compiled without listing enabled. */
1561 void
1562 listing_flags (int ignore)
1564 s_ignore (0);
1567 void
1568 listing_list (int on)
1570 s_ignore (0);
1573 void
1574 listing_eject (int ignore)
1576 s_ignore (0);
1579 void
1580 listing_psize (int ignore)
1582 s_ignore (0);
1585 void
1586 listing_nopage (int ignore)
1588 s_ignore (0);
1591 void
1592 listing_title (int depth)
1594 s_ignore (0);
1597 void
1598 listing_file (const char *name)
1602 void
1603 listing_newline (char *name)
1607 void
1608 listing_source_line (unsigned int n)
1612 void
1613 listing_source_file (const char *n)
1617 #endif