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, 2010
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)
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
23 /* Contributed by Steve Chamberlain <sac@cygnus.com>
25 A listing page looks like:
27 LISTING_HEADER sourcefilename pagenumber
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:
38 Put "stuff" onto the title line
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
48 Increment the enable listing counter
50 Decrement the enable listing counter
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
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
94 #include "safe-ctype.h"
95 #include "input-file.h"
103 #ifndef LISTING_HEADER
104 #define LISTING_HEADER "GAS LISTING"
106 #ifndef LISTING_WORD_SIZE
107 #define LISTING_WORD_SIZE 4
109 #ifndef LISTING_LHS_WIDTH
110 #define LISTING_LHS_WIDTH ((LISTING_WORD_SIZE) > 4 ? 1 : 4 / (LISTING_WORD_SIZE))
112 #ifndef LISTING_LHS_WIDTH_SECOND
113 #define LISTING_LHS_WIDTH_SECOND LISTING_LHS_WIDTH
115 #ifndef LISTING_RHS_WIDTH
116 #define LISTING_RHS_WIDTH 100
118 #ifndef LISTING_LHS_CONT_LINES
119 #define LISTING_LHS_CONT_LINES 4
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
;
129 unsigned int linenum
;
145 /* This structure remembers which line from which file goes into which
147 struct list_info_struct
149 /* Frag which this line of source is nearest to. */
152 /* The actual line in the source file. */
155 /* Pointer to the file info struct for the file which this line
157 file_info_type
*file
;
159 /* The expanded text of any macro that may have been executing. */
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. */
175 enum edict_enum edict
;
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. */
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;
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. */
209 (((LISTING_WORD_SIZE * 2) + 1) * listing_lhs_width \
210 + ((((LISTING_WORD_SIZE * 2) + 1) * listing_lhs_width_second) \
211 * listing_lhs_cont_lines) \
214 static char *data_buffer
;
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 *);
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
);
236 listing_tail
->message
= n
;
241 listing_warning (const char *message
)
243 listing_message (_("Warning:"), message
);
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)
265 /* Make new entry. */
266 p
= (file_info_type
*) xmalloc (sizeof (file_info_type
));
267 p
->next
= file_info_head
;
269 p
->filename
= xstrdup (file_name
);
280 frag_wane (frag_now
);
285 listing_newline (char *ps
)
289 static unsigned int last_line
= 0xffff;
290 static char *last_file
= NULL
;
291 list_info_type
*new_i
= NULL
;
296 if (now_seg
== absolute_section
)
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
)
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;
317 as_where (&file
, &line
);
320 if (line
== last_line
321 && !(last_file
&& file
&& strcmp (file
, last_file
)))
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
)
345 for (copy
= input_line_pointer
;
347 || is_end_of_line
[(unsigned char) *copy
] != 1);
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
);
362 char *src
= input_line_pointer
;
367 unsigned char c
= *src
++;
369 /* Omit control characters in the listing. */
377 new_i
->line_contents
= copy
;
380 new_i
->line_contents
= NULL
;
384 new_i
= (list_info_type
*) xmalloc (sizeof (list_info_type
));
385 new_i
->line_contents
= ps
;
394 listing_tail
->next
= new_i
;
398 listing_tail
= new_i
;
400 new_i
->frag
= frag_now
;
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
;
408 new_i
->debugging
= 0;
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)
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;
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. */
434 listing_prev_line (void)
439 if (head
== (list_info_type
*) NULL
440 || head
== listing_tail
)
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
)
452 listing_tail
->frag
= frag_now
;
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. */
461 buffer_line (file_info_type
*file
, char *line
, unsigned int size
)
463 unsigned int count
= 0;
467 /* If we couldn't open the file, return an empty line. */
471 /* Check the cache and see if we last used this file. */
472 if (!last_open_file_info
|| file
!= last_open_file_info
)
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
)
490 /* Seek to where we were last time this file was open. */
492 fseek (last_open_file
, file
->pos
, SEEK_SET
);
495 /* Leave room for null. */
498 c
= fgetc (last_open_file
);
500 while (c
!= EOF
&& c
!= '\n' && c
!= '\r')
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
);
523 if (count
+ 2 < size
)
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. */
541 rebuffer_line (file_info_type
* file
,
542 unsigned int linenum
,
546 unsigned int count
= 0;
547 unsigned int current_line
= 1;
553 if (file
== NULL
|| buffer
== NULL
|| size
== 0 || file
->linenum
<= linenum
)
556 /* Check the cache and see if we last used this file. */
557 if (last_open_file_info
== NULL
|| file
!= last_open_file_info
)
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
)
575 /* Seek to where we were last time this file was open. */
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');
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. */
614 /* Read in the line. */
615 c
= fgetc (last_open_file
);
617 while (c
!= EOF
&& c
!= '\n' && c
!= '\r')
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. */
640 /* Reset the file position. */
641 fseek (last_open_file
, pos
, SEEK_SET
);
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 */
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)
664 int had_subtitle
= 0;
668 while (c
!= 0 && list
)
670 if (list
->edict
== EDICT_SBTTL
&& !had_subtitle
)
673 subtitle
= list
->edict_arg
;
675 if (list
->edict
== EDICT_TITLE
&& !had_title
)
678 title
= list
->edict_arg
;
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
);
697 /* Print a line into the list_file. Update the line count
698 and if necessary start a new page. */
701 emit_line (list_info_type
* list
, const char * format
, ...)
705 va_start (args
, format
);
707 vfprintf (list_file
, format
, args
);
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;
722 unsigned int octet_in_frag
;
724 /* Find first frag which says it belongs to this line. */
726 while (frag
&& frag
->line
!= list
)
727 frag
= frag
->fr_next
;
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. */
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
,
746 (frag_ptr
->fr_literal
[octet_in_frag
]) & 0xff);
747 data_buffer_size
+= 2;
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
,
765 (frag_ptr
->fr_literal
[var_rep_idx
]) & 0xff);
766 data_buffer_size
+= 2;
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';
783 print_lines (list_info_type
*list
, unsigned int lineno
,
784 char *string
, unsigned int address
)
789 unsigned int octet_in_word
= 0;
790 char *src
= data_buffer
;
793 /* Print the stuff on the first line. */
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
: "");
809 fprintf (list_file
, "% 4d ???? ", lineno
);
811 fprintf (list_file
, "% 4d %04x ", lineno
, address
);
813 /* And the data to go along with it. */
816 while (src
[cur
] && idx
< nchars
)
820 fprintf (list_file
, "%c%c", src
[offset
], src
[offset
+ 1]);
824 if (octet_in_word
== LISTING_WORD_SIZE
)
826 fprintf (list_file
, " ");
834 for (; idx
< nchars
; idx
++)
835 fprintf (list_file
, " ");
837 emit_line (list
, "\t%s\n", string
? string
: "");
840 emit_line (list
, "**** %s\n", list
->message
);
843 lines
< (unsigned int) listing_lhs_cont_lines
847 nchars
= ((LISTING_WORD_SIZE
* 2) + 1) * listing_lhs_width_second
- 1;
850 /* Print any more lines of data, but more compactly. */
851 fprintf (list_file
, "% 4d ", lineno
);
853 while (src
[cur
] && idx
< nchars
)
857 fprintf (list_file
, "%c%c", src
[offset
], src
[offset
+ 1]);
862 if (octet_in_word
== LISTING_WORD_SIZE
)
864 fprintf (list_file
, " ");
870 emit_line (list
, "\n");
875 list_symbol_table (void)
877 extern symbolS
*symbol_rootP
;
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
))
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
);
909 else if (sizeof (val
) > 4)
910 sprintf_vma (buf
, val
);
917 fprintf (list_file
, "DEFINED SYMBOLS\n");
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
));
932 fprintf (list_file
, "%33s:%s %s\n",
933 segment_name (S_GET_SEGMENT (ptr
)),
934 buf
, S_GET_NAME (ptr
));
945 fprintf (list_file
, "NO DEFINED SYMBOLS\n");
948 emit_line (NULL
, "\n");
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
)
962 emit_line (NULL
, "UNDEFINED SYMBOLS\n");
965 emit_line (NULL
, "%s\n", S_GET_NAME (ptr
));
971 emit_line (NULL
, "NO UNDEFINED SYMBOLS\n");
974 typedef struct cached_line
976 file_info_type
* file
;
978 char buffer
[LISTING_RHS_WIDTH
];
982 print_source (file_info_type
* current_file
,
983 list_info_type
* list
,
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
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. */
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
;
1021 if (i
== NUM_CACHE_LINES
)
1023 cache
= cached_lines
+ next_free_line
;
1025 if (next_free_line
== NUM_CACHE_LINES
)
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
);
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
)
1048 cache
= cached_lines
+ next_free_line
;
1049 cache
->file
= current_file
;
1050 cache
->line
= current_file
->linenum
+ 1;
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)
1059 if (next_free_line
== NUM_CACHE_LINES
)
1063 emit_line (list
, "%4u:%-13s **** %s\n",
1064 cache
->line
, cache
->file
->filename
, p
);
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. */
1074 debugging_pseudo (list_info_type
*list
, const char *line
)
1076 static int in_debug
;
1079 if (list
->debugging
)
1085 was_debug
= in_debug
;
1088 while (ISSPACE (*line
))
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
1101 && list
->next
!= NULL
1102 && list
->next
->debugging
)
1114 if (strncmp (line
, "def", 3) == 0)
1116 if (strncmp (line
, "val", 3) == 0)
1118 if (strncmp (line
, "scl", 3) == 0)
1120 if (strncmp (line
, "line", 4) == 0)
1122 if (strncmp (line
, "endef", 5) == 0)
1124 if (strncmp (line
, "ln", 2) == 0)
1126 if (strncmp (line
, "type", 4) == 0)
1128 if (strncmp (line
, "size", 4) == 0)
1130 if (strncmp (line
, "dim", 3) == 0)
1132 if (strncmp (line
, "tag", 3) == 0)
1134 if (strncmp (line
, "stabs", 5) == 0)
1136 if (strncmp (line
, "stabn", 5) == 0)
1143 listing_listing (char *name ATTRIBUTE_UNUSED
)
1145 list_info_type
*list
= head
;
1146 file_info_type
*current_hll_file
= (file_info_type
*) NULL
;
1150 int show_listing
= 1;
1153 buffer
= (char *) xmalloc (listing_rhs_width
);
1154 data_buffer
= (char *) xmalloc (MAX_BYTES
);
1160 unsigned int list_line
;
1162 width
= listing_rhs_width
> paper_width
? paper_width
:
1165 list_line
= list
->line
;
1166 switch (list
->edict
)
1169 /* Skip all lines up to the current. */
1175 case EDICT_NOLIST_NEXT
:
1176 if (show_listing
== 0)
1184 title
= list
->edict_arg
;
1187 subtitle
= list
->edict_arg
;
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. */
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). */
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
)))
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
;
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;
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
)
1255 if (list
->edict
== EDICT_NOLIST_NEXT
&& show_listing
== 1)
1266 /* Print time stamp in ISO format: yyyy-mm-ddThh:mm:ss.ss+/-zzzz. */
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
);
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
;
1293 fprintf (list_file
, _("\n\t%s "), opt
);
1298 /* Print options passed to as. */
1301 print_options (char ** argv
)
1303 const char *field_name
= _("\n options passed\t: ");
1304 int pos
= strlen (field_name
);
1307 fputs (field_name
, list_file
);
1308 for (p
= &argv
[1]; *p
!= NULL
; p
++)
1312 if (strcmp (*p
, "-o") == 0)
1318 if (strcmp (*p
, "-v") == 0)
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:
1331 fieldname TAB ':' fieldcontents
1332 { TAB fieldcontents-cont } */
1335 listing_general_info (char ** argv
)
1337 /* Print the stuff on the first line. */
1339 listing_page (NULL
);
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
);
1352 listing_print (char *name
, char **argv
)
1366 list_file
= fopen (name
, FOPEN_WT
);
1367 if (list_file
!= NULL
)
1371 as_warn (_("can't open %s: %s"), name
, xstrerror (errno
));
1377 if (listing
& LISTING_NOFORM
)
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 ();
1391 if (fclose (list_file
) == EOF
)
1392 as_warn (_("can't close %s: %s"), name
, xstrerror (errno
));
1396 fclose (last_open_file
);
1400 listing_file (const char *name
)
1406 listing_eject (int ignore ATTRIBUTE_UNUSED
)
1409 listing_tail
->edict
= EDICT_EJECT
;
1412 /* Turn listing on or off. An argument of 0 means to turn off
1413 listing. An argument of 1 means to turn on listing. An argument
1414 of 2 means to turn off listing, but as of the next line; that is,
1415 the current line should be listed, but the next line should not. */
1418 listing_list (int on
)
1425 if (listing_tail
->edict
== EDICT_LIST
)
1426 listing_tail
->edict
= EDICT_NONE
;
1428 listing_tail
->edict
= EDICT_NOLIST
;
1431 if (listing_tail
->edict
== EDICT_NOLIST
1432 || listing_tail
->edict
== EDICT_NOLIST_NEXT
)
1433 listing_tail
->edict
= EDICT_NONE
;
1435 listing_tail
->edict
= EDICT_LIST
;
1438 listing_tail
->edict
= EDICT_NOLIST_NEXT
;
1447 listing_psize (int width_only
)
1451 paper_height
= get_absolute_expression ();
1453 if (paper_height
< 0 || paper_height
> 1000)
1456 as_warn (_("strange paper height, set to no form"));
1459 if (*input_line_pointer
!= ',')
1461 demand_empty_rest_of_line ();
1465 ++input_line_pointer
;
1468 paper_width
= get_absolute_expression ();
1470 demand_empty_rest_of_line ();
1474 listing_nopage (int ignore ATTRIBUTE_UNUSED
)
1480 listing_title (int depth
)
1485 unsigned int length
;
1488 if (*input_line_pointer
!= '\"')
1493 ++input_line_pointer
;
1496 start
= input_line_pointer
;
1498 while (*input_line_pointer
)
1501 ? *input_line_pointer
== '\"'
1502 : is_end_of_line
[(unsigned char) *input_line_pointer
])
1506 length
= input_line_pointer
- start
;
1507 ttl
= (char *) xmalloc (length
+ 1);
1508 memcpy (ttl
, start
, length
);
1510 listing_tail
->edict
= depth
? EDICT_SBTTL
: EDICT_TITLE
;
1511 listing_tail
->edict_arg
= ttl
;
1514 input_line_pointer
++;
1515 demand_empty_rest_of_line ();
1518 else if (*input_line_pointer
== '\n')
1520 as_bad (_("new line in title"));
1521 demand_empty_rest_of_line ();
1526 input_line_pointer
++;
1532 listing_source_line (unsigned int line
)
1537 listing_tail
->hll_line
= line
;
1543 listing_source_file (const char *file
)
1546 listing_tail
->hll_file
= file_info (file
);
1551 /* Dummy functions for when compiled without listing enabled. */
1554 listing_list (int on
)
1560 listing_eject (int ignore
)
1566 listing_psize (int ignore
)
1572 listing_nopage (int ignore
)
1578 listing_title (int depth
)
1584 listing_file (const char *name
)
1589 listing_newline (char *name
)
1594 listing_source_line (unsigned int n
)
1599 listing_source_file (const char *n
)