1 diff -urNbB binutils-2.16.91.0.2.org/gas/Makefile.am binutils-2.16.91.0.2/gas/Makefile.am
2 --- binutils-2.16.91.0.2.org/gas/Makefile.am 2005-07-20 19:27:27.000000000 +0000
3 +++ binutils-2.16.91.0.2/gas/Makefile.am 2005-07-21 18:35:02.000000000 +0000
8 -CFILES = $(GAS_CFILES) itbl-ops.c
9 +CFILES = $(GAS_CFILES) gasp.c itbl-ops.c
15 # Note: GASP is now deprecated and has been removed. It is still
16 # available in the CVS archive or older binutils releases if it is needed.
17 -noinst_PROGRAMS = as-new
18 +# ...and it is needed for few packages in distribution.
19 +noinst_PROGRAMS = as-new gasp-new
20 noinst_SCRIPTS = $(GDBINIT)
21 EXTRA_SCRIPTS = .gdbinit
24 as.h asintl.h bignum.h bit_fix.h config.h emul.h expr.h flonum.h \
25 frags.h hash.h listing.h obj.h read.h symbols.h tc.h write.h
27 +gasp_new_SOURCES = gasp.c macro.c sb.c hash.c
28 +gasp_new_LDADD = ../libiberty/libiberty.a $(INTLLIBS)
29 +gasp_new_DEPENDENCIES = ../libiberty/libiberty.a $(INTLDEPS)
35 $(INCDIR)/obstack.h subsegs.h struc-symbol.h
36 write.o: write.c $(INCDIR)/symcat.h subsegs.h $(INCDIR)/obstack.h \
37 output-file.h dwarf2dbg.h
38 +gasp.o: gasp.c $(INCDIR)/getopt.h $(INCDIR)/safe-ctype.h \
39 + sb.h macro.h $(INCDIR)/xregex.h $(INCDIR)/xregex2.h
40 itbl-ops.o: itbl-ops.c itbl-ops.h $(INCDIR)/symcat.h
41 e-crisaout.o: $(srcdir)/config/e-crisaout.c $(INCDIR)/symcat.h \
43 diff -urNbB binutils-2.16.91.0.2.org/gas/doc/Makefile.am binutils-2.16.91.0.2/gas/doc/Makefile.am
44 --- binutils-2.16.91.0.2.org/gas/doc/Makefile.am 2005-07-20 19:27:27.000000000 +0000
45 +++ binutils-2.16.91.0.2/gas/doc/Makefile.am 2005-07-21 18:31:04.000000000 +0000
50 -info_TEXINFOS = as.texinfo
51 +info_TEXINFOS = as.texinfo gasp.texinfo
53 asconfig.texi: $(CONFIG).texi
55 diff -urNbB binutils-2.16.91.0.2.org/gas/doc/gasp.texinfo binutils-2.16.91.0.2/gas/doc/gasp.texinfo
56 --- binutils-2.16.91.0.2.org/gas/doc/gasp.texinfo 1970-01-01 00:00:00.000000000 +0000
57 +++ binutils-2.16.91.0.2/gas/doc/gasp.texinfo 2005-07-21 18:31:04.000000000 +0000
59 +\input texinfo @c -*- Texinfo -*-
60 +@setfilename gasp.info
62 +@c This file documents the assembly preprocessor "GASP"
64 +@c Copyright 1994, 1995, 2000, 2002 Free Software Foundation, Inc.
66 +@c Permission is granted to copy, distribute and/or modify this document
67 +@c under the terms of the GNU Free Documentation License, Version 1.1
68 +@c or any later version published by the Free Software Foundation;
69 +@c with no Invariant Sections, with no Front-Cover Texts, and with no
70 +@c Back-Cover Texts. A copy of the license is included in the
71 +@c section entitled "GNU Free Documentation License".
76 +* gasp: (gasp). The GNU Assembler Preprocessor
85 +@setchapternewpage odd
88 +@c FIXME boring title
89 +@title GASP, an assembly preprocessor
90 +@subtitle for GASP version 1
97 +{\parskip=0pt \hfill Cygnus Support\par
101 +@vskip 0pt plus 1filll
102 +Copyright @copyright{} 1994, 1995, 2000, 2002 Free Software Foundation, Inc.
104 + Permission is granted to copy, distribute and/or modify this document
105 + under the terms of the GNU Free Documentation License, Version 1.1
106 + or any later version published by the Free Software Foundation;
107 + with no Invariant Sections, with no Front-Cover Texts, and with no
108 + Back-Cover Texts. A copy of the license is included in the
109 + section entitled "GNU Free Documentation License".
114 +Copyright @copyright{} 1994, 1995, 2000, 2002 Free Software Foundation, Inc.
117 +Permission is granted to process this file through TeX and print the
118 +results, provided the printed document carries a copying permission
119 +notice identical to this one except for the removal of this paragraph
120 +(this paragraph not being relevant to the printed manual).
123 + Permission is granted to copy, distribute and/or modify this document
124 + under the terms of the GNU Free Documentation License, Version 1.1
125 + or any later version published by the Free Software Foundation;
126 + with no Invariant Sections, with no Front-Cover Texts, and with no
127 + Back-Cover Texts. A copy of the license is included in the
128 + section entitled "GNU Free Documentation License".
134 +GASP is a preprocessor for assembly programs.
136 +This file describes version 1 of GASP.
138 +Steve Chamberlain wrote GASP; Roland Pesch wrote this manual.
141 +* Overview:: What is GASP?
142 +* Invoking GASP:: Command line options.
143 +* Commands:: Preprocessor commands.
144 +* GNU Free Documentation License:: GNU Free Documentation License
150 +@chapter What is GASP?
152 +The primary purpose of the @sc{gnu} assembler is to assemble the output of
153 +other programs---notably compilers. When you have to hand-code
154 +specialized routines in assembly, that means the @sc{gnu} assembler is
155 +an unfriendly processor: it has no directives for macros, conditionals,
156 +or many other conveniences that you might expect.
158 +In some cases you can simply use the C preprocessor, or a generalized
159 +preprocessor like @sc{m4}; but this can be awkward, since none of these
160 +things are designed with assembly in mind.
162 +@sc{gasp} fills this need. It is expressly designed to provide the
163 +facilities you need with hand-coded assembly code. Implementing it as a
164 +preprocessor, rather than part of the assembler, allows the maximum
165 +flexibility: you can use it with hand-coded assembly, without paying a
166 +penalty of added complexity in the assembler you use for compiler
169 +@emph{Note} The use of @sc{gasp} has now been deprecated. Anything
170 +that it could do can now be done by the macro facilities built into
171 +@sc{gas} itself. At some point in the future the @sc{gasp} sources will
172 +be removed entirely from the binutils distribution.
174 +Here is a small example to give the flavor of @sc{gasp}. This input to
179 + .MACRO saveregs from=8 to=14
180 +count .ASSIGNA \from
181 + ! save r\from..r\to
182 + .AWHILE \&count LE \to
184 +count .ASSIGNA \&count + 1
190 +bar: mov #H'dead+10,r0
191 +foo .SDATAC "hello"<10>
197 +generates this assembly program:
206 +bar: mov #57005+10,r0
207 +foo: .byte 6,104,101,108,108,111,10
212 +@chapter Command Line Options
214 +@c FIXME! Or is there a simpler way, calling from GAS option?
215 +The simplest way to use @sc{gasp} is to run it as a filter and assemble
216 +its output. In Unix and its ilk, you can do this, for example:
218 +@c FIXME! GASP filename suffix convention?
220 +$ gasp prog.asm | as -o prog.o
223 +Naturally, there are also a few command-line options to allow you to
224 +request variations on this basic theme. Here is the full set of
225 +possibilities for the @sc{gasp} command line.
228 +gasp [ -a | --alternate ]
229 + [ -c @var{char} | --commentchar @var{char} ]
230 + [ -d | --debug ] [ -h | --help ] [ -M | --mri ]
231 + [ -o @var{outfile} | --output @var{outfile} ]
232 + [ -p | --print ] [ -s | --copysource ]
233 + [ -u | --unreasonable ] [ -v | --version ]
234 + @var{infile} @dots{}
238 +@item @var{infile} @dots{}
239 +@c FIXME! Why not stdin as default infile?
240 +The input file names. You must specify at least one input file; if you
241 +specify more, @sc{gasp} preprocesses them all, concatenating the output
242 +in the order you list the @var{infile} arguments.
244 +Mark the end of each input file with the preprocessor command
245 +@code{.END}. @xref{Other Commands,, Miscellaneous commands}.
249 +Use alternative macro syntax. @xref{Alternate,, Alternate macro
250 +syntax}, for a discussion of how this syntax differs from the default
253 +@cindex comment character, changing
254 +@cindex semicolon, as comment
255 +@cindex exclamation mark, as comment
256 +@cindex shriek, as comment
257 +@cindex bang, as comment
258 +@cindex @code{!} default comment char
259 +@cindex @code{;} as comment char
260 +@item -c '@var{char}'
261 +@itemx --commentchar '@var{char}'
262 +Use @var{char} as the comment character. The default comment character
263 +is @samp{!}. For example, to use a semicolon as the comment character,
264 +specify @w{@samp{-c ';'}} on the @sc{gasp} command line. Since
265 +assembler command characters often have special significance to command
266 +shells, it is a good idea to quote or escape @var{char} when you specify
267 +a comment character.
269 +For the sake of simplicity, all examples in this manual use the default
270 +comment character @samp{!}.
274 +Show debugging statistics. In this version of @sc{gasp}, this option
275 +produces statistics about the string buffers that @sc{gasp} allocates
276 +internally. For each defined buffersize @var{s}, @sc{gasp} shows the
277 +number of strings @var{n} that it allocated, with a line like this:
280 +strings size @var{s} : @var{n}
284 +@sc{gasp} displays these statistics on the standard error stream, when
289 +Display a summary of the @sc{gasp} command line options.
293 +Use MRI compatibility mode. Using this option causes @sc{gasp} to
294 +accept the syntax and pseudo-ops used by the Microtec Research
295 +@code{ASM68K} assembler.
297 +@item -o @var{outfile}
298 +@itemx --output @var{outfile}
299 +Write the output in a file called @var{outfile}. If you do not use the
300 +@samp{-o} option, @sc{gasp} writes its output on the standard output
305 +Print line numbers. @sc{gasp} obeys this option @emph{only} if you also
306 +specify @samp{-s} to copy source lines to its output. With @samp{-s
307 +-p}, @sc{gasp} displays the line number of each source line copied
308 +(immediately after the comment character at the beginning of the line).
312 +Copy the source lines to the output file. Use this option
313 +to see the effect of each preprocessor line on the @sc{gasp} output.
314 +@sc{gasp} places a comment character (@samp{!} by default) at
315 +the beginning of each source line it copies, so that you can use this
316 +option and still assemble the result.
319 +@itemx --unreasonable
320 +Bypass ``unreasonable expansion'' limit. Since you can define @sc{gasp}
321 +macros inside other macro definitions, the preprocessor normally
322 +includes a sanity check. If your program requires more than 1,000
323 +nested expansions, @sc{gasp} normally exits with an error message. Use
324 +this option to turn off this check, allowing unlimited nested
329 +Display the @sc{gasp} version number.
333 +@chapter Preprocessor Commands
335 +@sc{gasp} commands have a straightforward syntax that fits in well with
336 +assembly conventions. In general, a command extends for a line, and may
337 +have up to three fields: an optional label, the command itself, and
338 +optional arguments to the command. You can write commands in upper or
339 +lower case, though this manual shows them in upper case. @xref{Syntax
340 +Details,, Details of the GASP syntax}, for more information.
355 +@section Conditional assembly
357 +The conditional-assembly directives allow you to include or exclude
358 +portions of an assembly depending on how a pair of expressions, or a
359 +pair of strings, compare.
361 +The overall structure of conditionals is familiar from many other
362 +contexts. @code{.AIF} marks the start of a conditional, and precedes
363 +assembly for the case when the condition is true. An optional
364 +@code{.AELSE} precedes assembly for the converse case, and an
365 +@code{.AENDI} marks the end of the condition.
367 +@c FIXME! Why doesn't -u turn off this check?
368 +You may nest conditionals up to a depth of 100; @sc{gasp} rejects
369 +nesting beyond that, because it may indicate a bug in your macro
372 +@c FIXME! Why isn't there something like cpp's -D option? Conditionals
373 +@c would be much more useful if there were.
374 +Conditionals are primarily useful inside macro definitions, where you
375 +often need different effects depending on argument values.
376 +@xref{Macros,, Defining your own directives}, for details about defining
380 +@item .AIF @var{expra} @var{cmp} @var{exprb}
381 +@itemx .AIF "@var{stra}" @var{cmp} "@var{strb}"
383 +The governing condition goes on the same line as the @code{.AIF}
384 +preprocessor command. You may compare either two strings, or two
387 +When you compare strings, only two conditional @var{cmp} comparison
388 +operators are available: @samp{EQ} (true if @var{stra} and @var{strb}
389 +are identical), and @samp{NE} (the opposite).
391 +When you compare two expressions, @emph{both expressions must be
392 +absolute} (@pxref{Expressions,, Arithmetic expressions in GASP}). You
393 +can use these @var{cmp} comparison operators with expressions:
397 +Are @var{expra} and @var{exprb} equal? (For strings, are @var{stra} and
398 +@var{strb} identical?)
401 +Are @var{expra} and @var{exprb} different? (For strings, are @var{stra}
402 +and @var{strb} different?
405 +Is @var{expra} less than @var{exprb}? (Not allowed for strings.)
408 +Is @var{expra} less than or equal to @var{exprb}? (Not allowed for strings.)
411 +Is @var{expra} greater than @var{exprb}? (Not allowed for strings.)
414 +Is @var{expra} greater than or equal to @var{exprb}? (Not allowed for
419 +Marks the start of assembly code to be included if the condition fails.
420 +Optional, and only allowed within a conditional (between @code{.AIF} and
424 +Marks the end of a conditional assembly.
428 +@section Repetitive sections of assembly
430 +Two preprocessor directives allow you to repeatedly issue copies of the
431 +same block of assembly code.
434 +@item .AREPEAT @var{aexp}
436 +If you simply need to repeat the same block of assembly over and over a
437 +fixed number of times, sandwich one instance of the repeated block
438 +between @code{.AREPEAT} and @code{.AENDR}. Specify the number of
439 +copies as @var{aexp} (which must be an absolute expression). For
440 +example, this repeats two assembly statements three times in succession:
451 +@item .AWHILE @var{expra} @var{cmp} @var{exprb}
453 +@itemx .AWHILE @var{stra} @var{cmp} @var{strb}
455 +To repeat a block of assembly depending on a conditional test, rather
456 +than repeating it for a specific number of times, use @code{.AWHILE}.
457 +@code{.AENDW} marks the end of the repeated block. The conditional
458 +comparison works exactly the same way as for @code{.AIF}, with the same
459 +comparison operators (@pxref{Conditionals,, Conditional assembly}).
461 +Since the terms of the comparison must be absolute expression,
462 +@code{.AWHILE} is primarily useful within macros. @xref{Macros,,
463 +Defining your own directives}.
466 +@cindex loops, breaking out of
467 +@cindex breaking out of loops
468 +You can use the @code{.EXITM} preprocessor directive to break out of
469 +loops early (as well as to break out of macros). @xref{Macros,,
470 +Defining your own directives}.
473 +@section Preprocessor variables
475 +You can use variables in @sc{gasp} to represent strings, registers, or
476 +the results of expressions.
478 +You must distinguish two kinds of variables:
481 +Variables defined with @code{.EQU} or @code{.ASSIGN}. To evaluate this
482 +kind of variable in your assembly output, simply mention its name. For
483 +example, these two lines define and use a variable @samp{eg}:
493 +@emph{Do not use} this kind of variable in conditional expressions or
494 +while loops; @sc{gasp} only evaluates these variables when writing
498 +Variables for use during preprocessing. You can define these
499 +with @code{.ASSIGNC} or @code{.ASSIGNA}. To evaluate this
500 +kind of variable, write @samp{\&} before the variable name; for example,
506 + .AWHILE \&opcit GT 0
512 +@sc{gasp} treats macro arguments almost the same way, but to evaluate
513 +them you use the prefix @samp{\} rather than @samp{\&}.
514 +@xref{Macros,, Defining your own directives}.
518 +@item @var{pvar} .EQU @var{expr}
519 +@c FIXME! Anything to beware of re GAS directive of same name?
520 +Assign preprocessor variable @var{pvar} the value of the expression
521 +@var{expr}. There are no restrictions on redefinition; use @samp{.EQU}
522 +with the same @var{pvar} as often as you find it convenient.
524 +@item @var{pvar} .ASSIGN @var{expr}
525 +Almost the same as @code{.EQU}, save that you may not redefine
526 +@var{pvar} using @code{.ASSIGN} once it has a value.
527 +@c FIXME!! Supposed to work this way, apparently, but on 9feb94 works
530 +@item @var{pvar} .ASSIGNA @var{aexpr}
531 +Define a variable with a numeric value, for use during preprocessing.
532 +@var{aexpr} must be an absolute expression. You can redefine variables
533 +with @code{.ASSIGNA} at any time.
535 +@item @var{pvar} .ASSIGNC "@var{str}"
536 +Define a variable with a string value, for use during preprocessing.
537 +You can redefine variables with @code{.ASSIGNC} at any time.
539 +@item @var{pvar} .REG (@var{register})
540 +Use @code{.REG} to define a variable that represents a register. In
541 +particular, @var{register} is @emph{not evaluated} as an expression.
542 +You may use @code{.REG} at will to redefine register variables.
545 +All these directives accept the variable name in the ``label'' position,
546 +that is at the left margin. You may specify a colon after the variable
547 +name if you wish; the first example above could have started @samp{eg:}
548 +with the same effect.
550 +@c pagebreak makes for better aesthetics---ensures macro and expansion together
553 +@section Defining your own directives
555 +The commands @code{.MACRO} and @code{.ENDM} allow you to define macros
556 +that generate assembly output. You can use these macros with a syntax
557 +similar to built-in @sc{gasp} or assembler directives. For example,
558 +this definition specifies a macro @code{SUM} that adds together a range of
559 +consecutive registers:
563 + .MACRO SUM FROM=0, TO=9
566 +COUNT .ASSIGNA \FROM+1
567 + .AWHILE \&COUNT LE \TO
569 +COUNT .ASSIGNA \&COUNT+1
576 +With that definition, @samp{SUM 0,5} generates this assembly output:
591 +@item .MACRO @var{macname}
592 +@itemx .MACRO @var{macname} @var{macargs} @dots{}
593 +Begin the definition of a macro called @var{macname}. If your macro
594 +definition requires arguments, specify their names after the macro name,
595 +separated by commas or spaces. You can supply a default value for any
596 +macro argument by following the name with @samp{=@var{deflt}}. For
597 +example, these are all valid @code{.MACRO} statements:
601 +Begin the definition of a macro called @code{COMM}, which takes no
604 +@item .MACRO PLUS1 P, P1
605 +@itemx .MACRO PLUS1 P P1
606 +Either statement begins the definition of a macro called @code{PLUS1},
607 +which takes two arguments; within the macro definition, write
608 +@samp{\P} or @samp{\P1} to evaluate the arguments.
610 +@item .MACRO RESERVE_STR P1=0 P2
611 +Begin the definition of a macro called @code{RESERVE_STR}, with two
612 +arguments. The first argument has a default value, but not the second.
613 +After the definition is complete, you can call the macro either as
614 +@samp{RESERVE_STR @var{a},@var{b}} (with @samp{\P1} evaluating to
615 +@var{a} and @samp{\P2} evaluating to @var{b}), or as @samp{RESERVE_STR
616 +,@var{b}} (with @samp{\P1} evaluating as the default, in this case
617 +@samp{0}, and @samp{\P2} evaluating to @var{b}).
620 +When you call a macro, you can specify the argument values either by
621 +position, or by keyword. For example, @samp{SUM 9,17} is equivalent to
622 +@samp{SUM TO=17, FROM=9}. Macro arguments are preprocessor variables
623 +similar to the variables you define with @samp{.ASSIGNA} or
624 +@samp{.ASSIGNC}; in particular, you can use them in conditionals or for
625 +loop control. (The only difference is the prefix you write to evaluate
626 +the variable: for a macro argument, write @samp{\@var{argname}}, but for
627 +a preprocessor variable, write @samp{\&@var{varname}}.)
629 +@item @var{name} .MACRO
630 +@itemx @var{name} .MACRO ( @var{macargs} @dots{} )
631 +@c FIXME check: I think no error _and_ no args recognized if I use form
632 +@c NAME .MACRO ARG ARG
633 +An alternative form of introducing a macro definition: specify the macro
634 +name in the label position, and the arguments (if any) between
635 +parentheses after the name. Defaulting rules and usage work the same
636 +way as for the other macro definition syntax.
639 +Mark the end of a macro definition.
642 +Exit early from the current macro definition, @code{.AREPEAT} loop, or
643 +@code{.AWHILE} loop.
645 +@cindex number of macros executed
646 +@cindex macros, count executed
648 +@sc{gasp} maintains a counter of how many macros it has
649 +executed in this pseudo-variable; you can copy that number to your
650 +output with @samp{\@@}, but @emph{only within a macro definition}.
652 +@item LOCAL @var{name} [ , @dots{} ]
653 +@emph{Warning: @code{LOCAL} is only available if you select ``alternate
654 +macro syntax'' with @samp{-a} or @samp{--alternate}.} @xref{Alternate,,
655 +Alternate macro syntax}.
657 +Generate a string replacement for each of the @var{name} arguments, and
658 +replace any instances of @var{name} in each macro expansion. The
659 +replacement string is unique in the assembly, and different for each
660 +separate macro expansion. @code{LOCAL} allows you to write macros that
661 +define symbols, without fear of conflict between separate macro expansions.
665 +@section Data output
667 +In assembly code, you often need to specify working areas of memory;
668 +depending on the application, you may want to initialize such memory or
669 +not. @sc{gasp} provides preprocessor directives to help you avoid
670 +repetitive coding for both purposes.
672 +You can use labels as usual to mark the data areas.
680 +@subsection Initialized data
682 +These are the @sc{gasp} directives for initialized data, and the standard
683 +@sc{gnu} assembler directives they expand to:
686 +@item .DATA @var{expr}, @var{expr}, @dots{}
687 +@itemx .DATA.B @var{expr}, @var{expr}, @dots{}
688 +@itemx .DATA.W @var{expr}, @var{expr}, @dots{}
689 +@itemx .DATA.L @var{expr}, @var{expr}, @dots{}
690 +Evaluate arithmetic expressions @var{expr}, and emit the corresponding
691 +@code{as} directive (labelled with @var{lab}). The unqualified
692 +@code{.DATA} emits @samp{.long}; @code{.DATA.B} emits @samp{.byte};
693 +@code{.DATA.W} emits @samp{.short}; and @code{.DATA.L} emits
696 +For example, @samp{foo .DATA 1,2,3} emits @samp{foo: .long 1,2,3}.
698 +@item .DATAB @var{repeat}, @var{expr}
699 +@itemx .DATAB.B @var{repeat}, @var{expr}
700 +@itemx .DATAB.W @var{repeat}, @var{expr}
701 +@itemx .DATAB.L @var{repeat}, @var{expr}
702 +@c FIXME! Looks like gasp accepts and ignores args after 2nd.
703 +Make @code{as} emit @var{repeat} copies of the value of the expression
704 +@var{expr} (using the @code{as} directive @code{.fill}).
705 +@samp{.DATAB.B} repeats one-byte values; @samp{.DATAB.W} repeats
706 +two-byte values; and @samp{.DATAB.L} repeats four-byte values.
707 +@samp{.DATAB} without a suffix repeats four-byte values, just like
710 +@c FIXME! Allowing zero might be useful for edge conditions in macros.
711 +@var{repeat} must be an absolute expression with a positive value.
713 +@item .SDATA "@var{str}" @dots{}
714 +String data. Emits a concatenation of bytes, precisely as you specify
715 +them (in particular, @emph{nothing is added to mark the end} of the
716 +string). @xref{Constants,, String and numeric constants}, for details
717 +about how to write strings. @code{.SDATA} concatenates multiple
718 +arguments, making it easy to switch between string representations. You
719 +can use commas to separate the individual arguments for clarity, if you
722 +@item .SDATAB @var{repeat}, "@var{str}" @dots{}
723 +Repeated string data. The first argument specifies how many copies of
724 +the string to emit; the remaining arguments specify the string, in the
725 +same way as the arguments to @code{.SDATA}.
727 +@item .SDATAZ "@var{str}" @dots{}
728 +Zero-terminated string data. Just like @code{.SDATA}, except that
729 +@code{.SDATAZ} writes a zero byte at the end of the string.
731 +@item .SDATAC "@var{str}" @dots{}
732 +Count-prefixed string data. Just like @code{.SDATA}, except that
733 +@sc{gasp} precedes the string with a leading one-byte count. For
734 +example, @samp{.SDATAC "HI"} generates @samp{.byte 2,72,73}. Since the
735 +count field is only one byte, you can only use @code{.SDATAC} for
736 +strings less than 256 bytes in length.
740 +@subsection Uninitialized data
742 +@c FIXME! .space different on some platforms, notably HPPA. Config?
743 +Use the @code{.RES}, @code{.SRES}, @code{.SRESC}, and @code{.SRESZ}
744 +directives to reserve memory and leave it uninitialized. @sc{gasp}
745 +resolves these directives to appropriate calls of the @sc{gnu}
746 +@code{as} @code{.space} directive.
749 +@item .RES @var{count}
750 +@itemx .RES.B @var{count}
751 +@itemx .RES.W @var{count}
752 +@itemx .RES.L @var{count}
753 +Reserve room for @var{count} uninitialized elements of data. The
754 +suffix specifies the size of each element: @code{.RES.B} reserves
755 +@var{count} bytes, @code{.RES.W} reserves @var{count} pairs of bytes,
756 +and @code{.RES.L} reserves @var{count} quartets. @code{.RES} without a
757 +suffix is equivalent to @code{.RES.L}.
759 +@item .SRES @var{count}
760 +@itemx .SRES.B @var{count}
761 +@itemx .SRES.W @var{count}
762 +@itemx .SRES.L @var{count}
763 +@c FIXME! This is boring. Shouldn't it at least have a different
764 +@c default size? (e.g. the "S" suggests "string", for which .B
765 +@c would be more appropriate)
766 +@code{.SRES} is a synonym for @samp{.RES}.
768 +@item .SRESC @var{count}
769 +@itemx .SRESC.B @var{count}
770 +@itemx .SRESC.W @var{count}
771 +@itemx .SRESC.L @var{count}
772 +Like @code{.SRES}, but reserves space for @code{@var{count}+1} elements.
774 +@item .SRESZ @var{count}
775 +@itemx .SRESZ.B @var{count}
776 +@itemx .SRESZ.W @var{count}
777 +@itemx .SRESZ.L @var{count}
778 +Like @code{.SRES}, but reserves space for @code{@var{count}+1} elements.
782 +@section Assembly listing control
784 +The @sc{gasp} listing-control directives correspond to
785 +related @sc{gnu} @code{as} directives.
789 +@itemx .PRINT NOLIST
790 +Print control. This directive emits the @sc{gnu} @code{as} directive
791 +@code{.list} or @code{.nolist}, according to its argument. @xref{List,,
792 +@code{.list}, as.info, Using as}, for details on how these directives
795 +@item .FORM LIN=@var{ln}
796 +@itemx .FORM COL=@var{cols}
797 +@itemx .FORM LIN=@var{ln} COL=@var{cols}
798 +Specify the page size for assembly listings: @var{ln} represents the
799 +number of lines, and @var{cols} the number of columns. You may specify
800 +either page dimension independently, or both together. If you do not
801 +specify the number of lines, @sc{gasp} assumes 60 lines; if you do not
802 +specify the number of columns, @sc{gasp} assumes 132 columns.
803 +(Any values you may have specified in previous instances of @code{.FORM}
804 +do @emph{not} carry over as defaults.) Emits the @code{.psize}
805 +assembler directive.
807 +@item .HEADING @var{string}
808 +Specify @var{string} as the title of your assembly listings. Emits
809 +@samp{.title "@var{string}"}.
812 +Force a new page in assembly listings. Emits @samp{.eject}.
815 +@node Other Commands
816 +@section Miscellaneous commands
820 +Use the alternate macro syntax henceforth in the assembly.
821 +@xref{Alternate,, Alternate macro syntax}.
824 +@c FIXME! This is very strange, since _GAS_ understands .org
825 +This command is recognized, but not yet implemented. @sc{gasp}
826 +generates an error message for programs that use @code{.ORG}.
828 +@item .RADIX @var{s}
829 +@c FIXME no test cases in testsuite/gasp
830 +@sc{gasp} understands numbers in any of base two, eight, ten, or
831 +sixteen. You can encode the base explicitly in any numeric constant
832 +(@pxref{Constants,, String and numeric constants}). If you write
833 +numbers without an explicit indication of the base, the most recent
834 +@samp{.RADIX @var{s}} command determines how they are interpreted.
835 +@var{s} is a single letter, one of the following:
845 +Base 10. This is the original default radix.
851 +You may specify the argument @var{s} in lower case (any of @samp{bqdh})
852 +with the same effects.
854 +@item .EXPORT @var{name}
855 +@itemx .GLOBAL @var{name}
856 +@c FIXME! No test cases in testsuite/gasp
857 +Declare @var{name} global (emits @samp{.global @var{name}}). The two
858 +directives are synonymous.
861 +No effect: @sc{gasp} accepts this directive, and silently ignores it.
864 +Mark end of each preprocessor file. @sc{gasp} issues a warning if it
865 +reaches end of file without seeing this command.
867 +@item .INCLUDE "@var{str}"
868 +Preprocess the file named by @var{str}, as if its contents appeared
869 +where the @code{.INCLUDE} directive does. @sc{gasp} imposes a maximum
870 +limit of 30 stacked include files, as a sanity check.
871 +@c FIXME! Why is include depth not affected by -u?
873 +@item .ALIGN @var{size}
874 +@c FIXME! Why is this not utterly pointless?
875 +Evaluate the absolute expression @var{size}, and emit the assembly
876 +instruction @samp{.align @var{size}} using the result.
879 +@node Syntax Details
880 +@section Details of the GASP syntax
882 +Since @sc{gasp} is meant to work with assembly code, its statement
883 +syntax has no surprises for the assembly programmer.
886 +@emph{Whitespace} (blanks or tabs; @emph{not} newline) is partially
887 +significant, in that it delimits up to three fields in a line. The
888 +amount of whitespace does not matter; you may line up fields in separate
889 +lines if you wish, but @sc{gasp} does not require that.
891 +@cindex fields of @sc{gasp} source line
893 +The @emph{first field}, an optional @dfn{label}, must be flush left in a
894 +line (with no leading whitespace) if it appears at all. You may use a
895 +colon after the label if you wish; @sc{gasp} neither requires the colon
896 +nor objects to it (but will not include it as part of the label name).
898 +@cindex directive field
899 +The @emph{second field}, which must appear after some whitespace,
900 +contains a @sc{gasp} or assembly @dfn{directive}.
902 +@cindex argument fields
903 +Any @emph{further fields} on a line are @dfn{arguments} to the
904 +directive; you can separate them from one another using either commas or
916 +@subsection Special syntactic markers
918 +@sc{gasp} recognizes a few special markers: to delimit comments, to
919 +continue a statement on the next line, to separate symbols from other
920 +characters, and to copy text to the output literally. (One other
921 +special marker, @samp{\@@}, works only within macro definitions;
922 +@pxref{Macros,, Defining your own directives}.)
925 +The trailing part of any @sc{gasp} source line may be a @dfn{comment}.
926 +A comment begins with the first unquoted comment character (@samp{!} by
927 +default), or an escaped or doubled comment character (@samp{\!} or
928 +@samp{!!} by default), and extends to the end of a line. You can
929 +specify what comment character to use with the @samp{-c} option
930 +(@pxref{Invoking GASP,, Command Line Options}). The two kinds of
931 +comment markers lead to slightly different treatment:
935 +A single, un-escaped comment character generates an assembly comment in
936 +the @sc{gasp} output. @sc{gasp} evaluates any preprocessor variables
937 +(macro arguments, or variables defined with @code{.ASSIGNA} or
938 +@code{.ASSIGNC}) present. For example, a macro that begins like this
941 + .MACRO SUM FROM=0, TO=9
946 +issues as the first line of output a comment that records the
947 +values you used to call the macro.
949 +@c comments, preprocessor-only
950 +@c preprocessor-only comments
951 +@c GASP-only comments
954 +Either an escaped comment character, or a double comment character,
955 +marks a @sc{gasp} source comment. @sc{gasp} does not copy such comments
956 +to the assembly output.
959 +@cindex continuation character
961 +To @emph{continue a statement} on the next line of the file, begin the
962 +second line with the character @samp{+}.
964 +@cindex literal copy to output
965 +@cindex copying literally to output
966 +@cindex preprocessing, avoiding
967 +@cindex avoiding preprocessing
968 +Occasionally you may want to prevent @sc{gasp} from preprocessing some
969 +particular bit of text. To @emph{copy literally} from the @sc{gasp}
970 +source to its output, place @samp{\(} before the string to copy, and
971 +@samp{)} at the end. For example, write @samp{\(\!)} if you need the
972 +characters @samp{\!} in your assembly output.
974 +@cindex symbol separator
975 +@cindex text, separating from symbols
976 +@cindex symbols, separating from text
977 +To @emph{separate a preprocessor variable} from text to appear
978 +immediately after its value, write a single quote (@code{'}). For
979 +example, @samp{.SDATA "\P'1"} writes a string built by concatenating the
980 +value of @code{P} and the digit @samp{1}. (You cannot achieve this by
981 +writing just @samp{\P1}, since @samp{P1} is itself a valid name for a
982 +preprocessor variable.)
985 +@subsection String and numeric constants
987 +There are two ways of writing @dfn{string constants} in @sc{gasp}: as
988 +literal text, and by numeric byte value. Specify a string literal
989 +between double quotes (@code{"@var{str}"}). Specify an individual
990 +numeric byte value as an absolute expression between angle brackets
991 +(@code{<@var{expr}>}. Directives that output strings allow you to
992 +specify any number of either kind of value, in whatever order is
993 +convenient, and concatenate the result. (Alternate syntax mode
994 +introduces a number of alternative string notations; @pxref{Alternate,,
995 +Alternate macro syntax}.)
997 +@c Details of numeric notation, e.g. base prefixes
998 +You can write @dfn{numeric constants} either in a specific base, or in
999 +whatever base is currently selected (either 10, or selected by the most
1000 +recent @code{.RADIX}).
1002 +To write a number in a @emph{specific base}, use the pattern
1003 +@code{@var{s}'@var{ddd}}: a base specifier character @var{s}, followed
1004 +by a single quote followed by digits @var{ddd}. The base specifier
1005 +character matches those you can specify with @code{.RADIX}: @samp{B} for
1006 +base 2, @samp{Q} for base 8, @samp{D} for base 10, and @samp{H} for base
1007 +16. (You can write this character in lower case if you prefer.)
1009 +You can write floating point constants using the same syntax recognised
1010 +by GAS @ref{Flonums,,Flonums,as,The GNU Assembler.}. A constraint is
1011 +that these constants will be interpreted as decimal values irrespective
1012 +of the currently selected base.
1014 +@c FIXME! What are rules for recognizing number in deflt base? Whatever
1015 +@c is left over after parsing other things??
1018 +@subsection Symbols
1020 +@sc{gasp} recognizes symbol names that start with any alphabetic character,
1021 +@samp{_}, or @samp{$}, and continue with any of the same characters or
1022 +with digits. Label names follow the same rules.
1025 +@subsection Arithmetic expressions in GASP
1027 +@cindex absolute expressions
1028 +@cindex relocatable expressions
1029 +There are two kinds of expressions, depending on their result:
1030 +@dfn{absolute} expressions, which resolve to a constant (that is, they
1031 +do not involve any values unknown to @sc{gasp}), and @dfn{relocatable}
1032 +expressions, which must reduce to the form
1035 +@var{addsym}+@var{const}-@var{subsym}
1039 +where @var{addsym} and @var{subsym} are assembly symbols of unknown
1040 +value, and @var{const} is a constant.
1042 +Arithmetic for @sc{gasp} expressions follows very similar rules to C.
1043 +You can use parentheses to change precedence; otherwise, arithmetic
1044 +primitives have decreasing precedence in the order of the following
1049 +Single-argument @code{+} (identity), @code{-} (arithmetic opposite), or
1050 +@code{~} (bitwise negation). @emph{The argument must be an absolute
1054 +@code{*} (multiplication) and @code{/} (division). @emph{Both arguments
1055 +must be absolute expressions.}
1058 +@code{+} (addition) and @code{-} (subtraction). @emph{At least one argument
1060 +@c FIXME! Actually, subtraction doesn't check for this.
1063 +@code{&} (bitwise and). @emph{Both arguments must be absolute.}
1066 +@c FIXME! I agree ~ is a better notation than ^ for xor, but is the
1067 +@c improvement worth differing from C?
1068 +@code{|} (bitwise or) and @code{~} (bitwise exclusive or; @code{^} in
1069 +C). @emph{Both arguments must be absolute.}
1072 +@node String Builtins
1073 +@subsection String primitives
1075 +You can use these primitives to manipulate strings (in the argument
1076 +field of @sc{gasp} statements):
1079 +@item .LEN("@var{str}")
1080 +Calculate the length of string @code{"@var{str}"}, as an absolute
1081 +expression. For example, @samp{.RES.B .LEN("sample")} reserves six
1084 +@item .INSTR("@var{string}", "@var{seg}", @var{ix})
1085 +Search for the first occurrence of @var{seg} after position @var{ix} of
1086 +@var{string}. For example, @samp{.INSTR("ABCDEFG", "CDE", 0)} evaluates
1087 +to the absolute result @code{2}.
1089 +The result is @code{-1} if @var{seg} does not occur in @var{string}
1090 +after position @var{ix}.
1092 +@item .SUBSTR("@var{string}",@var{start},@var{len})
1093 +The substring of @var{string} beginning at byte number @var{start} and
1094 +extending for @var{len} bytes.
1098 +@section Alternate macro syntax
1100 +If you specify @samp{-a} or @samp{--alternate} on the @sc{gasp} command
1101 +line, the preprocessor uses somewhat different syntax. This syntax is
1102 +reminiscent of the syntax of Phar Lap macro assembler, but it
1103 +is @emph{not} meant to be a full emulation of Phar Lap or similar
1104 +assemblers. In particular, @sc{gasp} does not support directives such
1105 +as @code{DB} and @code{IRP}, even in alternate syntax mode.
1107 +In particular, @samp{-a} (or @samp{--alternate}) elicits these
1111 +@item Preprocessor directives
1112 +You can use @sc{gasp} preprocessor directives without a leading @samp{.}
1113 +dot. For example, you can write @samp{SDATA} with the same effect as
1117 +One additional directive, @code{LOCAL}, is available. @xref{Macros,,
1118 +Defining your own directives}, for an explanation of how to use
1122 +@item String delimiters
1123 +You can write strings delimited in these other ways besides
1124 +@code{"@var{string}"}:
1127 +@item '@var{string}'
1128 +You can delimit strings with single-quote charaters.
1130 +@item <@var{string}>
1131 +You can delimit strings with matching angle brackets.
1134 +@item single-character string escape
1135 +To include any single character literally in a string (even if the
1136 +character would otherwise have some special meaning), you can prefix the
1137 +character with @samp{!} (an exclamation mark). For example, you can
1138 +write @samp{<4.3 !> 5.4!!>} to get the literal text @samp{4.3 > 5.4!}.
1140 +@item Expression results as strings
1141 +You can write @samp{%@var{expr}} to evaluate the expression @var{expr}
1142 +and use the result as a string.
1145 +@node GNU Free Documentation License
1146 +@chapter GNU Free Documentation License
1148 + GNU Free Documentation License
1150 + Version 1.1, March 2000
1152 + Copyright (C) 2000 Free Software Foundation, Inc.
1153 + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
1155 + Everyone is permitted to copy and distribute verbatim copies
1156 + of this license document, but changing it is not allowed.
1161 +The purpose of this License is to make a manual, textbook, or other
1162 +written document "free" in the sense of freedom: to assure everyone
1163 +the effective freedom to copy and redistribute it, with or without
1164 +modifying it, either commercially or noncommercially. Secondarily,
1165 +this License preserves for the author and publisher a way to get
1166 +credit for their work, while not being considered responsible for
1167 +modifications made by others.
1169 +This License is a kind of "copyleft", which means that derivative
1170 +works of the document must themselves be free in the same sense. It
1171 +complements the GNU General Public License, which is a copyleft
1172 +license designed for free software.
1174 +We have designed this License in order to use it for manuals for free
1175 +software, because free software needs free documentation: a free
1176 +program should come with manuals providing the same freedoms that the
1177 +software does. But this License is not limited to software manuals;
1178 +it can be used for any textual work, regardless of subject matter or
1179 +whether it is published as a printed book. We recommend this License
1180 +principally for works whose purpose is instruction or reference.
1183 +1. APPLICABILITY AND DEFINITIONS
1185 +This License applies to any manual or other work that contains a
1186 +notice placed by the copyright holder saying it can be distributed
1187 +under the terms of this License. The "Document", below, refers to any
1188 +such manual or work. Any member of the public is a licensee, and is
1189 +addressed as "you".
1191 +A "Modified Version" of the Document means any work containing the
1192 +Document or a portion of it, either copied verbatim, or with
1193 +modifications and/or translated into another language.
1195 +A "Secondary Section" is a named appendix or a front-matter section of
1196 +the Document that deals exclusively with the relationship of the
1197 +publishers or authors of the Document to the Document's overall subject
1198 +(or to related matters) and contains nothing that could fall directly
1199 +within that overall subject. (For example, if the Document is in part a
1200 +textbook of mathematics, a Secondary Section may not explain any
1201 +mathematics.) The relationship could be a matter of historical
1202 +connection with the subject or with related matters, or of legal,
1203 +commercial, philosophical, ethical or political position regarding
1206 +The "Invariant Sections" are certain Secondary Sections whose titles
1207 +are designated, as being those of Invariant Sections, in the notice
1208 +that says that the Document is released under this License.
1210 +The "Cover Texts" are certain short passages of text that are listed,
1211 +as Front-Cover Texts or Back-Cover Texts, in the notice that says that
1212 +the Document is released under this License.
1214 +A "Transparent" copy of the Document means a machine-readable copy,
1215 +represented in a format whose specification is available to the
1216 +general public, whose contents can be viewed and edited directly and
1217 +straightforwardly with generic text editors or (for images composed of
1218 +pixels) generic paint programs or (for drawings) some widely available
1219 +drawing editor, and that is suitable for input to text formatters or
1220 +for automatic translation to a variety of formats suitable for input
1221 +to text formatters. A copy made in an otherwise Transparent file
1222 +format whose markup has been designed to thwart or discourage
1223 +subsequent modification by readers is not Transparent. A copy that is
1224 +not "Transparent" is called "Opaque".
1226 +Examples of suitable formats for Transparent copies include plain
1227 +ASCII without markup, Texinfo input format, LaTeX input format, SGML
1228 +or XML using a publicly available DTD, and standard-conforming simple
1229 +HTML designed for human modification. Opaque formats include
1230 +PostScript, PDF, proprietary formats that can be read and edited only
1231 +by proprietary word processors, SGML or XML for which the DTD and/or
1232 +processing tools are not generally available, and the
1233 +machine-generated HTML produced by some word processors for output
1236 +The "Title Page" means, for a printed book, the title page itself,
1237 +plus such following pages as are needed to hold, legibly, the material
1238 +this License requires to appear in the title page. For works in
1239 +formats which do not have any title page as such, "Title Page" means
1240 +the text near the most prominent appearance of the work's title,
1241 +preceding the beginning of the body of the text.
1244 +2. VERBATIM COPYING
1246 +You may copy and distribute the Document in any medium, either
1247 +commercially or noncommercially, provided that this License, the
1248 +copyright notices, and the license notice saying this License applies
1249 +to the Document are reproduced in all copies, and that you add no other
1250 +conditions whatsoever to those of this License. You may not use
1251 +technical measures to obstruct or control the reading or further
1252 +copying of the copies you make or distribute. However, you may accept
1253 +compensation in exchange for copies. If you distribute a large enough
1254 +number of copies you must also follow the conditions in section 3.
1256 +You may also lend copies, under the same conditions stated above, and
1257 +you may publicly display copies.
1260 +3. COPYING IN QUANTITY
1262 +If you publish printed copies of the Document numbering more than 100,
1263 +and the Document's license notice requires Cover Texts, you must enclose
1264 +the copies in covers that carry, clearly and legibly, all these Cover
1265 +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
1266 +the back cover. Both covers must also clearly and legibly identify
1267 +you as the publisher of these copies. The front cover must present
1268 +the full title with all words of the title equally prominent and
1269 +visible. You may add other material on the covers in addition.
1270 +Copying with changes limited to the covers, as long as they preserve
1271 +the title of the Document and satisfy these conditions, can be treated
1272 +as verbatim copying in other respects.
1274 +If the required texts for either cover are too voluminous to fit
1275 +legibly, you should put the first ones listed (as many as fit
1276 +reasonably) on the actual cover, and continue the rest onto adjacent
1279 +If you publish or distribute Opaque copies of the Document numbering
1280 +more than 100, you must either include a machine-readable Transparent
1281 +copy along with each Opaque copy, or state in or with each Opaque copy
1282 +a publicly-accessible computer-network location containing a complete
1283 +Transparent copy of the Document, free of added material, which the
1284 +general network-using public has access to download anonymously at no
1285 +charge using public-standard network protocols. If you use the latter
1286 +option, you must take reasonably prudent steps, when you begin
1287 +distribution of Opaque copies in quantity, to ensure that this
1288 +Transparent copy will remain thus accessible at the stated location
1289 +until at least one year after the last time you distribute an Opaque
1290 +copy (directly or through your agents or retailers) of that edition to
1293 +It is requested, but not required, that you contact the authors of the
1294 +Document well before redistributing any large number of copies, to give
1295 +them a chance to provide you with an updated version of the Document.
1300 +You may copy and distribute a Modified Version of the Document under
1301 +the conditions of sections 2 and 3 above, provided that you release
1302 +the Modified Version under precisely this License, with the Modified
1303 +Version filling the role of the Document, thus licensing distribution
1304 +and modification of the Modified Version to whoever possesses a copy
1305 +of it. In addition, you must do these things in the Modified Version:
1307 +A. Use in the Title Page (and on the covers, if any) a title distinct
1308 + from that of the Document, and from those of previous versions
1309 + (which should, if there were any, be listed in the History section
1310 + of the Document). You may use the same title as a previous version
1311 + if the original publisher of that version gives permission.
1312 +B. List on the Title Page, as authors, one or more persons or entities
1313 + responsible for authorship of the modifications in the Modified
1314 + Version, together with at least five of the principal authors of the
1315 + Document (all of its principal authors, if it has less than five).
1316 +C. State on the Title page the name of the publisher of the
1317 + Modified Version, as the publisher.
1318 +D. Preserve all the copyright notices of the Document.
1319 +E. Add an appropriate copyright notice for your modifications
1320 + adjacent to the other copyright notices.
1321 +F. Include, immediately after the copyright notices, a license notice
1322 + giving the public permission to use the Modified Version under the
1323 + terms of this License, in the form shown in the Addendum below.
1324 +G. Preserve in that license notice the full lists of Invariant Sections
1325 + and required Cover Texts given in the Document's license notice.
1326 +H. Include an unaltered copy of this License.
1327 +I. Preserve the section entitled "History", and its title, and add to
1328 + it an item stating at least the title, year, new authors, and
1329 + publisher of the Modified Version as given on the Title Page. If
1330 + there is no section entitled "History" in the Document, create one
1331 + stating the title, year, authors, and publisher of the Document as
1332 + given on its Title Page, then add an item describing the Modified
1333 + Version as stated in the previous sentence.
1334 +J. Preserve the network location, if any, given in the Document for
1335 + public access to a Transparent copy of the Document, and likewise
1336 + the network locations given in the Document for previous versions
1337 + it was based on. These may be placed in the "History" section.
1338 + You may omit a network location for a work that was published at
1339 + least four years before the Document itself, or if the original
1340 + publisher of the version it refers to gives permission.
1341 +K. In any section entitled "Acknowledgements" or "Dedications",
1342 + preserve the section's title, and preserve in the section all the
1343 + substance and tone of each of the contributor acknowledgements
1344 + and/or dedications given therein.
1345 +L. Preserve all the Invariant Sections of the Document,
1346 + unaltered in their text and in their titles. Section numbers
1347 + or the equivalent are not considered part of the section titles.
1348 +M. Delete any section entitled "Endorsements". Such a section
1349 + may not be included in the Modified Version.
1350 +N. Do not retitle any existing section as "Endorsements"
1351 + or to conflict in title with any Invariant Section.
1353 +If the Modified Version includes new front-matter sections or
1354 +appendices that qualify as Secondary Sections and contain no material
1355 +copied from the Document, you may at your option designate some or all
1356 +of these sections as invariant. To do this, add their titles to the
1357 +list of Invariant Sections in the Modified Version's license notice.
1358 +These titles must be distinct from any other section titles.
1360 +You may add a section entitled "Endorsements", provided it contains
1361 +nothing but endorsements of your Modified Version by various
1362 +parties--for example, statements of peer review or that the text has
1363 +been approved by an organization as the authoritative definition of a
1366 +You may add a passage of up to five words as a Front-Cover Text, and a
1367 +passage of up to 25 words as a Back-Cover Text, to the end of the list
1368 +of Cover Texts in the Modified Version. Only one passage of
1369 +Front-Cover Text and one of Back-Cover Text may be added by (or
1370 +through arrangements made by) any one entity. If the Document already
1371 +includes a cover text for the same cover, previously added by you or
1372 +by arrangement made by the same entity you are acting on behalf of,
1373 +you may not add another; but you may replace the old one, on explicit
1374 +permission from the previous publisher that added the old one.
1376 +The author(s) and publisher(s) of the Document do not by this License
1377 +give permission to use their names for publicity for or to assert or
1378 +imply endorsement of any Modified Version.
1381 +5. COMBINING DOCUMENTS
1383 +You may combine the Document with other documents released under this
1384 +License, under the terms defined in section 4 above for modified
1385 +versions, provided that you include in the combination all of the
1386 +Invariant Sections of all of the original documents, unmodified, and
1387 +list them all as Invariant Sections of your combined work in its
1390 +The combined work need only contain one copy of this License, and
1391 +multiple identical Invariant Sections may be replaced with a single
1392 +copy. If there are multiple Invariant Sections with the same name but
1393 +different contents, make the title of each such section unique by
1394 +adding at the end of it, in parentheses, the name of the original
1395 +author or publisher of that section if known, or else a unique number.
1396 +Make the same adjustment to the section titles in the list of
1397 +Invariant Sections in the license notice of the combined work.
1399 +In the combination, you must combine any sections entitled "History"
1400 +in the various original documents, forming one section entitled
1401 +"History"; likewise combine any sections entitled "Acknowledgements",
1402 +and any sections entitled "Dedications". You must delete all sections
1403 +entitled "Endorsements."
1406 +6. COLLECTIONS OF DOCUMENTS
1408 +You may make a collection consisting of the Document and other documents
1409 +released under this License, and replace the individual copies of this
1410 +License in the various documents with a single copy that is included in
1411 +the collection, provided that you follow the rules of this License for
1412 +verbatim copying of each of the documents in all other respects.
1414 +You may extract a single document from such a collection, and distribute
1415 +it individually under this License, provided you insert a copy of this
1416 +License into the extracted document, and follow this License in all
1417 +other respects regarding verbatim copying of that document.
1420 +7. AGGREGATION WITH INDEPENDENT WORKS
1422 +A compilation of the Document or its derivatives with other separate
1423 +and independent documents or works, in or on a volume of a storage or
1424 +distribution medium, does not as a whole count as a Modified Version
1425 +of the Document, provided no compilation copyright is claimed for the
1426 +compilation. Such a compilation is called an "aggregate", and this
1427 +License does not apply to the other self-contained works thus compiled
1428 +with the Document, on account of their being thus compiled, if they
1429 +are not themselves derivative works of the Document.
1431 +If the Cover Text requirement of section 3 is applicable to these
1432 +copies of the Document, then if the Document is less than one quarter
1433 +of the entire aggregate, the Document's Cover Texts may be placed on
1434 +covers that surround only the Document within the aggregate.
1435 +Otherwise they must appear on covers around the whole aggregate.
1440 +Translation is considered a kind of modification, so you may
1441 +distribute translations of the Document under the terms of section 4.
1442 +Replacing Invariant Sections with translations requires special
1443 +permission from their copyright holders, but you may include
1444 +translations of some or all Invariant Sections in addition to the
1445 +original versions of these Invariant Sections. You may include a
1446 +translation of this License provided that you also include the
1447 +original English version of this License. In case of a disagreement
1448 +between the translation and the original English version of this
1449 +License, the original English version will prevail.
1454 +You may not copy, modify, sublicense, or distribute the Document except
1455 +as expressly provided for under this License. Any other attempt to
1456 +copy, modify, sublicense or distribute the Document is void, and will
1457 +automatically terminate your rights under this License. However,
1458 +parties who have received copies, or rights, from you under this
1459 +License will not have their licenses terminated so long as such
1460 +parties remain in full compliance.
1463 +10. FUTURE REVISIONS OF THIS LICENSE
1465 +The Free Software Foundation may publish new, revised versions
1466 +of the GNU Free Documentation License from time to time. Such new
1467 +versions will be similar in spirit to the present version, but may
1468 +differ in detail to address new problems or concerns. See
1469 +http://www.gnu.org/copyleft/.
1471 +Each version of the License is given a distinguishing version number.
1472 +If the Document specifies that a particular numbered version of this
1473 +License "or any later version" applies to it, you have the option of
1474 +following the terms and conditions either of that specified version or
1475 +of any later version that has been published (not as a draft) by the
1476 +Free Software Foundation. If the Document does not specify a version
1477 +number of this License, you may choose any version ever published (not
1478 +as a draft) by the Free Software Foundation.
1481 +ADDENDUM: How to use this License for your documents
1483 +To use this License in a document you have written, include a copy of
1484 +the License in the document and put the following copyright and
1485 +license notices just after the title page:
1488 + Copyright (c) YEAR YOUR NAME.
1489 + Permission is granted to copy, distribute and/or modify this document
1490 + under the terms of the GNU Free Documentation License, Version 1.1
1491 + or any later version published by the Free Software Foundation;
1492 + with the Invariant Sections being LIST THEIR TITLES, with the
1493 + Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
1494 + A copy of the license is included in the section entitled "GNU
1495 + Free Documentation License".
1498 +If you have no Invariant Sections, write "with no Invariant Sections"
1499 +instead of saying which ones are invariant. If you have no
1500 +Front-Cover Texts, write "no Front-Cover Texts" instead of
1501 +"Front-Cover Texts being LIST"; likewise for Back-Cover Texts.
1503 +If your document contains nontrivial examples of program code, we
1504 +recommend releasing these examples in parallel under your choice of
1505 +free software license, such as the GNU General Public License,
1506 +to permit their use in free software.
1515 diff -urNbB binutils-2.16.91.0.2.org/gas/gasp.c binutils-2.16.91.0.2/gas/gasp.c
1516 --- binutils-2.16.91.0.2.org/gas/gasp.c 1970-01-01 00:00:00.000000000 +0000
1517 +++ binutils-2.16.91.0.2/gas/gasp.c 2005-07-21 18:31:04.000000000 +0000
1519 +/* gasp.c - Gnu assembler preprocessor main program.
1520 + Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
1521 + Free Software Foundation, Inc.
1523 + Written by Steve and Judy Chamberlain of Cygnus Support,
1526 + This file is part of GASP, the GNU Assembler Preprocessor.
1528 + GASP is free software; you can redistribute it and/or modify
1529 + it under the terms of the GNU General Public License as published by
1530 + the Free Software Foundation; either version 2, or (at your option)
1531 + any later version.
1533 + GASP is distributed in the hope that it will be useful,
1534 + but WITHOUT ANY WARRANTY; without even the implied warranty of
1535 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1536 + GNU General Public License for more details.
1538 + You should have received a copy of the GNU General Public License
1539 + along with GASP; see the file COPYING. If not, write to the Free
1540 + Software Foundation, 59 Temple Place - Suite 330, Boston, MA
1541 + 02111-1307, USA. */
1544 +This program translates the input macros and stuff into a form
1545 +suitable for gas to consume.
1547 + gasp [-sdhau] [-c char] [-o <outfile>] <infile>*
1549 + -s copy source to output
1550 + -c <char> comments are started with <char> instead of !
1551 + -u allow unreasonable stuff
1552 + -p print line numbers
1553 + -d print debugging stats
1554 + -s semi colons start comments
1555 + -a use alternate syntax
1556 + Pseudo ops can start with or without a .
1557 + Labels have to be in first column.
1558 + -I specify include dir
1559 + Macro arg parameters subsituted by name, don't need the &.
1560 + String can start with ' too.
1561 + Strings can be surrounded by <..>
1562 + A %<exp> in a string evaluates the expression
1563 + Literal char in a string with !
1566 +#include "config.h"
1567 +#include "bin-bugs.h"
1569 +#include <assert.h>
1571 +#include <string.h>
1572 +#include "getopt.h"
1574 +#ifdef HAVE_STDLIB_H
1575 +#include <stdlib.h>
1578 +#ifdef NEED_MALLOC_DECLARATION
1579 +extern char *malloc ();
1582 +#include "ansidecl.h"
1583 +#include "libiberty.h"
1584 +#include "safe-ctype.h"
1587 +#include "asintl.h"
1588 +#include "xregex.h"
1590 +char *program_version = "1.2";
1592 +/* This is normally declared in as.h, but we don't include that. We
1593 + need the function because other files linked with gasp.c might call
1595 +extern void as_abort PARAMS ((const char *, int, const char *));
1597 +/* The default obstack chunk size. If we set this to zero, the
1598 + obstack code will use whatever will fit in a 4096 byte block. This
1599 + is used by the hash table code used by macro.c. */
1602 +#define MAX_INCLUDES 30 /* Maximum include depth. */
1603 +#define MAX_REASONABLE 1000 /* Maximum number of expansions. */
1605 +int unreasonable; /* -u on command line. */
1606 +int stats; /* -d on command line. */
1607 +int print_line_number; /* -p flag on command line. */
1608 +int copysource; /* -c flag on command line. */
1609 +int warnings; /* Number of WARNINGs generated so far. */
1610 +int errors; /* Number of ERRORs generated so far. */
1611 +int fatals; /* Number of fatal ERRORs generated so far (either 0 or 1). */
1612 +int alternate = 0; /* -a on command line. */
1613 +int mri = 0; /* -M on command line. */
1614 +char comment_char = '!';
1615 +int radix = 10; /* Default radix. */
1617 +int had_end; /* Seen .END. */
1619 +/* The output stream. */
1622 +/* The attributes of each character are stored as a bit pattern
1623 + chartype, which gives us quick tests. */
1629 +#define COMMENTBIT 16
1631 +#define ISCOMMENTCHAR(x) (chartype[(unsigned char)(x)] & COMMENTBIT)
1632 +#define ISFIRSTCHAR(x) (chartype[(unsigned char)(x)] & FIRSTBIT)
1633 +#define ISNEXTCHAR(x) (chartype[(unsigned char)(x)] & NEXTBIT)
1634 +#define ISSEP(x) (chartype[(unsigned char)(x)] & SEPBIT)
1635 +#define ISWHITE(x) (chartype[(unsigned char)(x)] & WHITEBIT)
1636 +#define ISBASE(x) (chartype[(unsigned char)(x)] & BASEBIT)
1637 +static char chartype[256];
1639 +/* Conditional assembly uses the `ifstack'. Each aif pushes another
1640 + entry onto the stack, and sets the on flag if it should. The aelse
1641 + sets hadelse, and toggles on. An aend pops a level. We limit to
1642 + 100 levels of nesting, not because we're facists pigs with read
1643 + only minds, but because more than 100 levels of nesting is probably
1644 + a bug in the user's macro structure. */
1646 +#define IFNESTING 100
1648 + int on; /* Is the level being output. */
1649 + int hadelse; /* Has an aelse been seen. */
1650 +} ifstack[IFNESTING];
1654 +/* The final and intermediate results of expression evaluation are kept in
1655 + exp_t's. Note that a symbol is not an sb, but a pointer into the input
1656 + line. It must be coped somewhere safe before the next line is read in. */
1664 + int value; /* Constant part. */
1665 + symbol add_symbol; /* Name part. */
1666 + symbol sub_symbol; /* Name part. */
1669 +/* Hashing is done in a pretty standard way. A hash_table has a
1670 + pointer to a vector of pointers to hash_entrys, and the size of the
1671 + vector. A hash_entry contains a union of all the info we like to
1672 + store in hash table. If there is a hash collision, hash_entries
1673 + with the same hash are kept in a chain. */
1675 +/* What the data in a hash_entry means. */
1677 + hash_integer, /* Name->integer mapping. */
1678 + hash_string, /* Name->string mapping. */
1679 + hash_macro, /* Name is a macro. */
1680 + hash_formal /* Name is a formal argument. */
1683 +typedef struct hs {
1684 + sb key; /* Symbol name. */
1685 + hash_type type; /* Symbol meaning. */
1689 + struct macro_struct *m;
1690 + struct formal_struct *f;
1692 + struct hs *next; /* Next hash_entry with same hash key. */
1696 + hash_entry **table;
1700 +/* How we nest files and expand macros etc.
1702 + We keep a stack of of include_stack structs. Each include file
1703 + pushes a new level onto the stack. We keep an sb with a pushback
1704 + too. unget chars are pushed onto the pushback sb, getchars first
1705 + checks the pushback sb before reading from the input stream.
1707 + Small things are expanded by adding the text of the item onto the
1708 + pushback sb. Larger items are grown by pushing a new level and
1709 + allocating the entire pushback buf for the item. Each time
1710 + something like a macro is expanded, the stack index is changed. We
1711 + can then perform an exitm by popping all entries off the stack with
1712 + the same stack index. If we're being reasonable, we can detect
1713 + recusive expansion by checking the index is reasonably small. */
1716 + include_file, include_repeat, include_while, include_macro
1719 +struct include_stack {
1720 + sb pushback; /* Current pushback stream. */
1721 + int pushback_index; /* Next char to read from stream. */
1722 + FILE *handle; /* Open file. */
1723 + sb name; /* Name of file. */
1724 + int linecount; /* Number of lines read so far. */
1725 + include_type type;
1726 + int index; /* Index of this layer. */
1727 +} include_stack[MAX_INCLUDES];
1729 +struct include_stack *sp;
1730 +#define isp (sp - include_stack)
1732 +/* Include file list. */
1734 +typedef struct include_path {
1735 + struct include_path *next;
1739 +include_path *paths_head;
1740 +include_path *paths_tail;
1742 +static void quit PARAMS ((void));
1743 +static void hash_new_table PARAMS ((int, hash_table *));
1744 +static int hash PARAMS ((sb *));
1745 +static hash_entry *hash_create PARAMS ((hash_table *, sb *));
1746 +static void hash_add_to_string_table PARAMS ((hash_table *, sb *, sb *, int));
1747 +static void hash_add_to_int_table PARAMS ((hash_table *, sb *, int));
1748 +static hash_entry *hash_lookup PARAMS ((hash_table *, sb *));
1749 +static void checkconst PARAMS ((int, exp_t *));
1750 +static int is_flonum PARAMS ((int, sb *));
1751 +static int chew_flonum PARAMS ((int, sb *, sb *));
1752 +static int sb_strtol PARAMS ((int, sb *, int, int *));
1753 +static int level_0 PARAMS ((int, sb *, exp_t *));
1754 +static int level_1 PARAMS ((int, sb *, exp_t *));
1755 +static int level_2 PARAMS ((int, sb *, exp_t *));
1756 +static int level_3 PARAMS ((int, sb *, exp_t *));
1757 +static int level_4 PARAMS ((int, sb *, exp_t *));
1758 +static int level_5 PARAMS ((int, sb *, exp_t *));
1759 +static int exp_parse PARAMS ((int, sb *, exp_t *));
1760 +static void exp_string PARAMS ((exp_t *, sb *));
1761 +static int exp_get_abs PARAMS ((const char *, int, sb *, int *));
1763 +static void strip_comments PARAMS ((sb *));
1765 +static void unget PARAMS ((int));
1766 +static void include_buf PARAMS ((sb *, sb *, include_type, int));
1767 +static void include_print_where_line PARAMS ((FILE *));
1768 +static void include_print_line PARAMS ((FILE *));
1769 +static int get_line PARAMS ((sb *));
1770 +static int grab_label PARAMS ((sb *, sb *));
1771 +static void change_base PARAMS ((int, sb *, sb *));
1772 +static void do_end PARAMS ((sb *));
1773 +static void do_assign PARAMS ((int, int, sb *));
1774 +static void do_radix PARAMS ((sb *));
1775 +static int get_opsize PARAMS ((int, sb *, int *));
1776 +static int eol PARAMS ((int, sb *));
1777 +static void do_data PARAMS ((int, sb *, int));
1778 +static void do_datab PARAMS ((int, sb *));
1779 +static void do_align PARAMS ((int, sb *));
1780 +static void do_res PARAMS ((int, sb *, int));
1781 +static void do_export PARAMS ((sb *));
1782 +static void do_print PARAMS ((int, sb *));
1783 +static void do_heading PARAMS ((int, sb *));
1784 +static void do_page PARAMS ((void));
1785 +static void do_form PARAMS ((int, sb *));
1786 +static int get_any_string PARAMS ((int, sb *, sb *, int, int));
1787 +static int skip_openp PARAMS ((int, sb *));
1788 +static int skip_closep PARAMS ((int, sb *));
1789 +static int dolen PARAMS ((int, sb *, sb *));
1790 +static int doinstr PARAMS ((int, sb *, sb *));
1791 +static int dosubstr PARAMS ((int, sb *, sb *));
1792 +static void process_assigns PARAMS ((int, sb *, sb *));
1793 +static int get_and_process PARAMS ((int, sb *, sb *));
1794 +static void process_file PARAMS ((void));
1795 +static void free_old_entry PARAMS ((hash_entry *));
1796 +static void do_assigna PARAMS ((int, sb *));
1797 +static void do_assignc PARAMS ((int, sb *));
1798 +static void do_reg PARAMS ((int, sb *));
1799 +static int condass_lookup_name PARAMS ((sb *, int, sb *, int));
1800 +static int whatcond PARAMS ((int, sb *, int *));
1801 +static int istrue PARAMS ((int, sb *));
1802 +static void do_aif PARAMS ((int, sb *));
1803 +static void do_aelse PARAMS ((void));
1804 +static void do_aendi PARAMS ((void));
1805 +static int condass_on PARAMS ((void));
1806 +static void do_if PARAMS ((int, sb *, int));
1807 +static int get_mri_string PARAMS ((int, sb *, sb *, int));
1808 +static void do_ifc PARAMS ((int, sb *, int));
1809 +static void do_aendr PARAMS ((void));
1810 +static void do_awhile PARAMS ((int, sb *));
1811 +static void do_aendw PARAMS ((void));
1812 +static void do_exitm PARAMS ((void));
1813 +static void do_arepeat PARAMS ((int, sb *));
1814 +static void do_endm PARAMS ((void));
1815 +static void do_irp PARAMS ((int, sb *, int));
1816 +static void do_local PARAMS ((int, sb *));
1817 +static void do_macro PARAMS ((int, sb *));
1818 +static int macro_op PARAMS ((int, sb *));
1819 +static int getstring PARAMS ((int, sb *, sb *));
1820 +static void do_sdata PARAMS ((int, sb *, int));
1821 +static void do_sdatab PARAMS ((int, sb *));
1822 +static int new_file PARAMS ((const char *));
1823 +static void do_include PARAMS ((int, sb *));
1824 +static void include_pop PARAMS ((void));
1825 +static int get PARAMS ((void));
1826 +static int linecount PARAMS ((void));
1827 +static int include_next_index PARAMS ((void));
1828 +static void chartype_init PARAMS ((void));
1829 +static int process_pseudo_op PARAMS ((int, sb *, sb *));
1830 +static void add_keyword PARAMS ((const char *, int));
1831 +static void process_init PARAMS ((void));
1832 +static void do_define PARAMS ((const char *));
1833 +static void show_usage PARAMS ((FILE *, int));
1834 +static void show_help PARAMS ((void));
1836 +/* --- functions recently removed from sb.c --- */
1838 +/* put a null at the end of the sb at in and return the start of the
1839 + * string, so that it can be used as an arg to printf %s. */
1844 + /* stick a null on the end of the string */
1845 + sb_add_char (in, 0);
1849 +/* print the sb at ptr to the output file */
1852 +sb_print (FILE *outfile, sb *ptr)
1857 + for (i = 0; i < ptr->len; i++)
1861 + fprintf (outfile, ",");
1863 + fprintf (outfile, "%d", ptr->ptr[i]);
1868 +/* print the sb at ptr to the output file */
1871 +sb_print_at (FILE *outfile, int idx, sb *ptr)
1874 + for (i = idx; i < ptr->len; i++)
1875 + putc (ptr->ptr[i], outfile);
1881 + include_print_where_line (stderr); \
1891 + include_print_where_line (stderr); \
1897 +#define WARNING(x) \
1900 + include_print_where_line (stderr); \
1906 +/* Exit the program and return the right ERROR code. */
1912 + if (fatals + errors)
1920 +/* Hash table maintenance. */
1922 +/* Build a new hash table with size buckets
1923 + and fill in the info at ptr. */
1926 +hash_new_table (size, ptr)
1932 + ptr->table = (hash_entry **) xmalloc (size * (sizeof (hash_entry *)));
1933 + /* Fill with null-pointer, not zero-bit-pattern. */
1934 + for (i = 0; i < size; i++)
1935 + ptr->table[i] = 0;
1938 +/* Calculate and return the hash value of the sb at key. */
1946 + char *p = key->ptr;
1947 + for (i = 0; i < key->len; i++)
1949 + k ^= (k << 2) ^ *p;
1952 + return k & 0xf0fff;
1955 +/* Look up key in hash_table tab. If present, then return it,
1956 + otherwise build a new one and fill it with hash_integer. */
1958 +static hash_entry *
1959 +hash_create (tab, key)
1963 + int k = hash (key) % tab->size;
1965 + hash_entry **table = tab->table;
1973 + hash_entry *n = (hash_entry *) xmalloc (sizeof (hash_entry));
1974 + n->next = table[k];
1976 + sb_add_sb (&n->key, key);
1978 + n->type = hash_integer;
1981 + if (strncmp (table[k]->key.ptr, key->ptr, key->len) == 0)
1989 +/* Add sb name with key into hash_table tab.
1990 + If replacing old value and again, then ERROR. */
1993 +hash_add_to_string_table (tab, key, name, again)
1999 + hash_entry *ptr = hash_create (tab, key);
2000 + if (ptr->type == hash_integer)
2002 + sb_new (&ptr->value.s);
2004 + if (ptr->value.s.len)
2007 + ERROR ((stderr, _("redefinition not allowed\n")));
2010 + ptr->type = hash_string;
2011 + sb_reset (&ptr->value.s);
2013 + sb_add_sb (&ptr->value.s, name);
2016 +/* Add integer name to hash_table tab with sb key. */
2019 +hash_add_to_int_table (tab, key, name)
2024 + hash_entry *ptr = hash_create (tab, key);
2025 + ptr->value.i = name;
2028 +/* Look up sb key in hash_table tab.
2029 + If found, return hash_entry result, else 0. */
2031 +static hash_entry *
2032 +hash_lookup (tab, key)
2036 + int k = hash (key) % tab->size;
2037 + hash_entry **table = tab->table;
2038 + hash_entry *p = table[k];
2041 + if (p->key.len == key->len
2042 + && strncmp (p->key.ptr, key->ptr, key->len) == 0)
2051 + are handled in a really simple recursive decent way. each bit of
2052 + the machine takes an index into an sb and a pointer to an exp_t,
2053 + modifies the *exp_t and returns the index of the first character
2054 + past the part of the expression parsed.
2056 + expression precedence:
2065 +/* Make sure that the exp_t at term is constant.
2066 + If not the give the op ERROR. */
2069 +checkconst (op, term)
2073 + if (term->add_symbol.len
2074 + || term->sub_symbol.len)
2076 + ERROR ((stderr, _("the %c operator cannot take non-absolute arguments.\n"), op));
2080 +/* Chew the flonum from the string starting at idx. Adjust idx to
2081 + point to the next character after the flonum. */
2084 +chew_flonum (idx, string, out)
2093 + /* Duplicate and null terminate `string'. */
2095 + sb_add_sb (&buf, string);
2096 + sb_add_char (&buf, '\0');
2098 + if (regcomp (®, "([0-9]*\\.[0-9]+([eE][+-]?[0-9]+)?)", REG_EXTENDED) != 0)
2100 + if (regexec (®, &buf.ptr[idx], 1, &match, 0) != 0)
2103 + /* Copy the match to the output. */
2104 + assert (match.rm_eo >= match.rm_so);
2105 + sb_add_buffer (out, &buf.ptr[idx], match.rm_eo - match.rm_so);
2109 + idx += match.rm_eo;
2114 +is_flonum (idx, string)
2122 + /* Duplicate and null terminate `string'. */
2124 + sb_add_sb (&buf, string);
2125 + sb_add_char (&buf, '\0');
2127 + if (regcomp (®, "^[0-9]*\\.[0-9]+([eE][+-]?[0-9]+)?", REG_EXTENDED) != 0)
2130 + rc = regexec (®, &buf.ptr[idx], 0, NULL, 0);
2136 +/* Turn the number in string at idx into a number of base, fill in
2137 + ptr, and return the index of the first character not in the number. */
2140 +sb_strtol (idx, string, base, ptr)
2147 + idx = sb_skip_white (idx, string);
2149 + while (idx < string->len)
2151 + int ch = string->ptr[idx];
2155 + else if (ch >= 'a' && ch <= 'f')
2156 + dig = ch - 'a' + 10;
2157 + else if (ch >= 'A' && ch <= 'F')
2158 + dig = ch - 'A' + 10;
2165 + value = value * base + dig;
2173 +level_0 (idx, string, lhs)
2178 + lhs->add_symbol.len = 0;
2179 + lhs->add_symbol.name = 0;
2181 + lhs->sub_symbol.len = 0;
2182 + lhs->sub_symbol.name = 0;
2184 + idx = sb_skip_white (idx, string);
2188 + if (ISDIGIT (string->ptr[idx]))
2190 + idx = sb_strtol (idx, string, 10, &lhs->value);
2192 + else if (ISFIRSTCHAR (string->ptr[idx]))
2195 + lhs->add_symbol.name = string->ptr + idx;
2196 + while (idx < string->len && ISNEXTCHAR (string->ptr[idx]))
2201 + lhs->add_symbol.len = len;
2203 + else if (string->ptr[idx] == '"')
2207 + ERROR ((stderr, _("string where expression expected.\n")));
2208 + idx = getstring (idx, string, &acc);
2213 + ERROR ((stderr, _("can't find primary in expression.\n")));
2216 + return sb_skip_white (idx, string);
2220 +level_1 (idx, string, lhs)
2225 + idx = sb_skip_white (idx, string);
2227 + switch (string->ptr[idx])
2230 + idx = level_1 (idx + 1, string, lhs);
2233 + idx = level_1 (idx + 1, string, lhs);
2234 + checkconst ('~', lhs);
2235 + lhs->value = ~lhs->value;
2240 + idx = level_1 (idx + 1, string, lhs);
2241 + lhs->value = -lhs->value;
2242 + t = lhs->add_symbol;
2243 + lhs->add_symbol = lhs->sub_symbol;
2244 + lhs->sub_symbol = t;
2249 + idx = level_5 (sb_skip_white (idx, string), string, lhs);
2250 + if (string->ptr[idx] != ')')
2251 + ERROR ((stderr, _("misplaced closing parens.\n")));
2256 + idx = level_0 (idx, string, lhs);
2259 + return sb_skip_white (idx, string);
2263 +level_2 (idx, string, lhs)
2270 + idx = level_1 (idx, string, lhs);
2272 + while (idx < string->len && (string->ptr[idx] == '*'
2273 + || string->ptr[idx] == '/'))
2275 + char op = string->ptr[idx++];
2276 + idx = level_1 (idx, string, &rhs);
2280 + checkconst ('*', lhs);
2281 + checkconst ('*', &rhs);
2282 + lhs->value *= rhs.value;
2285 + checkconst ('/', lhs);
2286 + checkconst ('/', &rhs);
2287 + if (rhs.value == 0)
2288 + ERROR ((stderr, _("attempt to divide by zero.\n")));
2290 + lhs->value /= rhs.value;
2294 + return sb_skip_white (idx, string);
2298 +level_3 (idx, string, lhs)
2305 + idx = level_2 (idx, string, lhs);
2307 + while (idx < string->len
2308 + && (string->ptr[idx] == '+'
2309 + || string->ptr[idx] == '-'))
2311 + char op = string->ptr[idx++];
2312 + idx = level_2 (idx, string, &rhs);
2316 + lhs->value += rhs.value;
2317 + if (lhs->add_symbol.name && rhs.add_symbol.name)
2319 + ERROR ((stderr, _("can't add two relocatable expressions\n")));
2321 + /* Change nn+symbol to symbol + nn. */
2322 + if (rhs.add_symbol.name)
2324 + lhs->add_symbol = rhs.add_symbol;
2328 + lhs->value -= rhs.value;
2329 + lhs->sub_symbol = rhs.add_symbol;
2333 + return sb_skip_white (idx, string);
2337 +level_4 (idx, string, lhs)
2344 + idx = level_3 (idx, string, lhs);
2346 + while (idx < string->len &&
2347 + string->ptr[idx] == '&')
2349 + char op = string->ptr[idx++];
2350 + idx = level_3 (idx, string, &rhs);
2354 + checkconst ('&', lhs);
2355 + checkconst ('&', &rhs);
2356 + lhs->value &= rhs.value;
2360 + return sb_skip_white (idx, string);
2364 +level_5 (idx, string, lhs)
2371 + idx = level_4 (idx, string, lhs);
2373 + while (idx < string->len
2374 + && (string->ptr[idx] == '|' || string->ptr[idx] == '~'))
2376 + char op = string->ptr[idx++];
2377 + idx = level_4 (idx, string, &rhs);
2381 + checkconst ('|', lhs);
2382 + checkconst ('|', &rhs);
2383 + lhs->value |= rhs.value;
2386 + checkconst ('~', lhs);
2387 + checkconst ('~', &rhs);
2388 + lhs->value ^= rhs.value;
2392 + return sb_skip_white (idx, string);
2395 +/* Parse the expression at offset idx into string, fill up res with
2396 + the result. Return the index of the first char past the
2400 +exp_parse (idx, string, res)
2405 + return level_5 (sb_skip_white (idx, string), string, res);
2408 +/* Turn the expression at exp into text and glue it onto the end of
2412 +exp_string (exp, string)
2418 + sb_reset (string);
2420 + if (exp->add_symbol.len)
2422 + sb_add_buffer (string, exp->add_symbol.name, exp->add_symbol.len);
2430 + sb_add_char (string, '+');
2431 + sprintf (buf, "%d", exp->value);
2432 + sb_add_string (string, buf);
2436 + if (exp->sub_symbol.len)
2438 + sb_add_char (string, '-');
2439 + sb_add_buffer (string, exp->add_symbol.name, exp->add_symbol.len);
2445 + sb_add_char (string, '0');
2448 +/* Parse the expression at offset idx into sb in. Return the value in
2449 + val. If the expression is not constant, give ERROR emsg. Return
2450 + the index of the first character past the end of the expression. */
2453 +exp_get_abs (emsg, idx, in, val)
2460 + idx = exp_parse (idx, in, &res);
2461 + if (res.add_symbol.len || res.sub_symbol.len)
2462 + ERROR ((stderr, "%s", emsg));
2467 +/* Current label parsed from line. */
2470 +/* Hash table for all assigned variables. */
2471 +hash_table assign_hash_table;
2473 +/* Hash table for keyword. */
2474 +hash_table keyword_hash_table;
2476 +/* Hash table for eq variables. */
2479 +#define in_comment ';'
2483 +strip_comments (out)
2486 + char *s = out->ptr;
2488 + for (i = 0; i < out->len; i++)
2490 + if (ISCOMMENTCHAR (s[i]))
2499 +/* Push back character ch so that it can be read again. */
2509 + if (sp->pushback_index)
2510 + sp->pushback_index--;
2512 + sb_add_char (&sp->pushback, ch);
2515 +/* Push the sb ptr onto the include stack, with the given name, type
2519 +include_buf (name, ptr, type, index)
2522 + include_type type;
2526 + if (sp - include_stack >= MAX_INCLUDES)
2527 + FATAL ((stderr, _("unreasonable nesting.\n")));
2528 + sb_new (&sp->name);
2529 + sb_add_sb (&sp->name, name);
2531 + sp->linecount = 1;
2532 + sp->pushback_index = 0;
2534 + sp->index = index;
2535 + sb_new (&sp->pushback);
2536 + sb_add_sb (&sp->pushback, ptr);
2539 +/* Used in ERROR messages, print info on where the include stack is
2543 +include_print_where_line (file)
2546 + struct include_stack *p = include_stack + 1;
2550 + fprintf (file, "%s:%d ", sb_name (&p->name), p->linecount - 1);
2555 +/* Used in listings, print the line number onto file. */
2558 +include_print_line (file)
2562 + struct include_stack *p = include_stack + 1;
2564 + n = fprintf (file, "%4d", p->linecount);
2568 + n += fprintf (file, ".%d", p->linecount);
2573 + fprintf (file, " ");
2578 +/* Read a line from the top of the include stack into sb in. */
2585 + int more = 1, ch = 0;
2589 + putc (comment_char, outfile);
2590 + if (print_line_number)
2591 + include_print_line (outfile);
2598 + while (ch == '\r')
2605 + WARNING ((stderr, _("End of file not at start of line.\n")));
2607 + putc ('\n', outfile);
2617 + putc (ch, outfile);
2626 + /* Continued line. */
2629 + putc (comment_char, outfile);
2630 + putc ('+', outfile);
2643 + sb_add_char (in, ch);
2648 + return more ? ch : 0;
2651 +/* Find a label from sb in and put it in out. */
2654 +grab_label (in, out)
2660 + if (ISFIRSTCHAR (in->ptr[i]) || in->ptr[i] == '\\')
2662 + sb_add_char (out, in->ptr[i]);
2664 + while ((ISNEXTCHAR (in->ptr[i])
2665 + || in->ptr[i] == '\\'
2666 + || in->ptr[i] == '&')
2669 + sb_add_char (out, in->ptr[i]);
2676 +/* Find all strange base stuff and turn into decimal. Also
2677 + find all the other numbers and convert them from the default radix. */
2680 +change_base (idx, in, out)
2687 + while (idx < in->len)
2689 + if (in->ptr[idx] == '\\'
2690 + && idx + 1 < in->len
2691 + && in->ptr[idx + 1] == '(')
2694 + while (idx < in->len
2695 + && in->ptr[idx] != ')')
2697 + sb_add_char (out, in->ptr[idx]);
2700 + if (idx < in->len)
2703 + else if (idx < in->len - 1 && in->ptr[idx + 1] == '\'' && ! mri)
2707 + switch (in->ptr[idx])
2726 + ERROR ((stderr, _("Illegal base character %c.\n"), in->ptr[idx]));
2731 + idx = sb_strtol (idx + 2, in, base, &value);
2732 + sprintf (buffer, "%d", value);
2733 + sb_add_string (out, buffer);
2735 + else if (ISFIRSTCHAR (in->ptr[idx]))
2737 + /* Copy entire names through quickly. */
2738 + sb_add_char (out, in->ptr[idx]);
2740 + while (idx < in->len && ISNEXTCHAR (in->ptr[idx]))
2742 + sb_add_char (out, in->ptr[idx]);
2746 + else if (is_flonum (idx, in))
2748 + idx = chew_flonum (idx, in, out);
2750 + else if (ISDIGIT (in->ptr[idx]))
2753 + /* All numbers must start with a digit, let's chew it and
2754 + spit out decimal. */
2755 + idx = sb_strtol (idx, in, radix, &value);
2756 + sprintf (buffer, "%d", value);
2757 + sb_add_string (out, buffer);
2759 + /* Skip all undigsested letters. */
2760 + while (idx < in->len && ISNEXTCHAR (in->ptr[idx]))
2762 + sb_add_char (out, in->ptr[idx]);
2766 + else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
2768 + char tchar = in->ptr[idx];
2769 + /* Copy entire names through quickly. */
2770 + sb_add_char (out, in->ptr[idx]);
2772 + while (idx < in->len && in->ptr[idx] != tchar)
2774 + sb_add_char (out, in->ptr[idx]);
2780 + /* Nothing special, just pass it through. */
2781 + sb_add_char (out, in->ptr[idx]);
2796 + fprintf (outfile, "%s\n", sb_name (in));
2802 +do_assign (again, idx, in)
2807 + /* Stick label in symbol table with following value. */
2812 + idx = exp_parse (idx, in, &e);
2813 + exp_string (&e, &acc);
2814 + hash_add_to_string_table (&assign_hash_table, &label, &acc, again);
2818 +/* .radix [b|q|d|h] */
2824 + int idx = sb_skip_white (0, ptr);
2825 + switch (ptr->ptr[idx])
2844 + ERROR ((stderr, _("radix is %c must be one of b, q, d or h"), radix));
2848 +/* Parse off a .b, .w or .l. */
2851 +get_opsize (idx, in, size)
2857 + if (in->ptr[idx] == '.')
2861 + switch (in->ptr[idx])
2879 + ERROR ((stderr, _("size must be one of b, w or l, is %c.\n"), in->ptr[idx]));
2892 + idx = sb_skip_white (idx, line);
2893 + if (idx < line->len
2894 + && ISCOMMENTCHAR(line->ptr[idx]))
2896 + if (idx >= line->len)
2901 +/* .data [.b|.w|.l] <data>*
2902 + or d[bwl] <data>* */
2905 +do_data (idx, in, size)
2911 + char *opname = ".yikes!";
2917 + idx = get_opsize (idx, in, &opsize);
2929 + opname = ".short";
2936 + fprintf (outfile, "%s\t", opname);
2938 + idx = sb_skip_white (idx, in);
2942 + && in->ptr[idx] == '"')
2945 + idx = getstring (idx, in, &acc);
2946 + for (i = 0; i < acc.len; i++)
2949 + fprintf (outfile, ",");
2950 + fprintf (outfile, "%d", acc.ptr[i]);
2955 + while (!eol (idx, in))
2958 + idx = exp_parse (idx, in, &e);
2959 + exp_string (&e, &acc);
2960 + sb_add_char (&acc, 0);
2961 + fprintf (outfile, "%s", acc.ptr);
2962 + if (idx < in->len && in->ptr[idx] == ',')
2964 + fprintf (outfile, ",");
2970 + sb_print_at (outfile, idx, in);
2971 + fprintf (outfile, "\n");
2974 +/* .datab [.b|.w|.l] <repeat>,<fill> */
2985 + idx = get_opsize (idx, in, &opsize);
2987 + idx = exp_get_abs (_("datab repeat must be constant.\n"), idx, in, &repeat);
2988 + idx = sb_skip_comma (idx, in);
2989 + idx = exp_get_abs (_("datab data must be absolute.\n"), idx, in, &fill);
2991 + fprintf (outfile, ".fill\t%d,%d,%d\n", repeat, opsize, fill);
2994 +/* .align <size> */
3001 + int al, have_fill, fill;
3003 + idx = exp_get_abs (_("align needs absolute expression.\n"), idx, in, &al);
3004 + idx = sb_skip_white (idx, in);
3007 + if (! eol (idx, in))
3009 + idx = sb_skip_comma (idx, in);
3010 + idx = exp_get_abs (_(".align needs absolute fill value.\n"), idx, in,
3015 + fprintf (outfile, ".align %d", al);
3017 + fprintf (outfile, ",%d", fill);
3018 + fprintf (outfile, "\n");
3021 +/* .res[.b|.w|.l] <size> */
3024 +do_res (idx, in, type)
3032 + idx = get_opsize (idx, in, &size);
3033 + while (!eol (idx, in))
3035 + idx = sb_skip_white (idx, in);
3036 + if (in->ptr[idx] == ',')
3038 + idx = exp_get_abs (_("res needs absolute expression for fill count.\n"), idx, in, &count);
3040 + if (type == 'c' || type == 'z')
3043 + fprintf (outfile, ".space %d\n", count * size);
3053 + fprintf (outfile, ".global %s\n", sb_name (in));
3056 +/* .print [list] [nolist] */
3063 + idx = sb_skip_white (idx, in);
3064 + while (idx < in->len)
3066 + if (strncasecmp (in->ptr + idx, "LIST", 4) == 0)
3068 + fprintf (outfile, ".list\n");
3071 + else if (strncasecmp (in->ptr + idx, "NOLIST", 6) == 0)
3073 + fprintf (outfile, ".nolist\n");
3083 +do_heading (idx, in)
3089 + idx = getstring (idx, in, &head);
3090 + fprintf (outfile, ".title \"%s\"\n", sb_name (&head));
3099 + fprintf (outfile, ".eject\n");
3102 +/* .form [lin=<value>] [col=<value>] */
3110 + int columns = 132;
3111 + idx = sb_skip_white (idx, in);
3113 + while (idx < in->len)
3116 + if (strncasecmp (in->ptr + idx, "LIN=", 4) == 0)
3119 + idx = exp_get_abs (_("form LIN= needs absolute expresssion.\n"), idx, in, &lines);
3122 + if (strncasecmp (in->ptr + idx, _("COL="), 4) == 0)
3125 + idx = exp_get_abs (_("form COL= needs absolute expresssion.\n"), idx, in, &columns);
3130 + fprintf (outfile, ".psize %d,%d\n", lines, columns);
3134 +/* Fetch string from the input stream,
3136 + 'Bxyx<whitespace> -> return 'Bxyza
3137 + %<char> -> return string of decimal value of x
3138 + "<string>" -> return string
3139 + xyx<whitespace> -> return xyz
3143 +get_any_string (idx, in, out, expand, pretend_quoted)
3148 + int pretend_quoted;
3151 + idx = sb_skip_white (idx, in);
3153 + if (idx < in->len)
3155 + if (in->len > 2 && in->ptr[idx + 1] == '\'' && ISBASE (in->ptr[idx]))
3157 + while (!ISSEP (in->ptr[idx]))
3158 + sb_add_char (out, in->ptr[idx++]);
3160 + else if (in->ptr[idx] == '%'
3166 + /* Turns the next expression into a string. */
3167 + /* xgettext: no-c-format */
3168 + idx = exp_get_abs (_("% operator needs absolute expression"),
3172 + sprintf (buf, "%d", val);
3173 + sb_add_string (out, buf);
3175 + else if (in->ptr[idx] == '"'
3176 + || in->ptr[idx] == '<'
3177 + || (alternate && in->ptr[idx] == '\''))
3179 + if (alternate && expand)
3181 + /* Keep the quotes. */
3182 + sb_add_char (out, '\"');
3184 + idx = getstring (idx, in, out);
3185 + sb_add_char (out, '\"');
3190 + idx = getstring (idx, in, out);
3195 + while (idx < in->len
3196 + && (in->ptr[idx] == '"'
3197 + || in->ptr[idx] == '\''
3199 + || !ISSEP (in->ptr[idx])))
3201 + if (in->ptr[idx] == '"'
3202 + || in->ptr[idx] == '\'')
3204 + char tchar = in->ptr[idx];
3205 + sb_add_char (out, in->ptr[idx++]);
3206 + while (idx < in->len
3207 + && in->ptr[idx] != tchar)
3208 + sb_add_char (out, in->ptr[idx++]);
3209 + if (idx == in->len)
3212 + sb_add_char (out, in->ptr[idx++]);
3220 +/* Skip along sb in starting at idx, suck off whitespace a ( and more
3221 + whitespace. Return the idx of the next char. */
3224 +skip_openp (idx, in)
3228 + idx = sb_skip_white (idx, in);
3229 + if (in->ptr[idx] != '(')
3230 + ERROR ((stderr, _("misplaced ( .\n")));
3231 + idx = sb_skip_white (idx + 1, in);
3235 +/* Skip along sb in starting at idx, suck off whitespace a ) and more
3236 + whitespace. Return the idx of the next char. */
3239 +skip_closep (idx, in)
3243 + idx = sb_skip_white (idx, in);
3244 + if (in->ptr[idx] != ')')
3245 + ERROR ((stderr, _("misplaced ).\n")));
3246 + idx = sb_skip_white (idx + 1, in);
3253 +dolen (idx, in, out)
3262 + sb_new (&stringout);
3263 + idx = skip_openp (idx, in);
3264 + idx = get_and_process (idx, in, &stringout);
3265 + idx = skip_closep (idx, in);
3266 + sprintf (buffer, "%d", stringout.len);
3267 + sb_add_string (out, buffer);
3269 + sb_kill (&stringout);
3276 +doinstr (idx, in, out)
3290 + idx = skip_openp (idx, in);
3291 + idx = get_and_process (idx, in, &string);
3292 + idx = sb_skip_comma (idx, in);
3293 + idx = get_and_process (idx, in, &search);
3294 + idx = sb_skip_comma (idx, in);
3295 + if (ISDIGIT (in->ptr[idx]))
3297 + idx = exp_get_abs (_(".instr needs absolute expresson.\n"), idx, in, &start);
3303 + idx = skip_closep (idx, in);
3305 + for (i = start; i < string.len; i++)
3307 + if (strncmp (string.ptr + i, search.ptr, search.len) == 0)
3313 + sprintf (buffer, "%d", res);
3314 + sb_add_string (out, buffer);
3315 + sb_kill (&string);
3316 + sb_kill (&search);
3321 +dosubstr (idx, in, out)
3331 + idx = skip_openp (idx, in);
3332 + idx = get_and_process (idx, in, &string);
3333 + idx = sb_skip_comma (idx, in);
3334 + idx = exp_get_abs (_("need absolute position.\n"), idx, in, &pos);
3335 + idx = sb_skip_comma (idx, in);
3336 + idx = exp_get_abs (_("need absolute length.\n"), idx, in, &len);
3337 + idx = skip_closep (idx, in);
3339 + if (len < 0 || pos < 0 ||
3341 + || pos + len > string.len)
3343 + sb_add_string (out, " ");
3347 + sb_add_char (out, '"');
3350 + sb_add_char (out, string.ptr[pos++]);
3353 + sb_add_char (out, '"');
3355 + sb_kill (&string);
3359 +/* Scan line, change tokens in the hash table to their replacements. */
3362 +process_assigns (idx, in, buf)
3367 + while (idx < in->len)
3370 + if (in->ptr[idx] == '\\'
3371 + && idx + 1 < in->len
3372 + && in->ptr[idx + 1] == '(')
3376 + sb_add_char (buf, in->ptr[idx]);
3379 + while (idx < in->len && in->ptr[idx - 1] != ')');
3381 + else if (in->ptr[idx] == '\\'
3382 + && idx + 1 < in->len
3383 + && in->ptr[idx + 1] == '&')
3385 + idx = condass_lookup_name (in, idx + 2, buf, 1);
3387 + else if (in->ptr[idx] == '\\'
3388 + && idx + 1 < in->len
3389 + && in->ptr[idx + 1] == '$')
3391 + idx = condass_lookup_name (in, idx + 2, buf, 0);
3393 + else if (idx + 3 < in->len
3394 + && in->ptr[idx] == '.'
3395 + && TOUPPER (in->ptr[idx + 1]) == 'L'
3396 + && TOUPPER (in->ptr[idx + 2]) == 'E'
3397 + && TOUPPER (in->ptr[idx + 3]) == 'N')
3398 + idx = dolen (idx + 4, in, buf);
3399 + else if (idx + 6 < in->len
3400 + && in->ptr[idx] == '.'
3401 + && TOUPPER (in->ptr[idx + 1]) == 'I'
3402 + && TOUPPER (in->ptr[idx + 2]) == 'N'
3403 + && TOUPPER (in->ptr[idx + 3]) == 'S'
3404 + && TOUPPER (in->ptr[idx + 4]) == 'T'
3405 + && TOUPPER (in->ptr[idx + 5]) == 'R')
3406 + idx = doinstr (idx + 6, in, buf);
3407 + else if (idx + 7 < in->len
3408 + && in->ptr[idx] == '.'
3409 + && TOUPPER (in->ptr[idx + 1]) == 'S'
3410 + && TOUPPER (in->ptr[idx + 2]) == 'U'
3411 + && TOUPPER (in->ptr[idx + 3]) == 'B'
3412 + && TOUPPER (in->ptr[idx + 4]) == 'S'
3413 + && TOUPPER (in->ptr[idx + 5]) == 'T'
3414 + && TOUPPER (in->ptr[idx + 6]) == 'R')
3415 + idx = dosubstr (idx + 7, in, buf);
3416 + else if (ISFIRSTCHAR (in->ptr[idx]))
3418 + /* May be a simple name subsitution, see if we have a word. */
3420 + int cur = idx + 1;
3421 + while (cur < in->len
3422 + && (ISNEXTCHAR (in->ptr[cur])))
3426 + sb_add_buffer (&acc, in->ptr + idx, cur - idx);
3427 + ptr = hash_lookup (&assign_hash_table, &acc);
3430 + /* Found a definition for it. */
3431 + sb_add_sb (buf, &ptr->value.s);
3435 + /* No definition, just copy the word. */
3436 + sb_add_sb (buf, &acc);
3443 + sb_add_char (buf, in->ptr[idx++]);
3449 +get_and_process (idx, in, out)
3456 + idx = get_any_string (idx, in, &t, 1, 0);
3457 + process_assigns (0, &t, out);
3475 + sb_new (&label_in);
3477 + more = get_line (&line);
3480 + /* Find any label and pseudo op that we're intested in. */
3482 + if (line.len == 0)
3484 + if (condass_on ())
3485 + fprintf (outfile, "\n");
3488 + && (line.ptr[0] == '*'
3489 + || line.ptr[0] == '!'))
3491 + /* MRI line comment. */
3492 + fprintf (outfile, "%s", sb_name (&line));
3496 + l = grab_label (&line, &label_in);
3497 + sb_reset (&label);
3499 + if (line.ptr[l] == ':')
3501 + while (ISWHITE (line.ptr[l]) && l < line.len)
3508 + /* Munge the label, unless this is EQU or ASSIGN. */
3511 + && (line.ptr[l] == '.' || alternate || mri))
3515 + if (line.ptr[lx] == '.')
3517 + if (lx + 3 <= line.len
3518 + && strncasecmp ("EQU", line.ptr + lx, 3) == 0
3519 + && (lx + 3 == line.len
3520 + || ! ISFIRSTCHAR (line.ptr[lx + 3])))
3522 + else if (lx + 6 <= line.len
3523 + && strncasecmp ("ASSIGN", line.ptr + lx, 6) == 0
3524 + && (lx + 6 == line.len
3525 + || ! ISFIRSTCHAR (line.ptr[lx + 6])))
3530 + process_assigns (0, &label_in, &label);
3532 + sb_add_sb (&label, &label_in);
3537 + if (process_pseudo_op (l, &line, &acc))
3541 + else if (condass_on ())
3543 + if (macro_op (l, &line))
3552 + fprintf (outfile, "%s:\t", sb_name (&label));
3555 + fprintf (outfile, "\t");
3557 + process_assigns (l, &line, &t1);
3559 + change_base (0, &t1, &t2);
3560 + fprintf (outfile, "%s\n", sb_name (&t2));
3567 + /* Only a label on this line. */
3568 + if (label.len && condass_on ())
3570 + fprintf (outfile, "%s:\n", sb_name (&label));
3578 + more = get_line (&line);
3581 + if (!had_end && !mri)
3582 + WARNING ((stderr, _("END missing from end of file.\n")));
3586 +free_old_entry (ptr)
3591 + if (ptr->type == hash_string)
3592 + sb_kill (&ptr->value.s);
3596 +/* name: .ASSIGNA <value> */
3599 +do_assigna (idx, in)
3607 + process_assigns (idx, in, &tmp);
3608 + idx = exp_get_abs (_(".ASSIGNA needs constant expression argument.\n"), 0, &tmp, &val);
3612 + ERROR ((stderr, _(".ASSIGNA without label.\n")));
3616 + hash_entry *ptr = hash_create (&vars, &label);
3617 + free_old_entry (ptr);
3618 + ptr->type = hash_integer;
3619 + ptr->value.i = val;
3624 +/* name: .ASSIGNC <string> */
3627 +do_assignc (idx, in)
3633 + idx = getstring (idx, in, &acc);
3637 + ERROR ((stderr, _(".ASSIGNS without label.\n")));
3641 + hash_entry *ptr = hash_create (&vars, &label);
3642 + free_old_entry (ptr);
3643 + ptr->type = hash_string;
3644 + sb_new (&ptr->value.s);
3645 + sb_add_sb (&ptr->value.s, &acc);
3650 +/* name: .REG (reg) */
3657 + /* Remove reg stuff from inside parens. */
3660 + idx = skip_openp (idx, in);
3662 + idx = sb_skip_white (idx, in);
3664 + while (idx < in->len
3667 + : in->ptr[idx] != ')'))
3669 + sb_add_char (&what, in->ptr[idx]);
3672 + hash_add_to_string_table (&assign_hash_table, &label, &what, 1);
3677 +condass_lookup_name (inbuf, idx, out, warn)
3685 + sb_new (&condass_acc);
3687 + while (idx < inbuf->len
3688 + && ISNEXTCHAR (inbuf->ptr[idx]))
3690 + sb_add_char (&condass_acc, inbuf->ptr[idx++]);
3693 + if (inbuf->ptr[idx] == '\'')
3695 + ptr = hash_lookup (&vars, &condass_acc);
3701 + WARNING ((stderr, _("Can't find preprocessor variable %s.\n"), sb_name (&condass_acc)));
3705 + sb_add_string (out, "0");
3710 + if (ptr->type == hash_integer)
3713 + sprintf (buffer, "%d", ptr->value.i);
3714 + sb_add_string (out, buffer);
3718 + sb_add_sb (out, &ptr->value.s);
3721 + sb_kill (&condass_acc);
3734 +whatcond (idx, in, val)
3741 + idx = sb_skip_white (idx, in);
3743 + if (idx + 1 < in->len)
3748 + p = in->ptr + idx;
3749 + a = TOUPPER (p[0]);
3750 + b = TOUPPER (p[1]);
3751 + if (a == 'E' && b == 'Q')
3753 + else if (a == 'N' && b == 'E')
3755 + else if (a == 'L' && b == 'T')
3757 + else if (a == 'L' && b == 'E')
3759 + else if (a == 'G' && b == 'T')
3761 + else if (a == 'G' && b == 'E')
3764 + if (cond == NEVER)
3766 + ERROR ((stderr, _("Comparison operator must be one of EQ, NE, LT, LE, GT or GE.\n")));
3769 + idx = sb_skip_white (idx + 2, in);
3786 + idx = sb_skip_white (idx, in);
3788 + if (in->ptr[idx] == '"')
3792 + /* This is a string comparision. */
3793 + idx = getstring (idx, in, &acc_a);
3794 + idx = whatcond (idx, in, &cond);
3795 + idx = getstring (idx, in, &acc_b);
3796 + same = acc_a.len == acc_b.len
3797 + && (strncmp (acc_a.ptr, acc_b.ptr, acc_a.len) == 0);
3799 + if (cond != EQ && cond != NE)
3801 + ERROR ((stderr, _("Comparison operator for strings must be EQ or NE\n")));
3805 + res = (cond != EQ) ^ same;
3808 + /* This is a numeric expression. */
3813 + idx = exp_get_abs (_("Conditional operator must have absolute operands.\n"), idx, in, &vala);
3814 + idx = whatcond (idx, in, &cond);
3815 + idx = sb_skip_white (idx, in);
3816 + if (in->ptr[idx] == '"')
3818 + WARNING ((stderr, _("String compared against expression.\n")));
3823 + idx = exp_get_abs (_("Conditional operator must have absolute operands.\n"), idx, in, &valb);
3830 + res = vala == valb;
3833 + res = vala != valb;
3836 + res = vala < valb;
3839 + res = vala <= valb;
3842 + res = vala > valb;
3845 + res = vala >= valb;
3867 + if (ifi >= IFNESTING)
3869 + FATAL ((stderr, _("AIF nesting unreasonable.\n")));
3872 + ifstack[ifi].on = ifstack[ifi - 1].on ? istrue (idx, in) : 0;
3873 + ifstack[ifi].hadelse = 0;
3881 + ifstack[ifi].on = ifstack[ifi - 1].on ? !ifstack[ifi].on : 0;
3882 + if (ifstack[ifi].hadelse)
3884 + ERROR ((stderr, _("Multiple AELSEs in AIF.\n")));
3886 + ifstack[ifi].hadelse = 1;
3900 + ERROR ((stderr, _("AENDI without AIF.\n")));
3907 + return ifstack[ifi].on;
3910 +/* MRI IFEQ, IFNE, IFLT, IFLE, IFGE, IFGT. */
3913 +do_if (idx, in, cond)
3921 + if (ifi >= IFNESTING)
3923 + FATAL ((stderr, _("IF nesting unreasonable.\n")));
3926 + idx = exp_get_abs (_("Conditional operator must have absolute operands.\n"),
3931 + case EQ: res = val == 0; break;
3932 + case NE: res = val != 0; break;
3933 + case LT: res = val < 0; break;
3934 + case LE: res = val <= 0; break;
3935 + case GE: res = val >= 0; break;
3936 + case GT: res = val > 0; break;
3940 + ifstack[ifi].on = ifstack[ifi - 1].on ? res : 0;
3941 + ifstack[ifi].hadelse = 0;
3944 +/* Get a string for the MRI IFC or IFNC pseudo-ops. */
3947 +get_mri_string (idx, in, val, terminator)
3953 + idx = sb_skip_white (idx, in);
3956 + && in->ptr[idx] == '\'')
3958 + sb_add_char (val, '\'');
3959 + for (++idx; idx < in->len; ++idx)
3961 + sb_add_char (val, in->ptr[idx]);
3962 + if (in->ptr[idx] == '\'')
3965 + if (idx >= in->len
3966 + || in->ptr[idx] != '\'')
3970 + idx = sb_skip_white (idx, in);
3976 + while (idx < in->len
3977 + && in->ptr[idx] != terminator)
3979 + sb_add_char (val, in->ptr[idx]);
3983 + while (i >= 0 && ISWHITE (val->ptr[i]))
3991 +/* MRI IFC, IFNC */
3994 +do_ifc (idx, in, ifnc)
4003 + if (ifi >= IFNESTING)
4005 + FATAL ((stderr, _("IF nesting unreasonable.\n")));
4011 + idx = get_mri_string (idx, in, &first, ',');
4013 + if (idx >= in->len || in->ptr[idx] != ',')
4015 + ERROR ((stderr, _("Bad format for IF or IFNC.\n")));
4019 + idx = get_mri_string (idx + 1, in, &second, ';');
4021 + res = (first.len == second.len
4022 + && strncmp (first.ptr, second.ptr, first.len) == 0);
4026 + ifstack[ifi].on = ifstack[ifi - 1].on ? res : 0;
4027 + ifstack[ifi].hadelse = 0;
4036 + ERROR ((stderr, _("AENDR without a AREPEAT.\n")));
4038 + ERROR ((stderr, _("ENDR without a REPT.\n")));
4044 +do_awhile (idx, in)
4048 + int line = linecount ();
4056 + process_assigns (idx, in, &exp);
4057 + doit = istrue (0, &exp);
4059 + if (! buffer_and_nest ("AWHILE", "AENDW", &sub, get_line))
4060 + FATAL ((stderr, _("AWHILE without a AENDW at %d.\n"), line - 1));
4075 + int index = include_next_index ();
4079 + sb_add_sb (©, &sub);
4080 + sb_add_sb (©, in);
4081 + sb_add_string (©, "\n");
4082 + sb_add_sb (©, &sub);
4083 + sb_add_string (©, "\t.AENDW\n");
4084 + /* Push another WHILE. */
4085 + include_buf (&exp, ©, include_while, index);
4097 + ERROR ((stderr, _("AENDW without a AENDW.\n")));
4102 + Pop things off the include stack until the type and index changes. */
4107 + include_type type = sp->type;
4108 + if (type == include_repeat
4109 + || type == include_while
4110 + || type == include_macro)
4112 + int index = sp->index;
4114 + while (sp->index == index
4115 + && sp->type == type)
4125 +do_arepeat (idx, in)
4129 + int line = linecount ();
4130 + sb exp; /* Buffer with expression in it. */
4131 + sb copy; /* Expanded repeat block. */
4132 + sb sub; /* Contents of AREPEAT. */
4140 + process_assigns (idx, in, &exp);
4141 + idx = exp_get_abs (_("AREPEAT must have absolute operand.\n"), 0, &exp, &rc);
4143 + ret = buffer_and_nest ("AREPEAT", "AENDR", &sub, get_line);
4145 + ret = buffer_and_nest ("REPT", "ENDR", &sub, get_line);
4147 + FATAL ((stderr, _("AREPEAT without a AENDR at %d.\n"), line - 1));
4150 + /* Push back the text following the repeat, and another repeat block
4161 + int index = include_next_index ();
4162 + sb_add_sb (©, &sub);
4166 + sprintf (buffer, "\t.AREPEAT %d\n", rc - 1);
4168 + sprintf (buffer, "\tREPT %d\n", rc - 1);
4169 + sb_add_string (©, buffer);
4170 + sb_add_sb (©, &sub);
4172 + sb_add_string (©, " .AENDR\n");
4174 + sb_add_string (©, " ENDR\n");
4177 + include_buf (&exp, ©, include_repeat, index);
4189 + ERROR ((stderr, _(".ENDM without a matching .MACRO.\n")));
4192 +/* MRI IRP pseudo-op. */
4195 +do_irp (idx, in, irpc)
4205 + err = expand_irp (irpc, idx, in, &out, get_line, comment_char);
4207 + ERROR ((stderr, "%s\n", err));
4209 + fprintf (outfile, "%s", sb_terminate (&out));
4214 +/* Macro processing. */
4216 +/* Parse off LOCAL n1, n2,... Invent a label name for it. */
4219 +do_local (idx, line)
4220 + int idx ATTRIBUTE_UNUSED;
4221 + sb *line ATTRIBUTE_UNUSED;
4223 + ERROR ((stderr, _("LOCAL outside of MACRO")));
4232 + int line = linecount ();
4234 + err = define_macro (idx, in, &label, get_line, "[gasp]", line, (const char **) NULL);
4236 + ERROR ((stderr, _("macro at line %d: %s\n"), line - 1, err));
4248 + if (! macro_defined)
4251 + sb_terminate (in);
4252 + if (! check_macro (in->ptr + idx, &out, comment_char, &err, NULL))
4256 + ERROR ((stderr, "%s\n", err));
4259 + sb_add_string (&name, _("macro expansion"));
4261 + include_buf (&name, &out, include_macro, include_next_index ());
4269 +/* String handling. */
4272 +getstring (idx, in, acc)
4277 + idx = sb_skip_white (idx, in);
4279 + while (idx < in->len
4280 + && (in->ptr[idx] == '"'
4281 + || in->ptr[idx] == '<'
4282 + || (in->ptr[idx] == '\'' && alternate)))
4284 + if (in->ptr[idx] == '<')
4286 + if (alternate || mri)
4290 + while ((in->ptr[idx] != '>' || nest)
4293 + if (in->ptr[idx] == '!')
4296 + sb_add_char (acc, in->ptr[idx++]);
4300 + if (in->ptr[idx] == '>')
4302 + if (in->ptr[idx] == '<')
4304 + sb_add_char (acc, in->ptr[idx++]);
4313 + idx = exp_get_abs (_("Character code in string must be absolute expression.\n"),
4315 + sb_add_char (acc, code);
4317 + if (in->ptr[idx] != '>')
4318 + ERROR ((stderr, _("Missing > for character code.\n")));
4322 + else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
4324 + char tchar = in->ptr[idx];
4326 + while (idx < in->len)
4328 + if (alternate && in->ptr[idx] == '!')
4331 + sb_add_char (acc, in->ptr[idx++]);
4335 + if (in->ptr[idx] == tchar)
4338 + if (idx >= in->len || in->ptr[idx] != tchar)
4341 + sb_add_char (acc, in->ptr[idx]);
4351 +/* .SDATA[C|Z] <string> */
4354 +do_sdata (idx, in, type)
4363 + fprintf (outfile, ".byte\t");
4365 + while (!eol (idx, in))
4369 + idx = sb_skip_white (idx, in);
4370 + while (!eol (idx, in))
4372 + pidx = idx = get_any_string (idx, in, &acc, 0, 1);
4375 + if (acc.len > 255)
4377 + ERROR ((stderr, _("string for SDATAC longer than 255 characters (%d).\n"), acc.len));
4379 + fprintf (outfile, "%d", acc.len);
4383 + for (i = 0; i < acc.len; i++)
4387 + fprintf (outfile, ",");
4389 + fprintf (outfile, "%d", acc.ptr[i]);
4396 + fprintf (outfile, ",");
4397 + fprintf (outfile, "0");
4399 + idx = sb_skip_comma (idx, in);
4403 + if (!alternate && in->ptr[idx] != ',' && idx != in->len)
4405 + fprintf (outfile, "\n");
4406 + ERROR ((stderr, _("illegal character in SDATA line (0x%x).\n"),
4413 + fprintf (outfile, "\n");
4416 +/* .SDATAB <count> <string> */
4419 +do_sdatab (idx, in)
4428 + idx = exp_get_abs (_("Must have absolute SDATAB repeat count.\n"), idx, in, &repeat);
4431 + ERROR ((stderr, _("Must have positive SDATAB repeat count (%d).\n"), repeat));
4435 + idx = sb_skip_comma (idx, in);
4436 + idx = getstring (idx, in, &acc);
4438 + for (i = 0; i < repeat; i++)
4441 + fprintf (outfile, "\t");
4442 + fprintf (outfile, ".byte\t");
4443 + sb_print (outfile, &acc);
4444 + fprintf (outfile, "\n");
4454 + FILE *newone = fopen (name, "r");
4458 + if (isp == MAX_INCLUDES)
4459 + FATAL ((stderr, _("Unreasonable include depth (%ld).\n"), (long) isp));
4462 + sp->handle = newone;
4464 + sb_new (&sp->name);
4465 + sb_add_string (&sp->name, name);
4467 + sp->linecount = 1;
4468 + sp->pushback_index = 0;
4469 + sp->type = include_file;
4471 + sb_new (&sp->pushback);
4476 +do_include (idx, in)
4482 + include_path *includes;
4488 + idx = getstring (idx, in, &t);
4491 + idx = sb_skip_white (idx, in);
4492 + while (idx < in->len && ! ISWHITE (in->ptr[idx]))
4494 + sb_add_char (&t, in->ptr[idx]);
4499 + for (includes = paths_head; includes; includes = includes->next)
4502 + sb_add_sb (&cat, &includes->path);
4503 + sb_add_char (&cat, '/');
4504 + sb_add_sb (&cat, &t);
4505 + if (new_file (sb_name (&cat)))
4512 + if (! new_file (sb_name (&t)))
4513 + FATAL ((stderr, _("Can't open include file `%s'.\n"), sb_name (&t)));
4522 + if (sp != include_stack)
4525 + fclose (sp->handle);
4530 +/* Get the next character from the include stack. If there's anything
4531 + in the pushback buffer, take that first. If we're at eof, pop from
4532 + the stack and try again. Keep the linecount up to date. */
4539 + if (sp->pushback.len != sp->pushback_index)
4541 + r = (char) (sp->pushback.ptr[sp->pushback_index++]);
4542 + /* When they've all gone, reset the pointer. */
4543 + if (sp->pushback_index == sp->pushback.len)
4545 + sp->pushback.len = 0;
4546 + sp->pushback_index = 0;
4549 + else if (sp->handle)
4551 + r = getc (sp->handle);
4556 + if (r == EOF && isp)
4560 + while (r == EOF && isp)
4578 + return sp->linecount;
4582 +include_next_index ()
4586 + && index > MAX_REASONABLE)
4587 + FATAL ((stderr, _("Unreasonable expansion (-u turns off check).\n")));
4591 +/* Initialize the chartype vector. */
4597 + for (x = 0; x < 256; x++)
4599 + if (ISALPHA (x) || x == '_' || x == '$')
4600 + chartype[x] |= FIRSTBIT;
4602 + if (mri && x == '.')
4603 + chartype[x] |= FIRSTBIT;
4605 + if (ISDIGIT (x) || ISALPHA (x) || x == '_' || x == '$')
4606 + chartype[x] |= NEXTBIT;
4608 + if (x == ' ' || x == '\t' || x == ',' || x == '"' || x == ';'
4609 + || x == '"' || x == '<' || x == '>' || x == ')' || x == '(')
4610 + chartype[x] |= SEPBIT;
4612 + if (x == 'b' || x == 'B'
4613 + || x == 'q' || x == 'Q'
4614 + || x == 'h' || x == 'H'
4615 + || x == 'd' || x == 'D')
4616 + chartype [x] |= BASEBIT;
4618 + if (x == ' ' || x == '\t')
4619 + chartype[x] |= WHITEBIT;
4621 + if (x == comment_char)
4622 + chartype[x] |= COMMENTBIT;
4626 +/* What to do with all the keywords. */
4627 +#define PROCESS 0x1000 /* Run substitution over the line. */
4628 +#define LAB 0x2000 /* Spit out the label. */
4630 +#define K_EQU (PROCESS|1)
4631 +#define K_ASSIGN (PROCESS|2)
4632 +#define K_REG (PROCESS|3)
4633 +#define K_ORG (PROCESS|4)
4634 +#define K_RADIX (PROCESS|5)
4635 +#define K_DATA (LAB|PROCESS|6)
4636 +#define K_DATAB (LAB|PROCESS|7)
4637 +#define K_SDATA (LAB|PROCESS|8)
4638 +#define K_SDATAB (LAB|PROCESS|9)
4639 +#define K_SDATAC (LAB|PROCESS|10)
4640 +#define K_SDATAZ (LAB|PROCESS|11)
4641 +#define K_RES (LAB|PROCESS|12)
4642 +#define K_SRES (LAB|PROCESS|13)
4643 +#define K_SRESC (LAB|PROCESS|14)
4644 +#define K_SRESZ (LAB|PROCESS|15)
4645 +#define K_EXPORT (LAB|PROCESS|16)
4646 +#define K_GLOBAL (LAB|PROCESS|17)
4647 +#define K_PRINT (LAB|PROCESS|19)
4648 +#define K_FORM (LAB|PROCESS|20)
4649 +#define K_HEADING (LAB|PROCESS|21)
4650 +#define K_PAGE (LAB|PROCESS|22)
4651 +#define K_IMPORT (LAB|PROCESS|23)
4652 +#define K_PROGRAM (LAB|PROCESS|24)
4653 +#define K_END (PROCESS|25)
4654 +#define K_INCLUDE (PROCESS|26)
4655 +#define K_IGNORED (PROCESS|27)
4656 +#define K_ASSIGNA (PROCESS|28)
4657 +#define K_ASSIGNC (29)
4658 +#define K_AIF (PROCESS|30)
4659 +#define K_AELSE (PROCESS|31)
4660 +#define K_AENDI (PROCESS|32)
4661 +#define K_AREPEAT (PROCESS|33)
4662 +#define K_AENDR (PROCESS|34)
4663 +#define K_AWHILE (35)
4664 +#define K_AENDW (PROCESS|36)
4665 +#define K_EXITM (37)
4666 +#define K_MACRO (PROCESS|38)
4667 +#define K_ENDM (39)
4668 +#define K_ALIGN (PROCESS|LAB|40)
4669 +#define K_ALTERNATE (41)
4670 +#define K_DB (LAB|PROCESS|42)
4671 +#define K_DW (LAB|PROCESS|43)
4672 +#define K_DL (LAB|PROCESS|44)
4673 +#define K_LOCAL (45)
4674 +#define K_IFEQ (PROCESS|46)
4675 +#define K_IFNE (PROCESS|47)
4676 +#define K_IFLT (PROCESS|48)
4677 +#define K_IFLE (PROCESS|49)
4678 +#define K_IFGE (PROCESS|50)
4679 +#define K_IFGT (PROCESS|51)
4680 +#define K_IFC (PROCESS|52)
4681 +#define K_IFNC (PROCESS|53)
4682 +#define K_IRP (PROCESS|54)
4683 +#define K_IRPC (PROCESS|55)
4691 +static struct keyword kinfo[] = {
4692 + { "EQU", K_EQU, 0 },
4693 + { "ALTERNATE", K_ALTERNATE, 0 },
4694 + { "ASSIGN", K_ASSIGN, 0 },
4695 + { "REG", K_REG, 0 },
4696 + { "ORG", K_ORG, 0 },
4697 + { "RADIX", K_RADIX, 0 },
4698 + { "DATA", K_DATA, 0 },
4699 + { "DB", K_DB, 0 },
4700 + { "DW", K_DW, 0 },
4701 + { "DL", K_DL, 0 },
4702 + { "DATAB", K_DATAB, 0 },
4703 + { "SDATA", K_SDATA, 0 },
4704 + { "SDATAB", K_SDATAB, 0 },
4705 + { "SDATAZ", K_SDATAZ, 0 },
4706 + { "SDATAC", K_SDATAC, 0 },
4707 + { "RES", K_RES, 0 },
4708 + { "SRES", K_SRES, 0 },
4709 + { "SRESC", K_SRESC, 0 },
4710 + { "SRESZ", K_SRESZ, 0 },
4711 + { "EXPORT", K_EXPORT, 0 },
4712 + { "GLOBAL", K_GLOBAL, 0 },
4713 + { "PRINT", K_PRINT, 0 },
4714 + { "FORM", K_FORM, 0 },
4715 + { "HEADING", K_HEADING, 0 },
4716 + { "PAGE", K_PAGE, 0 },
4717 + { "PROGRAM", K_IGNORED, 0 },
4718 + { "END", K_END, 0 },
4719 + { "INCLUDE", K_INCLUDE, 0 },
4720 + { "ASSIGNA", K_ASSIGNA, 0 },
4721 + { "ASSIGNC", K_ASSIGNC, 0 },
4722 + { "AIF", K_AIF, 0 },
4723 + { "AELSE", K_AELSE, 0 },
4724 + { "AENDI", K_AENDI, 0 },
4725 + { "AREPEAT", K_AREPEAT, 0 },
4726 + { "AENDR", K_AENDR, 0 },
4727 + { "EXITM", K_EXITM, 0 },
4728 + { "MACRO", K_MACRO, 0 },
4729 + { "ENDM", K_ENDM, 0 },
4730 + { "AWHILE", K_AWHILE, 0 },
4731 + { "ALIGN", K_ALIGN, 0 },
4732 + { "AENDW", K_AENDW, 0 },
4733 + { "ALTERNATE", K_ALTERNATE, 0 },
4734 + { "LOCAL", K_LOCAL, 0 },
4738 +/* Although the conditional operators are handled by gas, we need to
4739 + handle them here as well, in case they are used in a recursive
4740 + macro to end the recursion. */
4742 +static struct keyword mrikinfo[] = {
4743 + { "IFEQ", K_IFEQ, 0 },
4744 + { "IFNE", K_IFNE, 0 },
4745 + { "IFLT", K_IFLT, 0 },
4746 + { "IFLE", K_IFLE, 0 },
4747 + { "IFGE", K_IFGE, 0 },
4748 + { "IFGT", K_IFGT, 0 },
4749 + { "IFC", K_IFC, 0 },
4750 + { "IFNC", K_IFNC, 0 },
4751 + { "ELSEC", K_AELSE, 0 },
4752 + { "ENDC", K_AENDI, 0 },
4753 + { "MEXIT", K_EXITM, 0 },
4754 + { "REPT", K_AREPEAT, 0 },
4755 + { "IRP", K_IRP, 0 },
4756 + { "IRPC", K_IRPC, 0 },
4757 + { "ENDR", K_AENDR, 0 },
4761 +/* Look for a pseudo op on the line. If one's there then call
4765 +process_pseudo_op (idx, line, acc)
4772 + if (line->ptr[idx] == '.' || alternate || mri)
4774 + /* Scan forward and find pseudo name. */
4780 + if (line->ptr[idx] == '.')
4782 + in = line->ptr + idx;
4787 + while (idx < line->len && *e && ISFIRSTCHAR (*e))
4789 + sb_add_char (acc, *e);
4794 + ptr = hash_lookup (&keyword_hash_table, acc);
4799 + /* This one causes lots of pain when trying to preprocess
4801 + WARNING ((stderr, _("Unrecognised pseudo op `%s'.\n"),
4806 + if (ptr->value.i & LAB)
4808 + /* Output the label. */
4811 + fprintf (outfile, "%s:\t", sb_name (&label));
4814 + fprintf (outfile, "\t");
4817 + if (mri && ptr->value.i == K_END)
4822 + sb_add_buffer (&t, line->ptr + oidx, idx - oidx);
4823 + fprintf (outfile, "\t%s", sb_name (&t));
4827 + if (ptr->value.i & PROCESS)
4829 + /* Polish the rest of the line before handling the pseudo op. */
4831 + strip_comments (line);
4834 + process_assigns (idx, line, acc);
4836 + change_base (0, acc, line);
4839 + if (!condass_on ())
4841 + switch (ptr->value.i)
4844 + do_aif (idx, line);
4857 + switch (ptr->value.i)
4861 + macro_init (1, mri, 0, exp_get_abs);
4870 + ERROR ((stderr, _("ORG command not allowed.\n")));
4876 + do_data (idx, line, 1);
4879 + do_data (idx, line, 2);
4882 + do_data (idx, line, 4);
4885 + do_data (idx, line, 0);
4888 + do_datab (idx, line);
4891 + do_sdata (idx, line, 0);
4894 + do_sdatab (idx, line);
4897 + do_sdata (idx, line, 'c');
4900 + do_sdata (idx, line, 'z');
4903 + do_assign (0, 0, line);
4906 + do_aif (idx, line);
4909 + do_arepeat (idx, line);
4915 + do_awhile (idx, line);
4921 + do_assign (1, idx, line);
4924 + do_align (idx, line);
4927 + do_res (idx, line, 0);
4930 + do_res (idx, line, 's');
4933 + do_include (idx, line);
4936 + do_local (idx, line);
4939 + do_macro (idx, line);
4945 + do_res (idx, line, 'c');
4948 + do_print (idx, line);
4951 + do_form (idx, line);
4954 + do_heading (idx, line);
4966 + do_res (idx, line, 'z');
4974 + do_assigna (idx, line);
4977 + do_assignc (idx, line);
4983 + do_reg (idx, line);
4986 + do_if (idx, line, EQ);
4989 + do_if (idx, line, NE);
4992 + do_if (idx, line, LT);
4995 + do_if (idx, line, LE);
4998 + do_if (idx, line, GE);
5001 + do_if (idx, line, GT);
5004 + do_ifc (idx, line, 0);
5007 + do_ifc (idx, line, 1);
5010 + do_irp (idx, line, 0);
5013 + do_irp (idx, line, 1);
5021 +/* Add a keyword to the hash table. */
5024 +add_keyword (name, code)
5032 + sb_add_string (&label, name);
5034 + hash_add_to_int_table (&keyword_hash_table, &label, code);
5036 + sb_reset (&label);
5037 + for (j = 0; name[j]; j++)
5038 + sb_add_char (&label, name[j] - 'A' + 'a');
5039 + hash_add_to_int_table (&keyword_hash_table, &label, code);
5044 +/* Build the keyword hash table - put each keyword in the table twice,
5045 + once upper and once lower case. */
5052 + for (i = 0; kinfo[i].name; i++)
5053 + add_keyword (kinfo[i].name, kinfo[i].code);
5057 + for (i = 0; mrikinfo[i].name; i++)
5058 + add_keyword (mrikinfo[i].name, mrikinfo[i].code);
5064 + const char *string;
5073 + if (*string == '=')
5080 + sb_add_char (&value, *string);
5083 + exp_get_abs (_("Invalid expression on command line.\n"),
5088 + sb_add_char (&label, *string);
5093 + ptr = hash_create (&vars, &label);
5094 + free_old_entry (ptr);
5095 + ptr->type = hash_integer;
5096 + ptr->value.i = res;
5100 +char *program_name;
5102 +/* The list of long options. */
5103 +static struct option long_options[] =
5105 + { "alternate", no_argument, 0, 'a' },
5106 + { "include", required_argument, 0, 'I' },
5107 + { "commentchar", required_argument, 0, 'c' },
5108 + { "copysource", no_argument, 0, 's' },
5109 + { "debug", no_argument, 0, 'd' },
5110 + { "help", no_argument, 0, 'h' },
5111 + { "mri", no_argument, 0, 'M' },
5112 + { "output", required_argument, 0, 'o' },
5113 + { "print", no_argument, 0, 'p' },
5114 + { "unreasonable", no_argument, 0, 'u' },
5115 + { "version", no_argument, 0, 'v' },
5116 + { "define", required_argument, 0, 'd' },
5117 + { NULL, no_argument, 0, 0 }
5120 +/* Show a usage message and exit. */
5122 +show_usage (file, status)
5126 + fprintf (file, _("\
5128 + [-a] [--alternate] enter alternate macro mode\n\
5129 + [-c char] [--commentchar char] change the comment character from !\n\
5130 + [-d] [--debug] print some debugging info\n\
5131 + [-h] [--help] print this message\n\
5132 + [-M] [--mri] enter MRI compatibility mode\n\
5133 + [-o out] [--output out] set the output file\n\
5134 + [-p] [--print] print line numbers\n"), program_name);
5135 + fprintf (file, _("\
5136 + [-s] [--copysource] copy source through as comments \n\
5137 + [-u] [--unreasonable] allow unreasonable nesting\n\
5138 + [-v] [--version] print the program version\n\
5139 + [-Dname=value] create preprocessor variable called name, with value\n\
5140 + [-Ipath] add to include path list\n\
5143 + printf (_("Report bugs to %s\n"), REPORT_BUGS_TO);
5147 +/* Display a help message and exit. */
5152 + printf (_("%s: Gnu Assembler Macro Preprocessor\n"), program_name);
5153 + show_usage (stdout, 0);
5156 +int main PARAMS ((int, char **));
5164 + char *out_name = 0;
5165 + sp = include_stack;
5167 + ifstack[0].on = 1;
5170 +#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
5171 + setlocale (LC_MESSAGES, "");
5173 +#if defined (HAVE_SETLOCALE)
5174 + setlocale (LC_CTYPE, "");
5176 + bindtextdomain (PACKAGE, LOCALEDIR);
5177 + textdomain (PACKAGE);
5179 + program_name = argv[0];
5180 + xmalloc_set_program_name (program_name);
5182 + hash_new_table (101, &keyword_hash_table);
5183 + hash_new_table (101, &assign_hash_table);
5184 + hash_new_table (101, &vars);
5188 + while ((opt = getopt_long (argc, argv, "I:sdhavc:upo:D:M", long_options,
5195 + out_name = optarg;
5202 + include_path *p = (include_path *) xmalloc (sizeof (include_path));
5204 + sb_new (&p->path);
5205 + sb_add_string (&p->path, optarg);
5207 + paths_tail->next = p;
5214 + print_line_number = 1;
5217 + comment_char = optarg[0];
5229 + do_define (optarg);
5233 + comment_char = ';';
5239 + /* This output is intended to follow the GNU standards document. */
5240 + printf (_("GNU assembler pre-processor %s\n"), program_version);
5241 + printf (_("Copyright 1996 Free Software Foundation, Inc.\n"));
5243 +This program is free software; you may redistribute it under the terms of\n\
5244 +the GNU General Public License. This program has absolutely no warranty.\n"));
5250 + show_usage (stderr, 1);
5257 + macro_init (alternate, mri, 0, exp_get_abs);
5261 + outfile = fopen (out_name, "w");
5264 + fprintf (stderr, _("%s: Can't open output file `%s'.\n"),
5265 + program_name, out_name);
5278 + /* Process all the input files. */
5280 + while (optind < argc)
5282 + if (new_file (argv[optind]))
5288 + fprintf (stderr, _("%s: Can't open input file `%s'.\n"),
5289 + program_name, argv[optind]);
5299 +/* This function is used because an abort in some of the other files
5300 + may be compiled into as_abort because they include as.h. */
5303 +as_abort (file, line, fn)
5304 + const char *file, *fn;
5307 + fprintf (stderr, _("Internal error, aborting at %s line %d"), file, line);
5309 + fprintf (stderr, " in %s", fn);
5310 + fprintf (stderr, _("\nPlease report this bug.\n"));
5314 +/* duplicated from as internals */
5317 +identify (char *file)
5319 + static int identified;
5326 + fprintf (stderr, "%s: ", file);
5327 + fprintf (stderr, _("Assembler messages:\n"));
5330 +/* The number of warnings issued. */
5331 +static int warning_count;
5333 +/* The common portion of as_warn and as_warn_where. */
5336 +as_warn_internal (char *file, unsigned int line, char *buffer)
5342 + fprintf (stderr, "%s:%u: ", file, line);
5343 + fprintf (stderr, _("Warning: "));
5344 + fputs (buffer, stderr);
5345 + (void) putc ('\n', stderr);
5348 +/* Send to stderr a string as a warning, and locate warning
5350 + Please only use this for when we have some recovery action.
5351 + Please explain in string (which may have '\n's) what recovery was
5355 +as_warn (const char *format, ...)
5358 + char buffer[2000];
5360 + if (1 /*!flag_no_warnings*/)
5362 + va_start (args, format);
5363 + vsprintf (buffer, format, args);
5365 + as_warn_internal ((char *) NULL, 0, buffer);
5369 +/* Like as_bad but the file name and line number are passed in.
5370 + Unfortunately, we have to repeat the function in order to handle
5371 + the varargs correctly and portably. */
5374 +as_warn_where (char *file, unsigned int line, const char *format, ...)
5377 + char buffer[2000];
5379 + if (1 /*!flag_no_warnings*/)
5381 + va_start (args, format);
5382 + vsprintf (buffer, format, args);
5384 + as_warn_internal (file, line, buffer);
5388 +/* Nonzero if we've hit a 'bad error', and should not write an obj file,
5389 + and exit with a nonzero error code. */
5391 +static int error_count;
5393 +/* The common portion of as_bad and as_bad_where. */
5396 +as_bad_internal (char *file, unsigned int line, char *buffer)
5402 + fprintf (stderr, "%s:%u: ", file, line);
5403 + fprintf (stderr, _("Error: "));
5404 + fputs (buffer, stderr);
5405 + (void) putc ('\n', stderr);
5408 +/* Send to stderr a string as a warning, and locate warning in input
5409 + file(s). Please us when there is no recovery, but we want to
5410 + continue processing but not produce an object file.
5411 + Please explain in string (which may have '\n's) what recovery was
5415 +as_bad (const char *format, ...)
5418 + char buffer[2000];
5420 + va_start (args, format);
5421 + vsprintf (buffer, format, args);
5424 + as_bad_internal ((char *) NULL, 0, buffer);
5427 +/* Like as_bad but the file name and line number are passed in.
5428 + Unfortunately, we have to repeat the function in order to handle
5429 + the varargs correctly and portably. */
5432 +as_bad_where (char *file, unsigned int line, const char *format, ...)
5435 + char buffer[2000];
5437 + va_start (args, format);
5438 + vsprintf (buffer, format, args);
5441 + as_bad_internal (file, line, buffer);
5445 +/* The m88k unfortunately uses @ as a label beginner. */
5450 +/* The RS/6000 assembler uses {,},[,] as parts of symbol names. */
5455 +/* The Delta 68k assembler permits % inside label names. */
5460 +/* The PowerPC Windows NT assemblers permits ? inside label names. */
5465 +/* The IA-64 assembler uses # as a suffix designating a symbol. We include
5466 + it in the symbol and strip it out in tc_canonicalize_symbol_name. */
5471 +/* The a29k assembler does not permits labels to start with $. */
5472 +#define LEX_DOLLAR 3
5476 +/* The Delta 68k assembler permits ~ at start of label names. */
5477 +#define LEX_TILDE 0
5480 +/* Used by is_... macros. our ctype[]. */
5481 +char lex_type[256] = {
5482 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */
5483 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */
5484 + 0, 0, 0, LEX_HASH, LEX_DOLLAR, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
5485 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM, /* 0123456789:;<=>? */
5486 + LEX_AT, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */
5487 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 3, /* PQRSTUVWXYZ[\]^_ */
5488 + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* `abcdefghijklmno */
5489 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, LEX_TILDE, 0, /* pqrstuvwxyz{|}~. */
5490 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5491 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5492 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5493 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5494 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5495 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5496 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5497 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
5500 +/* just a stub to satisfy unused function in sb.o */
5501 +int do_scrub_chars (int (*get) (char*, int), char *tostart, int tolen) {}
5502 diff -urNbB binutils-2.16.91.0.2.org/gas/macro.c binutils-2.16.91.0.2/gas/macro.c
5503 --- binutils-2.16.91.0.2.org/gas/macro.c 2005-05-10 22:46:44.000000000 +0000
5504 +++ binutils-2.16.91.0.2/gas/macro.c 2005-07-21 18:31:04.000000000 +0000
5506 static int get_apost_token (int, sb *, sb *, int);
5507 static int sub_actual (int, sb *, sb *, struct hash_control *, int, sb *, int);
5508 static const char *macro_expand_body
5509 - (sb *, sb *, formal_entry *, struct hash_control *, const macro_entry *);
5510 -static const char *macro_expand (int, sb *, macro_entry *, sb *);
5511 + (sb *, sb *, formal_entry *, struct hash_control *, const macro_entry *, int);
5512 +static const char *macro_expand (int, sb *, macro_entry *, sb *, int);
5513 static void free_macro(macro_entry *);
5515 #define ISWHITE(x) ((x) == ' ' || (x) == '\t')
5519 macro_expand_body (sb *in, sb *out, formal_entry *formals,
5520 - struct hash_control *formal_hash, const macro_entry *macro)
5521 + struct hash_control *formal_hash, const macro_entry *macro, int comment_char)
5524 int src = 0, inquote = 0, macro_line = 0;
5525 @@ -794,7 +794,14 @@
5526 else if (in->ptr[src] == '\\')
5529 - if (src < in->len && in->ptr[src] == '(')
5530 + if (in->ptr[src] == comment_char && comment_char != '\0')
5532 + /* This is a comment, just drop the rest of the line. */
5533 + while (src < in->len
5534 + && in->ptr[src] != '\n')
5537 + else if (src < in->len && in->ptr[src] == '(')
5539 /* Sub in till the next ')' literally. */
5544 src = sb_skip_white (src + 5, in);
5545 - while (in->ptr[src] != '\n')
5546 + while (in->ptr[src] != '\n' && in->ptr[src] != comment_char)
5549 formal_entry *f = new_formal ();
5550 @@ -911,6 +918,17 @@
5554 + else if (comment_char != '\0'
5555 + && in->ptr[src] == comment_char
5556 + && src + 1 < in->len
5557 + && in->ptr[src + 1] == comment_char
5560 + /* Two comment chars in a row cause the rest of the line to
5562 + while (src < in->len && in->ptr[src] != '\n')
5565 else if (in->ptr[src] == '"'
5566 || (macro_mri && in->ptr[src] == '\''))
5568 @@ -992,7 +1010,7 @@
5572 -macro_expand (int idx, sb *in, macro_entry *m, sb *out)
5573 +macro_expand (int idx, sb *in, macro_entry *m, sb *out, int comment_char)
5577 @@ -1038,7 +1056,7 @@
5579 /* Peel off the actuals and store them away in the hash tables' actuals. */
5580 idx = sb_skip_white (idx, in);
5581 - while (idx < in->len)
5582 + while (idx < in->len && in->ptr[idx] != comment_char)
5586 @@ -1167,7 +1185,7 @@
5587 sb_add_string (&ptr->actual, buffer);
5590 - err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m);
5591 + err = macro_expand_body (&m->sub, out, m->formals, m->formal_hash, m, comment_char);
5594 /* Discard any unnamed formal arguments. */
5595 @@ -1200,7 +1218,7 @@
5596 *EXPAND. Return 1 if a macro is found, 0 otherwise. */
5599 -check_macro (const char *line, sb *expand,
5600 +check_macro (const char *line, sb *expand, int comment_char,
5601 const char **error, macro_entry **info)
5604 @@ -1235,7 +1253,7 @@
5605 sb_add_char (&line_sb, *s++);
5608 - *error = macro_expand (0, &line_sb, macro, expand);
5609 + *error = macro_expand (0, &line_sb, macro, expand, comment_char);
5613 @@ -1296,7 +1314,7 @@
5614 success, or an error message otherwise. */
5617 -expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *))
5618 +expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *), int comment_char)
5622 @@ -1329,16 +1347,16 @@
5625 idx = sb_skip_comma (idx, in);
5626 - if (idx >= in->len)
5627 + if (idx >= in->len || in->ptr[idx] == comment_char)
5629 /* Expand once with a null string. */
5630 - err = macro_expand_body (&sub, out, &f, h, 0);
5631 + err = macro_expand_body (&sub, out, &f, h, 0, comment_char);
5635 if (irpc && in->ptr[idx] == '"')
5637 - while (idx < in->len)
5638 + while (idx < in->len && in->ptr[idx] != comment_char)
5641 idx = get_any_string (idx, in, &f.actual);
5642 @@ -1349,7 +1367,7 @@
5645 nxt = sb_skip_white (idx + 1, in);
5646 - if (nxt >= in->len)
5647 + if (nxt >= in->len || in->ptr[nxt] == comment_char)
5651 @@ -1359,7 +1377,7 @@
5652 sb_add_char (&f.actual, in->ptr[idx]);
5655 - err = macro_expand_body (&sub, out, &f, h, 0);
5656 + err = macro_expand_body (&sub, out, &f, h, 0, comment_char);
5660 diff -urNbB binutils-2.16.91.0.2.org/gas/macro.h binutils-2.16.91.0.2/gas/macro.h
5661 --- binutils-2.16.91.0.2.org/gas/macro.h 2005-05-10 22:46:44.000000000 +0000
5662 +++ binutils-2.16.91.0.2/gas/macro.h 2005-07-21 18:31:04.000000000 +0000
5664 extern void macro_mri_mode (int);
5665 extern const char *define_macro
5666 (int, sb *, sb *, int (*) (sb *), char *, unsigned int, const char **);
5667 -extern int check_macro (const char *, sb *, const char **, macro_entry **);
5668 +extern int check_macro (const char *, sb *, int, const char **, macro_entry **);
5669 extern void delete_macro (const char *);
5670 -extern const char *expand_irp (int, int, sb *, sb *, int (*) (sb *));
5671 +extern const char *expand_irp (int, int, sb *, sb *, int (*) (sb *), int);
5674 diff -urNbB binutils-2.16.91.0.2.org/gas/macro.h.orig binutils-2.16.91.0.2/gas/macro.h.orig
5675 --- binutils-2.16.91.0.2.org/gas/macro.h.orig 1970-01-01 00:00:00.000000000 +0000
5676 +++ binutils-2.16.91.0.2/gas/macro.h.orig 2005-05-10 22:46:44.000000000 +0000
5678 +/* macro.h - header file for macro support for gas
5679 + Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2002, 2003, 2004
5680 + Free Software Foundation, Inc.
5682 + Written by Steve and Judy Chamberlain of Cygnus Support,
5685 + This file is part of GAS, the GNU Assembler.
5687 + GAS is free software; you can redistribute it and/or modify
5688 + it under the terms of the GNU General Public License as published by
5689 + the Free Software Foundation; either version 2, or (at your option)
5690 + any later version.
5692 + GAS is distributed in the hope that it will be useful,
5693 + but WITHOUT ANY WARRANTY; without even the implied warranty of
5694 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5695 + GNU General Public License for more details.
5697 + You should have received a copy of the GNU General Public License
5698 + along with GAS; see the file COPYING. If not, write to the Free
5699 + Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
5700 + 02110-1301, USA. */
5706 +#include "ansidecl.h"
5709 +/* Structures used to store macros.
5711 + Each macro knows its name and included text. It gets built with a
5712 + list of formal arguments, and also keeps a hash table which points
5713 + into the list to speed up formal search. Each formal knows its
5714 + name and its default value. Each time the macro is expanded, the
5715 + formals get the actual values attached to them. */
5717 +/* Describe the formal arguments to a macro. */
5719 +typedef struct formal_struct {
5720 + struct formal_struct *next; /* Next formal in list. */
5721 + sb name; /* Name of the formal. */
5722 + sb def; /* The default value. */
5723 + sb actual; /* The actual argument (changed on each expansion). */
5724 + int index; /* The index of the formal 0..formal_count - 1. */
5730 + } type; /* The kind of the formal. */
5733 +/* Other values found in the index field of a formal_entry. */
5734 +#define QUAL_INDEX (-1)
5735 +#define NARG_INDEX (-2)
5736 +#define LOCAL_INDEX (-3)
5738 +/* Describe the macro. */
5740 +typedef struct macro_struct
5742 + sb sub; /* Substitution text. */
5743 + int formal_count; /* Number of formal args. */
5744 + formal_entry *formals; /* Pointer to list of formal_structs. */
5745 + struct hash_control *formal_hash; /* Hash table of formals. */
5746 + const char *name; /* Macro name. */
5747 + char *file; /* File the macro was defined in. */
5748 + unsigned int line; /* Line number of definition. */
5751 +/* Whether any macros have been defined. */
5753 +extern int macro_defined;
5755 +/* The macro nesting level. */
5757 +extern int macro_nest;
5759 +/* The macro hash table. */
5761 +extern struct hash_control *macro_hash;
5763 +extern int buffer_and_nest (const char *, const char *, sb *, int (*) (sb *));
5764 +extern void macro_init
5765 + (int, int, int, int (*) (const char *, int, sb *, int *));
5766 +extern void macro_set_alternate (int);
5767 +extern void macro_mri_mode (int);
5768 +extern const char *define_macro
5769 + (int, sb *, sb *, int (*) (sb *), char *, unsigned int, const char **);
5770 +extern int check_macro (const char *, sb *, const char **, macro_entry **);
5771 +extern void delete_macro (const char *);
5772 +extern const char *expand_irp (int, int, sb *, sb *, int (*) (sb *));
5775 diff -urNbB binutils-2.16.91.0.2.org/gas/read.c binutils-2.16.91.0.2/gas/read.c
5776 --- binutils-2.16.91.0.2.org/gas/read.c 2005-06-22 20:53:34.000000000 +0000
5777 +++ binutils-2.16.91.0.2/gas/read.c 2005-07-21 18:31:04.000000000 +0000
5782 - if (check_macro (line, &out, &err, ¯o))
5783 + if (check_macro (line, &out, '\0', &err, ¯o))
5787 @@ -1958,7 +1958,7 @@
5791 - err = expand_irp (irpc, 0, &s, &out, get_line_sb);
5792 + err = expand_irp (irpc, 0, &s, &out, get_line_sb, '\0');
5794 as_bad_where (file, line, "%s", err);
5796 diff -urNbB binutils-2.16.91.0.2.org/gas/read.c.orig binutils-2.16.91.0.2/gas/read.c.orig
5797 --- binutils-2.16.91.0.2.org/gas/read.c.orig 1970-01-01 00:00:00.000000000 +0000
5798 +++ binutils-2.16.91.0.2/gas/read.c.orig 2005-06-22 20:53:34.000000000 +0000
5800 +/* read.c - read a source file -
5801 + Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
5802 + 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
5803 + Free Software Foundation, Inc.
5805 +This file is part of GAS, the GNU Assembler.
5807 +GAS is free software; you can redistribute it and/or modify
5808 +it under the terms of the GNU General Public License as published by
5809 +the Free Software Foundation; either version 2, or (at your option)
5812 +GAS is distributed in the hope that it will be useful,
5813 +but WITHOUT ANY WARRANTY; without even the implied warranty of
5814 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5815 +GNU General Public License for more details.
5817 +You should have received a copy of the GNU General Public License
5818 +along with GAS; see the file COPYING. If not, write to the Free
5819 +Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
5820 +02110-1301, USA. */
5822 +/* If your chars aren't 8 bits, you will change this a bit (eg. to 0xFF).
5823 + But then, GNU isn't spozed to run on your machine anyway.
5824 + (RMS is so shortsighted sometimes.) */
5825 +#define MASK_CHAR ((int)(unsigned char) -1)
5827 +/* This is the largest known floating point format (for now). It will
5828 + grow when we do 4361 style flonums. */
5829 +#define MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT (16)
5831 +/* Routines that read assembler source text to build spaghetti in memory.
5832 + Another group of these functions is in the expr.c module. */
5835 +#include "safe-ctype.h"
5836 +#include "subsegs.h"
5839 +#include "obstack.h"
5840 +#include "listing.h"
5842 +#include "dw2gencfi.h"
5844 +#ifndef TC_START_LABEL
5845 +#define TC_START_LABEL(x,y) (x == ':')
5848 +/* Set by the object-format or the target. */
5849 +#ifndef TC_IMPLICIT_LCOMM_ALIGNMENT
5850 +#define TC_IMPLICIT_LCOMM_ALIGNMENT(SIZE, P2VAR) \
5853 + if ((SIZE) >= 8) \
5855 + else if ((SIZE) >= 4) \
5857 + else if ((SIZE) >= 2) \
5865 +char *input_line_pointer; /*->next char of source file to parse. */
5867 +#if BITS_PER_CHAR != 8
5868 +/* The following table is indexed by[(char)] and will break if
5869 + a char does not have exactly 256 states (hopefully 0:255!)! */
5874 +/* The m88k unfortunately uses @ as a label beginner. */
5879 +/* The RS/6000 assembler uses {,},[,] as parts of symbol names. */
5884 +/* The Delta 68k assembler permits % inside label names. */
5889 +/* The PowerPC Windows NT assemblers permits ? inside label names. */
5894 +/* The IA-64 assembler uses # as a suffix designating a symbol. We include
5895 + it in the symbol and strip it out in tc_canonicalize_symbol_name. */
5900 +/* The a29k assembler does not permits labels to start with $. */
5901 +#define LEX_DOLLAR 3
5905 +/* The Delta 68k assembler permits ~ at start of label names. */
5906 +#define LEX_TILDE 0
5909 +/* Used by is_... macros. our ctype[]. */
5910 +char lex_type[256] = {
5911 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */
5912 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */
5913 + 0, 0, 0, LEX_HASH, LEX_DOLLAR, LEX_PCT, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */
5914 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, LEX_QM, /* 0123456789:;<=>? */
5915 + LEX_AT, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */
5916 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, 0, 3, /* PQRSTUVWXYZ[\]^_ */
5917 + 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* `abcdefghijklmno */
5918 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, LEX_BR, 0, LEX_BR, LEX_TILDE, 0, /* pqrstuvwxyz{|}~. */
5919 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5920 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5921 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5922 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5923 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5924 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5925 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
5926 + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
5929 +/* In: a character.
5930 + Out: 1 if this character ends a line. */
5931 +char is_end_of_line[256] = {
5933 + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, /* @abcdefghijklmno */
5935 + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* @abcdefghijklmno */
5937 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5938 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* _!"#$%&'()*+,-./ */
5939 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0123456789:;<=>? */
5940 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5941 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5942 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5943 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5944 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5945 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5946 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5947 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5948 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5949 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5950 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* */
5951 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* */
5954 +#ifndef TC_CASE_SENSITIVE
5955 +char original_case_string[128];
5958 +/* Functions private to this file. */
5960 +static char *buffer; /* 1st char of each buffer of lines is here. */
5961 +static char *buffer_limit; /*->1 + last char in buffer. */
5963 +/* TARGET_BYTES_BIG_ENDIAN is required to be defined to either 0 or 1
5964 + in the tc-<CPU>.h file. See the "Porting GAS" section of the
5965 + internals manual. */
5966 +int target_big_endian = TARGET_BYTES_BIG_ENDIAN;
5968 +/* Variables for handling include file directory table. */
5970 +/* Table of pointers to directories to search for .include's. */
5971 +char **include_dirs;
5973 +/* How many are in the table. */
5974 +int include_dir_count;
5976 +/* Length of longest in table. */
5977 +int include_dir_maxlen = 1;
5979 +#ifndef WORKING_DOT_WORD
5980 +struct broken_word *broken_words;
5981 +int new_broken_words;
5984 +/* The current offset into the absolute section. We don't try to
5985 + build frags in the absolute section, since no data can be stored
5986 + there. We just keep track of the current offset. */
5987 +addressT abs_section_offset;
5989 +/* If this line had an MRI style label, it is stored in this variable.
5990 + This is used by some of the MRI pseudo-ops. */
5991 +symbolS *line_label;
5993 +/* This global variable is used to support MRI common sections. We
5994 + translate such sections into a common symbol. This variable is
5995 + non-NULL when we are in an MRI common section. */
5996 +symbolS *mri_common_symbol;
5998 +/* In MRI mode, after a dc.b pseudo-op with an odd number of bytes, we
5999 + need to align to an even byte boundary unless the next pseudo-op is
6000 + dc.b, ds.b, or dcb.b. This variable is set to 1 if an alignment
6002 +static int mri_pending_align;
6006 +/* This variable is set to be non-zero if the next string we see might
6007 + be the name of the source file in DWARF debugging information. See
6008 + the comment in emit_expr for the format we look for. */
6009 +static int dwarf_file_string;
6013 +static void do_s_func (int end_p, const char *default_prefix);
6014 +static void do_align (int, char *, int, int);
6015 +static void s_align (int, int);
6016 +static void s_altmacro (int);
6017 +static void s_bad_end (int);
6018 +static int hex_float (int, char *);
6019 +static segT get_known_segmented_expression (expressionS * expP);
6020 +static void pobegin (void);
6021 +static int get_line_sb (sb *);
6022 +static void generate_file_debug (void);
6023 +static char *_find_end_of_line (char *, int, int);
6031 + obj_read_begin_hook ();
6033 + /* Something close -- but not too close -- to a multiple of 1024.
6034 + The debugging malloc I'm using has 24 bytes of overhead. */
6035 + obstack_begin (¬es, chunksize);
6036 + obstack_begin (&cond_obstack, chunksize);
6038 + /* Use machine dependent syntax. */
6039 + for (p = line_separator_chars; *p; p++)
6040 + is_end_of_line[(unsigned char) *p] = 1;
6041 + /* Use more. FIXME-SOMEDAY. */
6044 + lex_type['?'] = 3;
6047 +#ifndef TC_ADDRESS_BYTES
6048 +#ifdef BFD_ASSEMBLER
6049 +#define TC_ADDRESS_BYTES address_bytes
6052 +address_bytes (void)
6054 + /* Choose smallest of 1, 2, 4, 8 bytes that is large enough to
6055 + contain an address. */
6056 + int n = (stdoutput->arch_info->bits_per_address - 1) / 8;
6065 +/* Set up pseudo-op tables. */
6067 +static struct hash_control *po_hash;
6069 +static const pseudo_typeS potable[] = {
6070 + {"abort", s_abort, 0},
6071 + {"align", s_align_ptwo, 0},
6072 + {"altmacro", s_altmacro, 1},
6073 + {"ascii", stringer, 0},
6074 + {"asciz", stringer, 1},
6075 + {"balign", s_align_bytes, 0},
6076 + {"balignw", s_align_bytes, -2},
6077 + {"balignl", s_align_bytes, -4},
6079 + {"byte", cons, 1},
6080 + {"comm", s_comm, 0},
6081 + {"common", s_mri_common, 0},
6082 + {"common.s", s_mri_common, 1},
6083 + {"data", s_data, 0},
6085 +#ifdef TC_ADDRESS_BYTES
6086 + {"dc.a", cons, 0},
6088 + {"dc.b", cons, 1},
6089 + {"dc.d", float_cons, 'd'},
6090 + {"dc.l", cons, 4},
6091 + {"dc.s", float_cons, 'f'},
6092 + {"dc.w", cons, 2},
6093 + {"dc.x", float_cons, 'x'},
6094 + {"dcb", s_space, 2},
6095 + {"dcb.b", s_space, 1},
6096 + {"dcb.d", s_float_space, 'd'},
6097 + {"dcb.l", s_space, 4},
6098 + {"dcb.s", s_float_space, 'f'},
6099 + {"dcb.w", s_space, 2},
6100 + {"dcb.x", s_float_space, 'x'},
6101 + {"ds", s_space, 2},
6102 + {"ds.b", s_space, 1},
6103 + {"ds.d", s_space, 8},
6104 + {"ds.l", s_space, 4},
6105 + {"ds.p", s_space, 12},
6106 + {"ds.s", s_space, 4},
6107 + {"ds.w", s_space, 2},
6108 + {"ds.x", s_space, 12},
6109 + {"debug", s_ignore, 0},
6111 + {"desc", s_desc, 0},
6114 + {"double", float_cons, 'd'},
6116 + {"eject", listing_eject, 0}, /* Formfeed listing. */
6117 + {"else", s_else, 0},
6118 + {"elsec", s_else, 0},
6119 + {"elseif", s_elseif, (int) O_ne},
6120 + {"end", s_end, 0},
6121 + {"endc", s_endif, 0},
6122 + {"endfunc", s_func, 1},
6123 + {"endif", s_endif, 0},
6124 + {"endm", s_bad_end, 0},
6125 + {"endr", s_bad_end, 1},
6127 + {"equ", s_set, 0},
6128 + {"equiv", s_set, 1},
6129 + {"err", s_err, 0},
6130 + {"error", s_errwarn, 1},
6131 + {"exitm", s_mexit, 0},
6133 + {"extern", s_ignore, 0}, /* We treat all undef as ext. */
6134 + {"appfile", s_app_file, 1},
6135 + {"appline", s_app_line, 0},
6136 + {"fail", s_fail, 0},
6137 + {"file", s_app_file, 0},
6138 + {"fill", s_fill, 0},
6139 + {"float", float_cons, 'f'},
6140 + {"format", s_ignore, 0},
6141 + {"func", s_func, 0},
6142 + {"global", s_globl, 0},
6143 + {"globl", s_globl, 0},
6144 + {"hword", cons, 2},
6145 + {"if", s_if, (int) O_ne},
6146 + {"ifb", s_ifb, 1},
6147 + {"ifc", s_ifc, 0},
6148 + {"ifdef", s_ifdef, 0},
6149 + {"ifeq", s_if, (int) O_eq},
6150 + {"ifeqs", s_ifeqs, 0},
6151 + {"ifge", s_if, (int) O_ge},
6152 + {"ifgt", s_if, (int) O_gt},
6153 + {"ifle", s_if, (int) O_le},
6154 + {"iflt", s_if, (int) O_lt},
6155 + {"ifnb", s_ifb, 0},
6156 + {"ifnc", s_ifc, 1},
6157 + {"ifndef", s_ifdef, 1},
6158 + {"ifne", s_if, (int) O_ne},
6159 + {"ifnes", s_ifeqs, 1},
6160 + {"ifnotdef", s_ifdef, 1},
6161 + {"incbin", s_incbin, 0},
6162 + {"include", s_include, 0},
6164 + {"irp", s_irp, 0},
6165 + {"irep", s_irp, 0},
6166 + {"irpc", s_irp, 1},
6167 + {"irepc", s_irp, 1},
6168 + {"lcomm", s_lcomm, 0},
6169 + {"lflags", listing_flags, 0}, /* Listing flags. */
6170 + {"linkonce", s_linkonce, 0},
6171 + {"list", listing_list, 1}, /* Turn listing on. */
6172 + {"llen", listing_psize, 1},
6173 + {"long", cons, 4},
6174 + {"lsym", s_lsym, 0},
6175 + {"macro", s_macro, 0},
6176 + {"mexit", s_mexit, 0},
6177 + {"mri", s_mri, 0},
6178 + {".mri", s_mri, 0}, /* Special case so .mri works in MRI mode. */
6179 + {"name", s_ignore, 0},
6180 + {"noaltmacro", s_altmacro, 0},
6181 + {"noformat", s_ignore, 0},
6182 + {"nolist", listing_list, 0}, /* Turn listing off. */
6183 + {"nopage", listing_nopage, 0},
6184 + {"octa", cons, 16},
6185 + {"offset", s_struct, 0},
6186 + {"org", s_org, 0},
6187 + {"p2align", s_align_ptwo, 0},
6188 + {"p2alignw", s_align_ptwo, -2},
6189 + {"p2alignl", s_align_ptwo, -4},
6190 + {"page", listing_eject, 0},
6191 + {"plen", listing_psize, 0},
6192 + {"print", s_print, 0},
6193 + {"psize", listing_psize, 0}, /* Set paper size. */
6194 + {"purgem", s_purgem, 0},
6195 + {"quad", cons, 8},
6196 + {"rep", s_rept, 0},
6197 + {"rept", s_rept, 0},
6198 + {"rva", s_rva, 4},
6199 + {"sbttl", listing_title, 1}, /* Subtitle of listing. */
6202 + {"set", s_set, 0},
6203 + {"short", cons, 2},
6204 + {"single", float_cons, 'f'},
6206 + {"space", s_space, 0},
6207 + {"skip", s_space, 0},
6208 + {"sleb128", s_leb128, 1},
6209 + {"spc", s_ignore, 0},
6210 + {"stabd", s_stab, 'd'},
6211 + {"stabn", s_stab, 'n'},
6212 + {"stabs", s_stab, 's'},
6213 + {"string", stringer, 1},
6214 + {"struct", s_struct, 0},
6216 + {"text", s_text, 0},
6218 + /* This is for gcc to use. It's only just been added (2/94), so gcc
6219 + won't be able to use it for a while -- probably a year or more.
6220 + But once this has been released, check with gcc maintainers
6221 + before deleting it or even changing the spelling. */
6222 + {"this_GCC_requires_the_GNU_assembler", s_ignore, 0},
6223 + /* If we're folding case -- done for some targets, not necessarily
6224 + all -- the above string in an input file will be converted to
6225 + this one. Match it either way... */
6226 + {"this_gcc_requires_the_gnu_assembler", s_ignore, 0},
6228 + {"title", listing_title, 0}, /* Listing title. */
6229 + {"ttl", listing_title, 0},
6231 + {"uleb128", s_leb128, 0},
6234 + {"xcom", s_comm, 0},
6235 + {"xdef", s_globl, 0},
6236 + {"xref", s_ignore, 0},
6237 + {"xstabs", s_xstab, 's'},
6238 + {"warning", s_errwarn, 0},
6239 + {"word", cons, 2},
6240 + {"zero", s_space, 0},
6241 + {NULL, NULL, 0} /* End sentinel. */
6245 +get_absolute_expr (expressionS *exp)
6248 + if (exp->X_op != O_constant)
6250 + if (exp->X_op != O_absent)
6251 + as_bad (_("bad or irreducible absolute expression"));
6252 + exp->X_add_number = 0;
6254 + return exp->X_add_number;
6258 +get_absolute_expression (void)
6262 + return get_absolute_expr (&exp);
6265 +static int pop_override_ok = 0;
6266 +static const char *pop_table_name;
6269 +pop_insert (const pseudo_typeS *table)
6271 + const char *errtxt;
6272 + const pseudo_typeS *pop;
6273 + for (pop = table; pop->poc_name; pop++)
6275 + errtxt = hash_insert (po_hash, pop->poc_name, (char *) pop);
6276 + if (errtxt && (!pop_override_ok || strcmp (errtxt, "exists")))
6277 + as_fatal (_("error constructing %s pseudo-op table: %s"), pop_table_name,
6282 +#ifndef md_pop_insert
6283 +#define md_pop_insert() pop_insert(md_pseudo_table)
6286 +#ifndef obj_pop_insert
6287 +#define obj_pop_insert() pop_insert(obj_pseudo_table)
6290 +#ifndef cfi_pop_insert
6291 +#define cfi_pop_insert() pop_insert(cfi_pseudo_table)
6297 + po_hash = hash_new ();
6299 + /* Do the target-specific pseudo ops. */
6300 + pop_table_name = "md";
6303 + /* Now object specific. Skip any that were in the target table. */
6304 + pop_table_name = "obj";
6305 + pop_override_ok = 1;
6306 + obj_pop_insert ();
6308 + /* Now portable ones. Skip any that we've seen already. */
6309 + pop_table_name = "standard";
6310 + pop_insert (potable);
6312 +#ifdef TARGET_USE_CFIPOP
6313 + pop_table_name = "cfi";
6314 + pop_override_ok = 1;
6315 + cfi_pop_insert ();
6319 +#define HANDLE_CONDITIONAL_ASSEMBLY() \
6320 + if (ignore_input ()) \
6322 + char *eol = find_end_of_line (input_line_pointer, flag_m68k_mri); \
6323 + input_line_pointer = (input_line_pointer <= buffer_limit \
6324 + && eol >= buffer_limit) \
6330 +/* This function is used when scrubbing the characters between #APP
6333 +static char *scrub_string;
6334 +static char *scrub_string_end;
6337 +scrub_from_string (char *buf, int buflen)
6341 + copy = scrub_string_end - scrub_string;
6342 + if (copy > buflen)
6344 + memcpy (buf, scrub_string, copy);
6345 + scrub_string += copy;
6349 +/* Helper function of read_a_source_file, which tries to expand a macro. */
6351 +try_macro (char term, const char *line)
6355 + macro_entry *macro;
6357 + if (check_macro (line, &out, &err, ¯o))
6360 + as_bad ("%s", err);
6361 + *input_line_pointer++ = term;
6362 + input_scrub_include_sb (&out,
6363 + input_line_pointer, 1);
6366 + input_scrub_next_buffer (&input_line_pointer);
6367 +#ifdef md_macro_info
6368 + md_macro_info (macro);
6375 +/* We read the file, putting things into a web that represents what we
6376 + have been reading. */
6378 +read_a_source_file (char *name)
6381 + register char *s; /* String of symbol, '\0' appended. */
6382 + register int temp;
6383 + pseudo_typeS *pop;
6385 +#ifdef WARN_COMMENTS
6386 + found_comment = 0;
6389 + buffer = input_scrub_new_file (name);
6391 + listing_file (name);
6392 + listing_newline (NULL);
6393 + register_dependency (name);
6395 + /* Generate debugging information before we've read anything in to denote
6396 + this file as the "main" source file and not a subordinate one
6397 + (e.g. N_SO vs N_SOL in stabs). */
6398 + generate_file_debug ();
6400 + while ((buffer_limit = input_scrub_next_buffer (&input_line_pointer)) != 0)
6401 + { /* We have another line to parse. */
6403 + /* In order to avoid listing macro expansion lines with labels
6404 + multiple times, keep track of which line was last issued. */
6405 + static char *last_eol;
6409 + know (buffer_limit[-1] == '\n'); /* Must have a sentinel. */
6411 + while (input_line_pointer < buffer_limit)
6413 + /* We have more of this buffer to parse. */
6415 + /* We now have input_line_pointer->1st char of next line.
6416 + If input_line_pointer [-1] == '\n' then we just
6417 + scanned another line: so bump line counters. */
6418 + if (is_end_of_line[(unsigned char) input_line_pointer[-1]])
6420 +#ifdef md_start_line_hook
6421 + md_start_line_hook ();
6423 + if (input_line_pointer[-1] == '\n')
6424 + bump_line_counters ();
6426 + line_label = NULL;
6428 + if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
6430 + /* Text at the start of a line must be a label, we
6431 + run down and stick a colon in. */
6432 + if (is_name_beginner (*input_line_pointer))
6434 + char *line_start = input_line_pointer;
6436 + int mri_line_macro;
6438 + LISTING_NEWLINE ();
6439 + HANDLE_CONDITIONAL_ASSEMBLY ();
6441 + c = get_symbol_end ();
6443 + /* In MRI mode, the EQU and MACRO pseudoops must
6444 + be handled specially. */
6445 + mri_line_macro = 0;
6446 + if (flag_m68k_mri)
6448 + char *rest = input_line_pointer + 1;
6452 + if (*rest == ' ' || *rest == '\t')
6454 + if ((strncasecmp (rest, "EQU", 3) == 0
6455 + || strncasecmp (rest, "SET", 3) == 0)
6456 + && (rest[3] == ' ' || rest[3] == '\t'))
6458 + input_line_pointer = rest + 3;
6459 + equals (line_start,
6460 + strncasecmp (rest, "SET", 3) == 0);
6463 + if (strncasecmp (rest, "MACRO", 5) == 0
6464 + && (rest[5] == ' '
6465 + || rest[5] == '\t'
6466 + || is_end_of_line[(unsigned char) rest[5]]))
6467 + mri_line_macro = 1;
6470 + /* In MRI mode, we need to handle the MACRO
6471 + pseudo-op specially: we don't want to put the
6472 + symbol in the symbol table. */
6473 + if (!mri_line_macro
6474 +#ifdef TC_START_LABEL_WITHOUT_COLON
6475 + && TC_START_LABEL_WITHOUT_COLON(c,
6476 + input_line_pointer)
6479 + line_label = colon (line_start);
6481 + line_label = symbol_create (line_start,
6484 + &zero_address_frag);
6486 + *input_line_pointer = c;
6488 + input_line_pointer++;
6493 + /* We are at the beginning of a line, or similar place.
6494 + We expect a well-formed assembler statement.
6495 + A "symbol-name:" is a statement.
6497 + Depending on what compiler is used, the order of these tests
6498 + may vary to catch most common case 1st.
6499 + Each test is independent of all other tests at the (top) level.
6500 + PLEASE make a compiler that doesn't use this assembler.
6501 + It is crufty to waste a compiler's time encoding things for this
6502 + assembler, which then wastes more time decoding it.
6503 + (And communicating via (linear) files is silly!
6504 + If you must pass stuff, please pass a tree!) */
6505 + if ((c = *input_line_pointer++) == '\t'
6509 + c = *input_line_pointer++;
6511 + know (c != ' '); /* No further leading whitespace. */
6514 + /* If listing is on, and we are expanding a macro, then give
6515 + the listing code the contents of the expanded line. */
6518 + if ((listing & LISTING_MACEXP) && macro_nest > 0)
6523 + /* Find the end of the current expanded macro line. */
6524 + s = find_end_of_line (input_line_pointer - 1, flag_m68k_mri);
6526 + if (s != last_eol)
6529 + /* Copy it for safe keeping. Also give an indication of
6530 + how much macro nesting is involved at this point. */
6531 + len = s - (input_line_pointer - 1);
6532 + copy = (char *) xmalloc (len + macro_nest + 2);
6533 + memset (copy, '>', macro_nest);
6534 + copy[macro_nest] = ' ';
6535 + memcpy (copy + macro_nest + 1, input_line_pointer - 1, len);
6536 + copy[macro_nest + 1 + len] = '\0';
6538 + /* Install the line with the listing facility. */
6539 + listing_newline (copy);
6543 + listing_newline (NULL);
6546 + /* C is the 1st significant character.
6547 + Input_line_pointer points after that character. */
6548 + if (is_name_beginner (c))
6550 + /* Want user-defined label or pseudo/opcode. */
6551 + HANDLE_CONDITIONAL_ASSEMBLY ();
6553 + s = --input_line_pointer;
6554 + c = get_symbol_end (); /* name's delimiter. */
6556 + /* C is character after symbol.
6557 + That character's place in the input line is now '\0'.
6558 + S points to the beginning of the symbol.
6559 + [In case of pseudo-op, s->'.'.]
6560 + Input_line_pointer->'\0' where c was. */
6561 + if (TC_START_LABEL (c, input_line_pointer))
6563 + if (flag_m68k_mri)
6565 + char *rest = input_line_pointer + 1;
6567 + /* In MRI mode, \tsym: set 0 is permitted. */
6571 + if (*rest == ' ' || *rest == '\t')
6574 + if ((strncasecmp (rest, "EQU", 3) == 0
6575 + || strncasecmp (rest, "SET", 3) == 0)
6576 + && (rest[3] == ' ' || rest[3] == '\t'))
6578 + input_line_pointer = rest + 3;
6584 + line_label = colon (s); /* User-defined label. */
6585 + /* Put ':' back for error messages' sake. */
6586 + *input_line_pointer++ = ':';
6587 +#ifdef tc_check_label
6588 + tc_check_label (line_label);
6590 + /* Input_line_pointer->after ':'. */
6591 + SKIP_WHITESPACE ();
6593 + else if ((c == '='
6594 + || ((c == ' ' || c == '\t')
6595 + && input_line_pointer[1] == '='))
6596 +#ifdef TC_EQUAL_IN_INSN
6597 + && !TC_EQUAL_IN_INSN (c, s)
6602 + demand_empty_rest_of_line ();
6606 + /* Expect pseudo-op or machine instruction. */
6609 +#ifndef TC_CASE_SENSITIVE
6613 + strncpy (original_case_string, s2, sizeof (original_case_string));
6614 + original_case_string[sizeof (original_case_string) - 1] = 0;
6618 + *s2 = TOLOWER (*s2);
6623 + if (NO_PSEUDO_DOT || flag_m68k_mri)
6625 + /* The MRI assembler and the m88k use pseudo-ops
6626 + without a period. */
6627 + pop = (pseudo_typeS *) hash_find (po_hash, s);
6628 + if (pop != NULL && pop->poc_handler == NULL)
6633 + || (!flag_m68k_mri && *s == '.'))
6637 + WARNING: c has next char, which may be end-of-line.
6638 + We lookup the pseudo-op table with s+1 because we
6639 + already know that the pseudo-op begins with a '.'. */
6642 + pop = (pseudo_typeS *) hash_find (po_hash, s + 1);
6643 + if (pop && !pop->poc_handler)
6646 + /* In MRI mode, we may need to insert an
6647 + automatic alignment directive. What a hack
6649 + if (mri_pending_align
6651 + || !((pop->poc_handler == cons
6652 + && pop->poc_val == 1)
6653 + || (pop->poc_handler == s_space
6654 + && pop->poc_val == 1)
6655 +#ifdef tc_conditional_pseudoop
6656 + || tc_conditional_pseudoop (pop)
6658 + || pop->poc_handler == s_if
6659 + || pop->poc_handler == s_ifdef
6660 + || pop->poc_handler == s_ifc
6661 + || pop->poc_handler == s_ifeqs
6662 + || pop->poc_handler == s_else
6663 + || pop->poc_handler == s_endif
6664 + || pop->poc_handler == s_globl
6665 + || pop->poc_handler == s_ignore)))
6667 + do_align (1, (char *) NULL, 0, 0);
6668 + mri_pending_align = 0;
6670 + if (line_label != NULL)
6672 + symbol_set_frag (line_label, frag_now);
6673 + S_SET_VALUE (line_label, frag_now_fix ());
6677 + /* Print the error msg now, while we still can. */
6680 + char *end = input_line_pointer;
6682 + *input_line_pointer = c;
6684 + c = *--input_line_pointer;
6685 + *input_line_pointer = '\0';
6686 + if (! macro_defined || ! try_macro (c, s))
6689 + as_bad (_("unknown pseudo-op: `%s'"), s);
6690 + *input_line_pointer++ = c;
6695 + /* Put it back for error messages etc. */
6696 + *input_line_pointer = c;
6697 + /* The following skip of whitespace is compulsory.
6698 + A well shaped space is sometimes all that separates
6699 + keyword from operands. */
6700 + if (c == ' ' || c == '\t')
6701 + input_line_pointer++;
6703 + /* Input_line is restored.
6704 + Input_line_pointer->1st non-blank char
6705 + after pseudo-operation. */
6706 + (*pop->poc_handler) (pop->poc_val);
6708 + /* If that was .end, just get out now. */
6709 + if (pop->poc_handler == s_end)
6714 + /* WARNING: c has char, which may be end-of-line. */
6715 + /* Also: input_line_pointer->`\0` where c was. */
6716 + *input_line_pointer = c;
6717 + input_line_pointer = _find_end_of_line (input_line_pointer, flag_m68k_mri, 1);
6718 + c = *input_line_pointer;
6719 + *input_line_pointer = '\0';
6721 + generate_lineno_debug ();
6723 + if (macro_defined && try_macro (c, s))
6726 + if (mri_pending_align)
6728 + do_align (1, (char *) NULL, 0, 0);
6729 + mri_pending_align = 0;
6730 + if (line_label != NULL)
6732 + symbol_set_frag (line_label, frag_now);
6733 + S_SET_VALUE (line_label, frag_now_fix ());
6737 + md_assemble (s); /* Assemble 1 instruction. */
6739 + *input_line_pointer++ = c;
6741 + /* We resume loop AFTER the end-of-line from
6742 + this instruction. */
6748 + /* Empty statement? */
6749 + if (is_end_of_line[(unsigned char) c])
6752 + if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB) && ISDIGIT (c))
6754 + /* local label ("4:") */
6755 + char *backup = input_line_pointer;
6757 + HANDLE_CONDITIONAL_ASSEMBLY ();
6761 + /* Read the whole number. */
6762 + while (ISDIGIT (*input_line_pointer))
6764 + temp = (temp * 10) + *input_line_pointer - '0';
6765 + ++input_line_pointer;
6768 + if (LOCAL_LABELS_DOLLAR
6769 + && *input_line_pointer == '$'
6770 + && *(input_line_pointer + 1) == ':')
6772 + input_line_pointer += 2;
6774 + if (dollar_label_defined (temp))
6776 + as_fatal (_("label \"%d$\" redefined"), temp);
6779 + define_dollar_label (temp);
6780 + colon (dollar_label_name (temp, 0));
6784 + if (LOCAL_LABELS_FB
6785 + && *input_line_pointer++ == ':')
6787 + fb_label_instance_inc (temp);
6788 + colon (fb_label_name (temp, 0));
6792 + input_line_pointer = backup;
6793 + } /* local label ("4:") */
6795 + if (c && strchr (line_comment_chars, c))
6796 + { /* Its a comment. Better say APP or NO_APP. */
6801 + unsigned int new_length;
6802 + char *tmp_buf = 0;
6804 + bump_line_counters ();
6805 + s = input_line_pointer;
6806 + if (strncmp (s, "APP\n", 4))
6807 + continue; /* We ignore it */
6811 + ends = strstr (s, "#NO_APP\n");
6815 + unsigned int tmp_len;
6818 + /* The end of the #APP wasn't in this buffer. We
6819 + keep reading in buffers until we find the #NO_APP
6820 + that goes with this #APP There is one. The specs
6821 + guarantee it... */
6822 + tmp_len = buffer_limit - s;
6823 + tmp_buf = xmalloc (tmp_len + 1);
6824 + memcpy (tmp_buf, s, tmp_len);
6827 + new_tmp = input_scrub_next_buffer (&buffer);
6831 + buffer_limit = new_tmp;
6832 + input_line_pointer = buffer;
6833 + ends = strstr (buffer, "#NO_APP\n");
6835 + num = ends - buffer;
6837 + num = buffer_limit - buffer;
6839 + tmp_buf = xrealloc (tmp_buf, tmp_len + num);
6840 + memcpy (tmp_buf + tmp_len, buffer, num);
6845 + input_line_pointer = ends ? ends + 8 : NULL;
6848 + ends = s + tmp_len;
6853 + input_line_pointer = ends + 8;
6857 + scrub_string_end = ends;
6859 + new_length = ends - s;
6860 + new_buf = (char *) xmalloc (new_length);
6861 + new_tmp = new_buf;
6867 + space = (new_buf + new_length) - new_tmp;
6868 + size = do_scrub_chars (scrub_from_string, new_tmp, space);
6872 + new_tmp[size] = 0;
6876 + new_buf = xrealloc (new_buf, new_length + 100);
6877 + new_tmp = new_buf + new_length;
6878 + new_length += 100;
6884 + /* We've "scrubbed" input to the preferred format. In the
6885 + process we may have consumed the whole of the remaining
6886 + file (and included files). We handle this formatted
6887 + input similar to that of macro expansion, letting
6888 + actual macro expansion (possibly nested) and other
6889 + input expansion work. Beware that in messages, line
6890 + numbers and possibly file names will be incorrect. */
6891 + sb_add_string (&sbuf, new_buf);
6892 + input_scrub_include_sb (&sbuf, input_line_pointer, 0);
6894 + buffer_limit = input_scrub_next_buffer (&input_line_pointer);
6899 + HANDLE_CONDITIONAL_ASSEMBLY ();
6901 +#ifdef tc_unrecognized_line
6902 + if (tc_unrecognized_line (c))
6905 + input_line_pointer--;
6906 + /* Report unknown char as ignored. */
6907 + demand_empty_rest_of_line ();
6910 +#ifdef md_after_pass_hook
6911 + md_after_pass_hook ();
6920 + /* Close the input file. */
6921 + input_scrub_close ();
6922 +#ifdef WARN_COMMENTS
6924 + if (warn_comment && found_comment)
6925 + as_warn_where (found_comment_file, found_comment,
6926 + "first comment found here");
6931 +/* Convert O_constant expression EXP into the equivalent O_big representation.
6932 + Take the sign of the number from X_unsigned rather than X_add_number. */
6935 +convert_to_bignum (expressionS *exp)
6940 + value = exp->X_add_number;
6941 + for (i = 0; i < sizeof (exp->X_add_number) / CHARS_PER_LITTLENUM; i++)
6943 + generic_bignum[i] = value & LITTLENUM_MASK;
6944 + value >>= LITTLENUM_NUMBER_OF_BITS;
6946 + /* Add a sequence of sign bits if the top bit of X_add_number is not
6947 + the sign of the original value. */
6948 + if ((exp->X_add_number < 0) != !exp->X_unsigned)
6949 + generic_bignum[i++] = exp->X_unsigned ? 0 : LITTLENUM_MASK;
6950 + exp->X_op = O_big;
6951 + exp->X_add_number = i;
6954 +/* For most MRI pseudo-ops, the line actually ends at the first
6955 + nonquoted space. This function looks for that point, stuffs a null
6956 + in, and sets *STOPCP to the character that used to be there, and
6957 + returns the location.
6959 + Until I hear otherwise, I am going to assume that this is only true
6960 + for the m68k MRI assembler. */
6963 +mri_comment_field (char *stopcp)
6969 + know (flag_m68k_mri);
6971 + for (s = input_line_pointer;
6972 + ((!is_end_of_line[(unsigned char) *s] && *s != ' ' && *s != '\t')
6977 + inquote = !inquote;
6980 + for (s = input_line_pointer;
6981 + !is_end_of_line[(unsigned char) *s];
6991 +/* Skip to the end of an MRI comment field. */
6994 +mri_comment_end (char *stop, int stopc)
6998 + input_line_pointer = stop;
7000 + while (!is_end_of_line[(unsigned char) *input_line_pointer])
7001 + ++input_line_pointer;
7005 +s_abort (int ignore ATTRIBUTE_UNUSED)
7007 + as_fatal (_(".abort detected. Abandoning ship."));
7010 +/* Guts of .align directive. N is the power of two to which to align.
7011 + FILL may be NULL, or it may point to the bytes of the fill pattern.
7012 + LEN is the length of whatever FILL points to, if anything. MAX is
7013 + the maximum number of characters to skip when doing the alignment,
7014 + or 0 if there is no maximum. */
7017 +do_align (int n, char *fill, int len, int max)
7019 + if (now_seg == absolute_section)
7023 + if (*fill++ != '\0')
7025 + as_warn (_("ignoring fill value in absolute section"));
7032 +#ifdef md_flush_pending_output
7033 + md_flush_pending_output ();
7036 + md_do_align (n, fill, len, max, just_record_alignment);
7039 + /* Only make a frag if we HAVE to... */
7040 + if (n != 0 && !need_pass_2)
7044 + if (subseg_text_p (now_seg))
7045 + frag_align_code (n, max);
7047 + frag_align (n, 0, max);
7049 + else if (len <= 1)
7050 + frag_align (n, *fill, max);
7052 + frag_align_pattern (n, fill, len, max);
7056 + just_record_alignment: ATTRIBUTE_UNUSED_LABEL
7059 + record_alignment (now_seg, n - OCTETS_PER_BYTE_POWER);
7062 +/* Handle the .align pseudo-op. A positive ARG is a default alignment
7063 + (in bytes). A negative ARG is the negative of the length of the
7064 + fill pattern. BYTES_P is non-zero if the alignment value should be
7065 + interpreted as the byte boundary, rather than the power of 2. */
7067 +#ifdef BFD_ASSEMBLER
7068 +#define ALIGN_LIMIT (stdoutput->arch_info->bits_per_address - 1)
7070 +#define ALIGN_LIMIT 15
7074 +s_align (int arg, int bytes_p)
7076 + unsigned int align_limit = ALIGN_LIMIT;
7077 + unsigned int align;
7078 + char *stop = NULL;
7085 + stop = mri_comment_field (&stopc);
7087 + if (is_end_of_line[(unsigned char) *input_line_pointer])
7092 + align = arg; /* Default value from pseudo-op table. */
7096 + align = get_absolute_expression ();
7097 + SKIP_WHITESPACE ();
7102 + /* Convert to a power of 2. */
7107 + for (i = 0; (align & 1) == 0; align >>= 1, ++i)
7110 + as_bad (_("alignment not a power of 2"));
7116 + if (align > align_limit)
7118 + align = align_limit;
7119 + as_warn (_("alignment too large: %u assumed"), align);
7122 + if (*input_line_pointer != ',')
7129 + ++input_line_pointer;
7130 + if (*input_line_pointer == ',')
7134 + fill = get_absolute_expression ();
7135 + SKIP_WHITESPACE ();
7139 + if (*input_line_pointer != ',')
7143 + ++input_line_pointer;
7144 + max = get_absolute_expression ();
7151 + as_warn (_("expected fill pattern missing"));
7152 + do_align (align, (char *) NULL, 0, max);
7162 + if (fill_len <= 1)
7167 + do_align (align, &fill_char, fill_len, max);
7173 + if ((size_t) fill_len > sizeof ab)
7175 + md_number_to_chars (ab, fill, fill_len);
7176 + do_align (align, ab, fill_len, max);
7180 + demand_empty_rest_of_line ();
7183 + mri_comment_end (stop, stopc);
7186 +/* Handle the .align pseudo-op on machines where ".align 4" means
7187 + align to a 4 byte boundary. */
7190 +s_align_bytes (int arg)
7195 +/* Handle the .align pseudo-op on machines where ".align 4" means align
7196 + to a 2**4 boundary. */
7199 +s_align_ptwo (int arg)
7204 +/* Switch in and out of alternate macro mode. */
7207 +s_altmacro (int on)
7209 + demand_empty_rest_of_line ();
7210 + macro_set_alternate (on);
7214 +s_comm_internal (int param,
7215 + symbolS *(*comm_parse_extra) (int, symbolS *, addressT))
7220 + offsetT temp, size;
7221 + symbolS *symbolP = NULL;
7222 + char *stop = NULL;
7227 + stop = mri_comment_field (&stopc);
7229 + name = input_line_pointer;
7230 + c = get_symbol_end ();
7231 + /* Just after name is now '\0'. */
7232 + p = input_line_pointer;
7237 + as_bad (_("expected symbol name"));
7238 + ignore_rest_of_line ();
7242 + SKIP_WHITESPACE ();
7244 + /* Accept an optional comma after the name. The comma used to be
7245 + required, but Irix 5 cc does not generate it for .lcomm. */
7246 + if (*input_line_pointer == ',')
7247 + input_line_pointer++;
7249 + temp = get_absolute_expr (&exp);
7251 +#ifdef BFD_ASSEMBLER
7252 + size &= ((offsetT) 2 << (stdoutput->arch_info->bits_per_address - 1)) - 1;
7254 + if (exp.X_op == O_absent)
7256 + as_bad (_("missing size expression"));
7257 + ignore_rest_of_line ();
7260 + else if (temp != size || !exp.X_unsigned)
7262 + as_warn (_("size (%ld) out of range, ignored"), (long) temp);
7263 + ignore_rest_of_line ();
7268 + symbolP = symbol_find_or_make (name);
7269 + if (S_IS_DEFINED (symbolP) && !S_IS_COMMON (symbolP))
7272 + as_bad (_("symbol `%s' is already defined"), name);
7274 + ignore_rest_of_line ();
7278 + size = S_GET_VALUE (symbolP);
7281 + else if (size != temp)
7282 + as_warn (_("size of \"%s\" is already %ld; not changing to %ld"),
7283 + name, (long) size, (long) temp);
7286 + if (comm_parse_extra != NULL)
7287 + symbolP = (*comm_parse_extra) (param, symbolP, size);
7290 + S_SET_VALUE (symbolP, (valueT) size);
7291 + S_SET_EXTERNAL (symbolP);
7294 + extern int flag_one;
7295 + if (size == 0 || !flag_one)
7296 + S_GET_OTHER (symbolP) = const_flag;
7301 + demand_empty_rest_of_line ();
7304 + mri_comment_end (stop, stopc);
7309 +s_comm (int ignore)
7311 + s_comm_internal (ignore, NULL);
7314 +/* The MRI COMMON pseudo-op. We handle this by creating a common
7315 + symbol with the appropriate name. We make s_space do the right
7316 + thing by increasing the size. */
7319 +s_mri_common (int small ATTRIBUTE_UNUSED)
7326 + char *stop = NULL;
7335 + stop = mri_comment_field (&stopc);
7337 + SKIP_WHITESPACE ();
7339 + name = input_line_pointer;
7340 + if (!ISDIGIT (*name))
7341 + c = get_symbol_end ();
7346 + ++input_line_pointer;
7348 + while (ISDIGIT (*input_line_pointer));
7350 + c = *input_line_pointer;
7351 + *input_line_pointer = '\0';
7353 + if (line_label != NULL)
7355 + alc = (char *) xmalloc (strlen (S_GET_NAME (line_label))
7356 + + (input_line_pointer - name)
7358 + sprintf (alc, "%s%s", name, S_GET_NAME (line_label));
7363 + sym = symbol_find_or_make (name);
7364 + *input_line_pointer = c;
7368 + if (*input_line_pointer != ',')
7372 + ++input_line_pointer;
7373 + align = get_absolute_expression ();
7376 + if (S_IS_DEFINED (sym) && !S_IS_COMMON (sym))
7378 + as_bad (_("symbol `%s' is already defined"), S_GET_NAME (sym));
7379 + ignore_rest_of_line ();
7380 + mri_comment_end (stop, stopc);
7384 + S_SET_EXTERNAL (sym);
7385 + mri_common_symbol = sym;
7389 + S_SET_ALIGN (sym, align);
7392 + if (line_label != NULL)
7395 + exp.X_op = O_symbol;
7396 + exp.X_add_symbol = sym;
7397 + exp.X_add_number = 0;
7398 + symbol_set_value_expression (line_label, &exp);
7399 + symbol_set_frag (line_label, &zero_address_frag);
7400 + S_SET_SEGMENT (line_label, expr_section);
7403 + /* FIXME: We just ignore the small argument, which distinguishes
7404 + COMMON and COMMON.S. I don't know what we can do about it. */
7406 + /* Ignore the type and hptype. */
7407 + if (*input_line_pointer == ',')
7408 + input_line_pointer += 2;
7409 + if (*input_line_pointer == ',')
7410 + input_line_pointer += 2;
7412 + demand_empty_rest_of_line ();
7414 + mri_comment_end (stop, stopc);
7418 +s_data (int ignore ATTRIBUTE_UNUSED)
7421 + register int temp;
7423 + temp = get_absolute_expression ();
7424 + if (flag_readonly_data_in_text)
7426 + section = text_section;
7430 + section = data_section;
7432 + subseg_set (section, (subsegT) temp);
7437 + demand_empty_rest_of_line ();
7440 +/* Handle the .appfile pseudo-op. This is automatically generated by
7441 + do_scrub_chars when a preprocessor # line comment is seen with a
7442 + file name. This default definition may be overridden by the object
7443 + or CPU specific pseudo-ops. This function is also the default
7444 + definition for .file; the APPFILE argument is 1 for .appfile, 0 for
7448 +s_app_file_string (char *file, int appfile ATTRIBUTE_UNUSED)
7452 + listing_source_file (file);
7454 + register_dependency (file);
7455 +#ifdef obj_app_file
7456 + obj_app_file (file, appfile);
7461 +s_app_file (int appfile)
7466 + /* Some assemblers tolerate immediately following '"'. */
7467 + if ((s = demand_copy_string (&length)) != 0)
7469 + /* If this is a fake .appfile, a fake newline was inserted into
7470 + the buffer. Passing -2 to new_logical_line tells it to
7471 + account for it. */
7473 + = (!new_logical_line (s, appfile ? -2 : -1) && appfile);
7475 + /* In MRI mode, the preprocessor may have inserted an extraneous
7478 + && *input_line_pointer == '\''
7479 + && is_end_of_line[(unsigned char) input_line_pointer[1]])
7480 + ++input_line_pointer;
7482 + demand_empty_rest_of_line ();
7484 + s_app_file_string (s, appfile);
7488 +/* Handle the .appline pseudo-op. This is automatically generated by
7489 + do_scrub_chars when a preprocessor # line comment is seen. This
7490 + default definition may be overridden by the object or CPU specific
7494 +s_app_line (int ignore ATTRIBUTE_UNUSED)
7498 + /* The given number is that of the next line. */
7499 + l = get_absolute_expression () - 1;
7501 + /* Some of the back ends can't deal with non-positive line numbers.
7502 + Besides, it's silly. */
7503 + as_warn (_("line numbers must be positive; line number %d rejected"),
7507 + new_logical_line ((char *) NULL, l);
7510 + listing_source_line (l);
7513 + demand_empty_rest_of_line ();
7516 +/* Handle the .end pseudo-op. Actually, the real work is done in
7517 + read_a_source_file. */
7520 +s_end (int ignore ATTRIBUTE_UNUSED)
7524 + /* The MRI assembler permits the start symbol to follow .end,
7525 + but we don't support that. */
7526 + SKIP_WHITESPACE ();
7527 + if (!is_end_of_line[(unsigned char) *input_line_pointer]
7528 + && *input_line_pointer != '*'
7529 + && *input_line_pointer != '!')
7530 + as_warn (_("start address not supported"));
7534 +/* Handle the .err pseudo-op. */
7537 +s_err (int ignore ATTRIBUTE_UNUSED)
7539 + as_bad (_(".err encountered"));
7540 + demand_empty_rest_of_line ();
7543 +/* Handle the .error and .warning pseudo-ops. */
7546 +s_errwarn (int err)
7549 + /* The purpose for the conditional assignment is not to
7550 + internationalize the directive itself, but that we need a
7551 + self-contained message, one that can be passed like the
7552 + demand_copy_C_string return value, and with no assumption on the
7553 + location of the name of the directive within the message. */
7555 + = (err ? _(".error directive invoked in source file")
7556 + : _(".warning directive invoked in source file"));
7558 + if (!is_it_end_of_statement ())
7560 + if (*input_line_pointer != '\"')
7562 + as_bad (_("%s argument must be a string"),
7563 + err ? ".error" : ".warning");
7564 + ignore_rest_of_line ();
7568 + msg = demand_copy_C_string (&len);
7574 + as_bad ("%s", msg);
7576 + as_warn ("%s", msg);
7577 + demand_empty_rest_of_line ();
7580 +/* Handle the MRI fail pseudo-op. */
7583 +s_fail (int ignore ATTRIBUTE_UNUSED)
7586 + char *stop = NULL;
7590 + stop = mri_comment_field (&stopc);
7592 + temp = get_absolute_expression ();
7594 + as_warn (_(".fail %ld encountered"), (long) temp);
7596 + as_bad (_(".fail %ld encountered"), (long) temp);
7598 + demand_empty_rest_of_line ();
7601 + mri_comment_end (stop, stopc);
7605 +s_fill (int ignore ATTRIBUTE_UNUSED)
7607 + expressionS rep_exp;
7609 + register long fill = 0;
7612 +#ifdef md_flush_pending_output
7613 + md_flush_pending_output ();
7616 + get_known_segmented_expression (&rep_exp);
7617 + if (*input_line_pointer == ',')
7619 + input_line_pointer++;
7620 + size = get_absolute_expression ();
7621 + if (*input_line_pointer == ',')
7623 + input_line_pointer++;
7624 + fill = get_absolute_expression ();
7628 + /* This is to be compatible with BSD 4.2 AS, not for any rational reason. */
7629 +#define BSD_FILL_SIZE_CROCK_8 (8)
7630 + if (size > BSD_FILL_SIZE_CROCK_8)
7632 + as_warn (_(".fill size clamped to %d"), BSD_FILL_SIZE_CROCK_8);
7633 + size = BSD_FILL_SIZE_CROCK_8;
7637 + as_warn (_("size negative; .fill ignored"));
7640 + else if (rep_exp.X_op == O_constant && rep_exp.X_add_number <= 0)
7642 + if (rep_exp.X_add_number < 0)
7643 + as_warn (_("repeat < 0; .fill ignored"));
7647 + if (size && !need_pass_2)
7649 + if (rep_exp.X_op == O_constant)
7651 + p = frag_var (rs_fill, (int) size, (int) size,
7652 + (relax_substateT) 0, (symbolS *) 0,
7653 + (offsetT) rep_exp.X_add_number,
7658 + /* We don't have a constant repeat count, so we can't use
7659 + rs_fill. We can get the same results out of rs_space,
7660 + but its argument is in bytes, so we must multiply the
7661 + repeat count by size. */
7664 + rep_sym = make_expr_symbol (&rep_exp);
7667 + expressionS size_exp;
7668 + size_exp.X_op = O_constant;
7669 + size_exp.X_add_number = size;
7671 + rep_exp.X_op = O_multiply;
7672 + rep_exp.X_add_symbol = rep_sym;
7673 + rep_exp.X_op_symbol = make_expr_symbol (&size_exp);
7674 + rep_exp.X_add_number = 0;
7675 + rep_sym = make_expr_symbol (&rep_exp);
7678 + p = frag_var (rs_space, (int) size, (int) size,
7679 + (relax_substateT) 0, rep_sym, (offsetT) 0, (char *) 0);
7682 + memset (p, 0, (unsigned int) size);
7684 + /* The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX
7685 + flavoured AS. The following bizarre behaviour is to be
7686 + compatible with above. I guess they tried to take up to 8
7687 + bytes from a 4-byte expression and they forgot to sign
7689 +#define BSD_FILL_SIZE_CROCK_4 (4)
7690 + md_number_to_chars (p, (valueT) fill,
7691 + (size > BSD_FILL_SIZE_CROCK_4
7692 + ? BSD_FILL_SIZE_CROCK_4
7694 + /* Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes)
7695 + but emits no error message because it seems a legal thing to do.
7696 + It is a degenerate case of .fill but could be emitted by a
7699 + demand_empty_rest_of_line ();
7703 +s_globl (int ignore ATTRIBUTE_UNUSED)
7708 + char *stop = NULL;
7712 + stop = mri_comment_field (&stopc);
7716 + name = input_line_pointer;
7717 + c = get_symbol_end ();
7718 + symbolP = symbol_find_or_make (name);
7719 + S_SET_EXTERNAL (symbolP);
7721 + *input_line_pointer = c;
7722 + SKIP_WHITESPACE ();
7723 + c = *input_line_pointer;
7726 + input_line_pointer++;
7727 + SKIP_WHITESPACE ();
7728 + if (is_end_of_line[(unsigned char) *input_line_pointer])
7734 + demand_empty_rest_of_line ();
7737 + mri_comment_end (stop, stopc);
7740 +/* Handle the MRI IRP and IRPC pseudo-ops. */
7746 + unsigned int line;
7751 + as_where (&file, &line);
7754 + eol = find_end_of_line (input_line_pointer, 0);
7755 + sb_add_buffer (&s, input_line_pointer, eol - input_line_pointer);
7756 + input_line_pointer = eol;
7760 + err = expand_irp (irpc, 0, &s, &out, get_line_sb);
7762 + as_bad_where (file, line, "%s", err);
7766 + input_scrub_include_sb (&out, input_line_pointer, 1);
7768 + buffer_limit = input_scrub_next_buffer (&input_line_pointer);
7771 +/* Handle the .linkonce pseudo-op. This tells the assembler to mark
7772 + the section to only be linked once. However, this is not supported
7773 + by most object file formats. This takes an optional argument,
7774 + which is what to do about duplicates. */
7777 +s_linkonce (int ignore ATTRIBUTE_UNUSED)
7779 + enum linkonce_type type;
7781 + SKIP_WHITESPACE ();
7783 + type = LINKONCE_DISCARD;
7785 + if (!is_end_of_line[(unsigned char) *input_line_pointer])
7790 + s = input_line_pointer;
7791 + c = get_symbol_end ();
7792 + if (strcasecmp (s, "discard") == 0)
7793 + type = LINKONCE_DISCARD;
7794 + else if (strcasecmp (s, "one_only") == 0)
7795 + type = LINKONCE_ONE_ONLY;
7796 + else if (strcasecmp (s, "same_size") == 0)
7797 + type = LINKONCE_SAME_SIZE;
7798 + else if (strcasecmp (s, "same_contents") == 0)
7799 + type = LINKONCE_SAME_CONTENTS;
7801 + as_warn (_("unrecognized .linkonce type `%s'"), s);
7803 + *input_line_pointer = c;
7806 +#ifdef obj_handle_link_once
7807 + obj_handle_link_once (type);
7808 +#else /* ! defined (obj_handle_link_once) */
7809 +#ifdef BFD_ASSEMBLER
7813 + if ((bfd_applicable_section_flags (stdoutput) & SEC_LINK_ONCE) == 0)
7814 + as_warn (_(".linkonce is not supported for this object file format"));
7816 + flags = bfd_get_section_flags (stdoutput, now_seg);
7817 + flags |= SEC_LINK_ONCE;
7822 + case LINKONCE_DISCARD:
7823 + flags |= SEC_LINK_DUPLICATES_DISCARD;
7825 + case LINKONCE_ONE_ONLY:
7826 + flags |= SEC_LINK_DUPLICATES_ONE_ONLY;
7828 + case LINKONCE_SAME_SIZE:
7829 + flags |= SEC_LINK_DUPLICATES_SAME_SIZE;
7831 + case LINKONCE_SAME_CONTENTS:
7832 + flags |= SEC_LINK_DUPLICATES_SAME_CONTENTS;
7835 + if (!bfd_set_section_flags (stdoutput, now_seg, flags))
7836 + as_bad (_("bfd_set_section_flags: %s"),
7837 + bfd_errmsg (bfd_get_error ()));
7839 +#else /* ! defined (BFD_ASSEMBLER) */
7840 + as_warn (_(".linkonce is not supported for this object file format"));
7841 +#endif /* ! defined (BFD_ASSEMBLER) */
7842 +#endif /* ! defined (obj_handle_link_once) */
7844 + demand_empty_rest_of_line ();
7848 +bss_alloc (symbolS *symbolP, addressT size, int align)
7851 + segT current_seg = now_seg;
7852 + subsegT current_subseg = now_subseg;
7853 + segT bss_seg = bss_section;
7855 +#if defined (TC_MIPS) || defined (TC_ALPHA)
7856 + if (OUTPUT_FLAVOR == bfd_target_ecoff_flavour
7857 + || OUTPUT_FLAVOR == bfd_target_elf_flavour)
7859 + /* For MIPS and Alpha ECOFF or ELF, small objects are put in .sbss. */
7860 + if (size <= bfd_get_gp_size (stdoutput))
7862 + bss_seg = subseg_new (".sbss", 1);
7863 + seg_info (bss_seg)->bss = 1;
7864 +#ifdef BFD_ASSEMBLER
7865 + if (!bfd_set_section_flags (stdoutput, bss_seg, SEC_ALLOC))
7866 + as_warn (_("error setting flags for \".sbss\": %s"),
7867 + bfd_errmsg (bfd_get_error ()));
7872 + subseg_set (bss_seg, 1);
7876 + record_alignment (bss_seg, align);
7877 + frag_align (align, 0, 0);
7880 + /* Detach from old frag. */
7881 + if (S_GET_SEGMENT (symbolP) == bss_seg)
7882 + symbol_get_frag (symbolP)->fr_symbol = NULL;
7884 + symbol_set_frag (symbolP, frag_now);
7885 + pfrag = frag_var (rs_org, 1, 1, 0, symbolP, size, NULL);
7889 + S_SET_SIZE (symbolP, size);
7891 + S_SET_SEGMENT (symbolP, bss_seg);
7894 + /* The symbol may already have been created with a preceding
7895 + ".globl" directive -- be careful not to step on storage class
7896 + in that case. Otherwise, set it to static. */
7897 + if (S_GET_STORAGE_CLASS (symbolP) != C_EXT)
7898 + S_SET_STORAGE_CLASS (symbolP, C_STAT);
7899 +#endif /* OBJ_COFF */
7901 + subseg_set (current_seg, current_subseg);
7905 +parse_align (int align_bytes)
7910 + SKIP_WHITESPACE ();
7911 + if (*input_line_pointer != ',')
7914 + as_bad (_("expected alignment after size"));
7915 + ignore_rest_of_line ();
7919 + input_line_pointer++;
7920 + SKIP_WHITESPACE ();
7922 + align = get_absolute_expr (&exp);
7923 + if (exp.X_op == O_absent)
7926 + if (!exp.X_unsigned)
7928 + as_warn (_("alignment negative; 0 assumed"));
7932 + if (align_bytes && align != 0)
7934 + /* convert to a power of 2 alignment */
7935 + unsigned int alignp2 = 0;
7936 + while ((align & 1) == 0)
7937 + align >>= 1, ++alignp2;
7940 + as_bad (_("alignment not a power of 2"));
7941 + ignore_rest_of_line ();
7949 +/* Called from s_comm_internal after symbol name and size have been
7950 + parsed. NEEDS_ALIGN is 0 if it was an ".lcomm" (2 args only),
7951 + 1 if this was a ".bss" directive which has a 3rd argument
7952 + (alignment as a power of 2), or 2 if this was a ".bss" directive
7953 + with alignment in bytes. */
7956 +s_lcomm_internal (int needs_align, symbolS *symbolP, addressT size)
7958 + addressT align = 0;
7962 + align = parse_align (needs_align - 1);
7963 + if (align == (addressT) -1)
7967 + /* Assume some objects may require alignment on some systems. */
7968 + TC_IMPLICIT_LCOMM_ALIGNMENT (size, align);
7970 + bss_alloc (symbolP, size, align);
7975 +s_lcomm (int needs_align)
7977 + s_comm_internal (needs_align, s_lcomm_internal);
7981 +s_lcomm_bytes (int needs_align)
7983 + s_comm_internal (needs_align * 2, s_lcomm_internal);
7987 +s_lsym (int ignore ATTRIBUTE_UNUSED)
7989 + register char *name;
7993 + register symbolS *symbolP;
7995 + /* We permit ANY defined expression: BSD4.2 demands constants. */
7996 + name = input_line_pointer;
7997 + c = get_symbol_end ();
7998 + p = input_line_pointer;
8003 + as_bad (_("expected symbol name"));
8004 + ignore_rest_of_line ();
8008 + SKIP_WHITESPACE ();
8010 + if (*input_line_pointer != ',')
8013 + as_bad (_("expected comma after \"%s\""), name);
8015 + ignore_rest_of_line ();
8019 + input_line_pointer++;
8020 + expression (&exp);
8022 + if (exp.X_op != O_constant
8023 + && exp.X_op != O_register)
8025 + as_bad (_("bad expression"));
8026 + ignore_rest_of_line ();
8031 + symbolP = symbol_find_or_make (name);
8033 + /* FIXME-SOON I pulled a (&& symbolP->sy_other == 0 &&
8034 + symbolP->sy_desc == 0) out of this test because coff doesn't have
8035 + those fields, and I can't see when they'd ever be tripped. I
8036 + don't think I understand why they were here so I may have
8037 + introduced a bug. As recently as 1.37 didn't have this test
8038 + anyway. xoxorich. */
8040 + if (S_GET_SEGMENT (symbolP) == undefined_section
8041 + && S_GET_VALUE (symbolP) == 0)
8043 + /* The name might be an undefined .global symbol; be sure to
8044 + keep the "external" bit. */
8045 + S_SET_SEGMENT (symbolP,
8046 + (exp.X_op == O_constant
8047 + ? absolute_section
8049 + S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
8053 + as_bad (_("symbol `%s' is already defined"), name);
8057 + demand_empty_rest_of_line ();
8060 +/* Read a line into an sb. Returns the character that ended the line
8061 + or zero if there are no more lines. */
8064 +get_line_sb (sb *line)
8068 + if (input_line_pointer[-1] == '\n')
8069 + bump_line_counters ();
8071 + if (input_line_pointer >= buffer_limit)
8073 + buffer_limit = input_scrub_next_buffer (&input_line_pointer);
8074 + if (buffer_limit == 0)
8078 + eol = find_end_of_line (input_line_pointer, flag_m68k_mri);
8079 + sb_add_buffer (line, input_line_pointer, eol - input_line_pointer);
8080 + input_line_pointer = eol;
8082 + /* Don't skip multiple end-of-line characters, because that breaks support
8083 + for the IA-64 stop bit (;;) which looks like two consecutive end-of-line
8084 + characters but isn't. Instead just skip one end of line character and
8085 + return the character skipped so that the caller can re-insert it if
8087 + return *input_line_pointer++;
8090 +/* Define a macro. This is an interface to macro.c. */
8093 +s_macro (int ignore ATTRIBUTE_UNUSED)
8096 + unsigned int line;
8101 + as_where (&file, &line);
8104 + eol = find_end_of_line (input_line_pointer, 0);
8105 + sb_add_buffer (&s, input_line_pointer, eol - input_line_pointer);
8106 + input_line_pointer = eol;
8108 + if (line_label != NULL)
8113 + sb_add_string (&label, S_GET_NAME (line_label));
8114 + err = define_macro (0, &s, &label, get_line_sb, file, line, &name);
8118 + err = define_macro (0, &s, NULL, get_line_sb, file, line, &name);
8120 + as_bad_where (file, line, err, name);
8123 + if (line_label != NULL)
8125 + S_SET_SEGMENT (line_label, absolute_section);
8126 + S_SET_VALUE (line_label, 0);
8127 + symbol_set_frag (line_label, &zero_address_frag);
8130 + if (((NO_PSEUDO_DOT || flag_m68k_mri)
8131 + && hash_find (po_hash, name) != NULL)
8132 + || (!flag_m68k_mri
8134 + && hash_find (po_hash, name + 1) != NULL))
8135 + as_warn_where (file,
8137 + _("attempt to redefine pseudo-op `%s' ignored"),
8144 +/* Handle the .mexit pseudo-op, which immediately exits a macro
8148 +s_mexit (int ignore ATTRIBUTE_UNUSED)
8150 + cond_exit_macro (macro_nest);
8151 + buffer_limit = input_scrub_next_buffer (&input_line_pointer);
8154 +/* Switch in and out of MRI mode. */
8157 +s_mri (int ignore ATTRIBUTE_UNUSED)
8161 + on = get_absolute_expression ();
8162 + old_flag = flag_mri;
8167 + flag_m68k_mri = 1;
8169 + macro_mri_mode (1);
8175 + flag_m68k_mri = 0;
8177 + macro_mri_mode (0);
8180 + /* Operator precedence changes in m68k MRI mode, so we need to
8181 + update the operator rankings. */
8182 + expr_set_precedence ();
8184 +#ifdef MRI_MODE_CHANGE
8185 + if (on != old_flag)
8186 + MRI_MODE_CHANGE (on);
8189 + demand_empty_rest_of_line ();
8192 +/* Handle changing the location counter. */
8195 +do_org (segT segment, expressionS *exp, int fill)
8197 + if (segment != now_seg && segment != absolute_section)
8198 + as_bad (_("invalid segment \"%s\""), segment_name (segment));
8200 + if (now_seg == absolute_section)
8203 + as_warn (_("ignoring fill value in absolute section"));
8204 + if (exp->X_op != O_constant)
8206 + as_bad (_("only constant offsets supported in absolute section"));
8207 + exp->X_add_number = 0;
8209 + abs_section_offset = exp->X_add_number;
8214 + symbolS *sym = exp->X_add_symbol;
8215 + offsetT off = exp->X_add_number * OCTETS_PER_BYTE;
8217 + if (exp->X_op != O_constant && exp->X_op != O_symbol)
8219 + /* Handle complex expressions. */
8220 + sym = make_expr_symbol (exp);
8224 + p = frag_var (rs_org, 1, 1, (relax_substateT) 0, sym, off, (char *) 0);
8230 +s_org (int ignore ATTRIBUTE_UNUSED)
8232 + register segT segment;
8234 + register long temp_fill;
8236 +#ifdef md_flush_pending_output
8237 + md_flush_pending_output ();
8240 + /* The m68k MRI assembler has a different meaning for .org. It
8241 + means to create an absolute section at a given address. We can't
8242 + support that--use a linker script instead. */
8243 + if (flag_m68k_mri)
8245 + as_bad (_("MRI style ORG pseudo-op not supported"));
8246 + ignore_rest_of_line ();
8250 + /* Don't believe the documentation of BSD 4.2 AS. There is no such
8251 + thing as a sub-segment-relative origin. Any absolute origin is
8252 + given a warning, then assumed to be segment-relative. Any
8253 + segmented origin expression ("foo+42") had better be in the right
8254 + segment or the .org is ignored.
8256 + BSD 4.2 AS warns if you try to .org backwards. We cannot because
8257 + we never know sub-segment sizes when we are reading code. BSD
8258 + will crash trying to emit negative numbers of filler bytes in
8259 + certain .orgs. We don't crash, but see as-write for that code.
8261 + Don't make frag if need_pass_2==1. */
8262 + segment = get_known_segmented_expression (&exp);
8263 + if (*input_line_pointer == ',')
8265 + input_line_pointer++;
8266 + temp_fill = get_absolute_expression ();
8272 + do_org (segment, &exp, temp_fill);
8274 + demand_empty_rest_of_line ();
8277 +/* Handle parsing for the MRI SECT/SECTION pseudo-op. This should be
8278 + called by the obj-format routine which handles section changing
8279 + when in MRI mode. It will create a new section, and return it. It
8280 + will set *TYPE to the section type: one of 'C' (code), 'D' (data),
8281 + 'M' (mixed), or 'R' (romable). If BFD_ASSEMBLER is defined, the
8282 + flags will be set in the section. */
8285 +s_mri_sect (char *type ATTRIBUTE_UNUSED)
8293 + SKIP_WHITESPACE ();
8295 + name = input_line_pointer;
8296 + if (!ISDIGIT (*name))
8297 + c = get_symbol_end ();
8302 + ++input_line_pointer;
8304 + while (ISDIGIT (*input_line_pointer));
8306 + c = *input_line_pointer;
8307 + *input_line_pointer = '\0';
8310 + name = xstrdup (name);
8312 + *input_line_pointer = c;
8314 + seg = subseg_new (name, 0);
8316 + if (*input_line_pointer == ',')
8320 + ++input_line_pointer;
8321 + align = get_absolute_expression ();
8322 + record_alignment (seg, align);
8326 + if (*input_line_pointer == ',')
8328 + c = *++input_line_pointer;
8330 + if (c == 'C' || c == 'D' || c == 'M' || c == 'R')
8333 + as_bad (_("unrecognized section type"));
8334 + ++input_line_pointer;
8336 +#ifdef BFD_ASSEMBLER
8340 + flags = SEC_NO_FLAGS;
8342 + flags = SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE;
8343 + else if (*type == 'D' || *type == 'M')
8344 + flags = SEC_ALLOC | SEC_LOAD | SEC_DATA;
8345 + else if (*type == 'R')
8346 + flags = SEC_ALLOC | SEC_LOAD | SEC_DATA | SEC_READONLY | SEC_ROM;
8347 + if (flags != SEC_NO_FLAGS)
8349 + if (!bfd_set_section_flags (stdoutput, seg, flags))
8350 + as_warn (_("error setting flags for \"%s\": %s"),
8351 + bfd_section_name (stdoutput, seg),
8352 + bfd_errmsg (bfd_get_error ()));
8358 + /* Ignore the HP type. */
8359 + if (*input_line_pointer == ',')
8360 + input_line_pointer += 2;
8362 + demand_empty_rest_of_line ();
8364 +#else /* ! TC_M68K */
8371 + SKIP_WHITESPACE ();
8373 + name = input_line_pointer;
8374 + c = get_symbol_end ();
8376 + name = xstrdup (name);
8378 + *input_line_pointer = c;
8380 + seg = subseg_new (name, 0);
8382 + if (*input_line_pointer != ',')
8388 + ++input_line_pointer;
8389 + SKIP_WHITESPACE ();
8390 + sectype = input_line_pointer;
8391 + c = get_symbol_end ();
8392 + if (*sectype == '\0')
8394 + else if (strcasecmp (sectype, "text") == 0)
8396 + else if (strcasecmp (sectype, "data") == 0)
8398 + else if (strcasecmp (sectype, "romdata") == 0)
8401 + as_warn (_("unrecognized section type `%s'"), sectype);
8402 + *input_line_pointer = c;
8405 + if (*input_line_pointer == ',')
8409 + ++input_line_pointer;
8410 + SKIP_WHITESPACE ();
8411 + seccmd = input_line_pointer;
8412 + c = get_symbol_end ();
8413 + if (strcasecmp (seccmd, "absolute") == 0)
8415 + as_bad (_("absolute sections are not supported"));
8416 + *input_line_pointer = c;
8417 + ignore_rest_of_line ();
8420 + else if (strcasecmp (seccmd, "align") == 0)
8424 + *input_line_pointer = c;
8425 + align = get_absolute_expression ();
8426 + record_alignment (seg, align);
8430 + as_warn (_("unrecognized section command `%s'"), seccmd);
8431 + *input_line_pointer = c;
8435 + demand_empty_rest_of_line ();
8437 +#else /* ! TC_I960 */
8438 + /* The MRI assembler seems to use different forms of .sect for
8439 + different targets. */
8440 + as_bad ("MRI mode not supported for this target");
8441 + ignore_rest_of_line ();
8442 +#endif /* ! TC_I960 */
8443 +#endif /* ! TC_M68K */
8446 +/* Handle the .print pseudo-op. */
8449 +s_print (int ignore ATTRIBUTE_UNUSED)
8454 + s = demand_copy_C_string (&len);
8456 + printf ("%s\n", s);
8457 + demand_empty_rest_of_line ();
8460 +/* Handle the .purgem pseudo-op. */
8463 +s_purgem (int ignore ATTRIBUTE_UNUSED)
8465 + if (is_it_end_of_statement ())
8467 + demand_empty_rest_of_line ();
8476 + SKIP_WHITESPACE ();
8477 + name = input_line_pointer;
8478 + c = get_symbol_end ();
8479 + delete_macro (name);
8480 + *input_line_pointer = c;
8481 + SKIP_WHITESPACE ();
8483 + while (*input_line_pointer++ == ',');
8485 + --input_line_pointer;
8486 + demand_empty_rest_of_line ();
8489 +/* Handle the .endm/.endr pseudo-ops. */
8492 +s_bad_end (int endr)
8494 + as_warn (_(".end%c encountered without preceeding %s"),
8496 + endr ? ".rept, .irp, or .irpc" : ".macro");
8497 + demand_empty_rest_of_line ();
8500 +/* Handle the .rept pseudo-op. */
8503 +s_rept (int ignore ATTRIBUTE_UNUSED)
8507 + count = get_absolute_expression ();
8509 + do_repeat (count, "REPT", "ENDR");
8512 +/* This function provides a generic repeat block implementation. It allows
8513 + different directives to be used as the start/end keys. */
8516 +do_repeat (int count, const char *start, const char *end)
8522 + if (!buffer_and_nest (start, end, &one, get_line_sb))
8524 + as_bad (_("%s without %s"), start, end);
8529 + while (count-- > 0)
8530 + sb_add_sb (&many, &one);
8534 + input_scrub_include_sb (&many, input_line_pointer, 1);
8536 + buffer_limit = input_scrub_next_buffer (&input_line_pointer);
8539 +/* Skip to end of current repeat loop; EXTRA indicates how many additional
8540 + input buffers to skip. Assumes that conditionals preceding the loop end
8541 + are properly nested.
8543 + This function makes it easier to implement a premature "break" out of the
8544 + loop. The EXTRA arg accounts for other buffers we might have inserted,
8545 + such as line substitutions. */
8548 +end_repeat (int extra)
8550 + cond_exit_macro (macro_nest);
8551 + while (extra-- >= 0)
8552 + buffer_limit = input_scrub_next_buffer (&input_line_pointer);
8556 +assign_symbol (char *name, int no_reassign)
8560 + if (name[0] == '.' && name[1] == '\0')
8562 + /* Turn '. = mumble' into a .org mumble. */
8566 + segment = get_known_segmented_expression (&exp);
8569 + do_org (segment, &exp, 0);
8574 + if ((symbolP = symbol_find (name)) == NULL
8575 + && (symbolP = md_undefined_symbol (name)) == NULL)
8577 + symbolP = symbol_find_or_make (name);
8579 + /* When doing symbol listings, play games with dummy fragments living
8580 + outside the normal fragment chain to record the file and line info
8581 + for this symbol. */
8582 + if (listing & LISTING_SYMBOLS)
8584 + extern struct list_info_struct *listing_tail;
8585 + fragS *dummy_frag = (fragS *) xcalloc (1, sizeof (fragS));
8586 + dummy_frag->line = listing_tail;
8587 + dummy_frag->fr_symbol = symbolP;
8588 + symbol_set_frag (symbolP, dummy_frag);
8592 + /* "set" symbols are local unless otherwise specified. */
8593 + SF_SET_LOCAL (symbolP);
8597 + /* Permit register names to be redefined. */
8599 + && S_IS_DEFINED (symbolP)
8600 + && S_GET_SEGMENT (symbolP) != reg_section)
8601 + as_bad (_("symbol `%s' is already defined"), name);
8603 + pseudo_set (symbolP);
8606 +/* Handle the .equ, .equiv and .set directives. If EQUIV is 1, then
8607 + this is .equiv, and it is an error if the symbol is already
8617 + /* Especial apologies for the random logic:
8618 + this just grew, and could be parsed much more simply!
8620 + name = input_line_pointer;
8621 + delim = get_symbol_end ();
8622 + end_name = input_line_pointer;
8623 + *end_name = delim;
8625 + if (name == end_name)
8627 + as_bad (_("expected symbol name"));
8628 + ignore_rest_of_line ();
8632 + SKIP_WHITESPACE ();
8634 + if (*input_line_pointer != ',')
8637 + as_bad (_("expected comma after \"%s\""), name);
8638 + *end_name = delim;
8639 + ignore_rest_of_line ();
8643 + input_line_pointer++;
8646 + assign_symbol (name, equiv);
8647 + *end_name = delim;
8649 + demand_empty_rest_of_line ();
8658 + char *stop = NULL;
8662 +#ifdef md_flush_pending_output
8663 + md_flush_pending_output ();
8667 + stop = mri_comment_field (&stopc);
8669 + /* In m68k MRI mode, we need to align to a word boundary, unless
8671 + if (flag_m68k_mri && mult > 1)
8673 + if (now_seg == absolute_section)
8675 + abs_section_offset += abs_section_offset & 1;
8676 + if (line_label != NULL)
8677 + S_SET_VALUE (line_label, abs_section_offset);
8679 + else if (mri_common_symbol != NULL)
8683 + val = S_GET_VALUE (mri_common_symbol);
8684 + if ((val & 1) != 0)
8686 + S_SET_VALUE (mri_common_symbol, val + 1);
8687 + if (line_label != NULL)
8689 + expressionS *symexp;
8691 + symexp = symbol_get_value_expression (line_label);
8692 + know (symexp->X_op == O_symbol);
8693 + know (symexp->X_add_symbol == mri_common_symbol);
8694 + symexp->X_add_number += 1;
8700 + do_align (1, (char *) NULL, 0, 0);
8701 + if (line_label != NULL)
8703 + symbol_set_frag (line_label, frag_now);
8704 + S_SET_VALUE (line_label, frag_now_fix ());
8711 + expression (&exp);
8713 + SKIP_WHITESPACE ();
8714 + if (*input_line_pointer == ',')
8716 + ++input_line_pointer;
8717 + expression (&val);
8721 + val.X_op = O_constant;
8722 + val.X_add_number = 0;
8725 + if (val.X_op != O_constant
8726 + || val.X_add_number < - 0x80
8727 + || val.X_add_number > 0xff
8728 + || (mult != 0 && mult != 1 && val.X_add_number != 0))
8730 + if (exp.X_op != O_constant)
8731 + as_bad (_("unsupported variable size or fill value"));
8738 + bytes = mult * exp.X_add_number;
8739 + for (i = 0; i < exp.X_add_number; i++)
8740 + emit_expr (&val, mult);
8745 + if (exp.X_op == O_constant)
8749 + repeat = exp.X_add_number;
8756 + as_warn (_(".space repeat count is zero, ignored"));
8757 + else if (repeat < 0)
8758 + as_warn (_(".space repeat count is negative, ignored"));
8762 + /* If we are in the absolute section, just bump the offset. */
8763 + if (now_seg == absolute_section)
8765 + abs_section_offset += repeat;
8769 + /* If we are secretly in an MRI common section, then
8770 + creating space just increases the size of the common
8772 + if (mri_common_symbol != NULL)
8774 + S_SET_VALUE (mri_common_symbol,
8775 + S_GET_VALUE (mri_common_symbol) + repeat);
8780 + p = frag_var (rs_fill, 1, 1, (relax_substateT) 0, (symbolS *) 0,
8781 + (offsetT) repeat, (char *) 0);
8785 + if (now_seg == absolute_section)
8787 + as_bad (_("space allocation too complex in absolute section"));
8788 + subseg_set (text_section, 0);
8791 + if (mri_common_symbol != NULL)
8793 + as_bad (_("space allocation too complex in common section"));
8794 + mri_common_symbol = NULL;
8798 + p = frag_var (rs_space, 1, 1, (relax_substateT) 0,
8799 + make_expr_symbol (&exp), (offsetT) 0, (char *) 0);
8803 + *p = val.X_add_number;
8808 + /* In MRI mode, after an odd number of bytes, we must align to an
8809 + even word boundary, unless the next instruction is a dc.b, ds.b
8811 + if (flag_mri && (bytes & 1) != 0)
8812 + mri_pending_align = 1;
8814 + demand_empty_rest_of_line ();
8817 + mri_comment_end (stop, stopc);
8820 +/* This is like s_space, but the value is a floating point number with
8821 + the given precision. This is for the MRI dcb.s pseudo-op and
8825 +s_float_space (int float_type)
8829 + char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
8830 + char *stop = NULL;
8834 + stop = mri_comment_field (&stopc);
8836 + count = get_absolute_expression ();
8838 + SKIP_WHITESPACE ();
8839 + if (*input_line_pointer != ',')
8841 + as_bad (_("missing value"));
8842 + ignore_rest_of_line ();
8844 + mri_comment_end (stop, stopc);
8848 + ++input_line_pointer;
8850 + SKIP_WHITESPACE ();
8852 + /* Skip any 0{letter} that may be present. Don't even check if the
8853 + * letter is legal. */
8854 + if (input_line_pointer[0] == '0'
8855 + && ISALPHA (input_line_pointer[1]))
8856 + input_line_pointer += 2;
8858 + /* Accept :xxxx, where the x's are hex digits, for a floating point
8859 + with the exact digits specified. */
8860 + if (input_line_pointer[0] == ':')
8862 + flen = hex_float (float_type, temp);
8865 + ignore_rest_of_line ();
8867 + mri_comment_end (stop, stopc);
8875 + err = md_atof (float_type, temp, &flen);
8876 + know (flen <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
8880 + as_bad (_("bad floating literal: %s"), err);
8881 + ignore_rest_of_line ();
8883 + mri_comment_end (stop, stopc);
8888 + while (--count >= 0)
8892 + p = frag_more (flen);
8893 + memcpy (p, temp, (unsigned int) flen);
8896 + demand_empty_rest_of_line ();
8899 + mri_comment_end (stop, stopc);
8902 +/* Handle the .struct pseudo-op, as found in MIPS assemblers. */
8905 +s_struct (int ignore ATTRIBUTE_UNUSED)
8907 + char *stop = NULL;
8911 + stop = mri_comment_field (&stopc);
8912 + abs_section_offset = get_absolute_expression ();
8913 + subseg_set (absolute_section, 0);
8914 + demand_empty_rest_of_line ();
8916 + mri_comment_end (stop, stopc);
8920 +s_text (int ignore ATTRIBUTE_UNUSED)
8922 + register int temp;
8924 + temp = get_absolute_expression ();
8925 + subseg_set (text_section, (subsegT) temp);
8926 + demand_empty_rest_of_line ();
8928 + const_flag &= ~IN_DEFAULT_SECTION;
8933 +/* Verify that we are at the end of a line. If not, issue an error and
8937 +demand_empty_rest_of_line (void)
8939 + SKIP_WHITESPACE ();
8940 + if (is_end_of_line[(unsigned char) *input_line_pointer])
8941 + input_line_pointer++;
8944 + if (ISPRINT (*input_line_pointer))
8945 + as_bad (_("junk at end of line, first unrecognized character is `%c'"),
8946 + *input_line_pointer);
8948 + as_bad (_("junk at end of line, first unrecognized character valued 0x%x"),
8949 + *input_line_pointer);
8950 + ignore_rest_of_line ();
8953 + /* Return pointing just after end-of-line. */
8954 + know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
8957 +/* Silently advance to the end of line. Use this after already having
8958 + issued an error about something bad. */
8961 +ignore_rest_of_line (void)
8963 + while (input_line_pointer < buffer_limit
8964 + && !is_end_of_line[(unsigned char) *input_line_pointer])
8965 + input_line_pointer++;
8967 + input_line_pointer++;
8969 + /* Return pointing just after end-of-line. */
8970 + know (is_end_of_line[(unsigned char) input_line_pointer[-1]]);
8973 +/* Sets frag for given symbol to zero_address_frag, except when the
8974 + symbol frag is already set to a dummy listing frag. */
8977 +set_zero_frag (symbolS *symbolP)
8979 + if (symbol_get_frag (symbolP)->fr_type != rs_dummy)
8980 + symbol_set_frag (symbolP, &zero_address_frag);
8983 +/* In: Pointer to a symbol.
8984 + Input_line_pointer->expression.
8986 + Out: Input_line_pointer->just after any whitespace after expression.
8987 + Tried to set symbol to value of expression.
8988 + Will change symbols type, value, and frag; */
8991 +pseudo_set (symbolS *symbolP)
8995 +#if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
8997 +#endif /* OBJ_AOUT or OBJ_BOUT */
8999 + know (symbolP); /* NULL pointer is logic error. */
9001 + (void) expression (&exp);
9003 + if (exp.X_op == O_illegal)
9004 + as_bad (_("illegal expression"));
9005 + else if (exp.X_op == O_absent)
9006 + as_bad (_("missing expression"));
9007 + else if (exp.X_op == O_big)
9009 + if (exp.X_add_number > 0)
9010 + as_bad (_("bignum invalid"));
9012 + as_bad (_("floating point number invalid"));
9014 + else if (exp.X_op == O_subtract
9015 + && SEG_NORMAL (S_GET_SEGMENT (exp.X_add_symbol))
9016 + && (symbol_get_frag (exp.X_add_symbol)
9017 + == symbol_get_frag (exp.X_op_symbol)))
9019 + exp.X_op = O_constant;
9020 + exp.X_add_number = (S_GET_VALUE (exp.X_add_symbol)
9021 + - S_GET_VALUE (exp.X_op_symbol));
9024 + if (symbol_section_p (symbolP))
9026 + as_bad ("attempt to set value of section symbol");
9029 +#if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
9030 + ext = S_IS_EXTERNAL (symbolP);
9031 +#endif /* OBJ_AOUT or OBJ_BOUT */
9038 + exp.X_add_number = 0;
9039 + /* Fall through. */
9041 + S_SET_SEGMENT (symbolP, absolute_section);
9042 + S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
9043 + set_zero_frag (symbolP);
9047 + S_SET_SEGMENT (symbolP, reg_section);
9048 + S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
9049 + set_zero_frag (symbolP);
9053 + seg = S_GET_SEGMENT (exp.X_add_symbol);
9054 + /* For x=undef+const, create an expression symbol.
9055 + For x=x+const, just update x except when x is an undefined symbol
9056 + For x=defined+const, evaluate x. */
9057 + if (symbolP == exp.X_add_symbol
9058 + && (seg != undefined_section
9059 + || !symbol_constant_p (symbolP)))
9061 + *symbol_X_add_number (symbolP) += exp.X_add_number;
9064 + else if (seg != undefined_section)
9066 + symbolS *s = exp.X_add_symbol;
9068 + if (S_IS_COMMON (s))
9069 + as_bad (_("`%s' can't be equated to common symbol '%s'"),
9070 + S_GET_NAME (symbolP), S_GET_NAME (s));
9072 + S_SET_SEGMENT (symbolP, seg);
9073 + S_SET_VALUE (symbolP, exp.X_add_number + S_GET_VALUE (s));
9074 + symbol_set_frag (symbolP, symbol_get_frag (s));
9075 + copy_symbol_attributes (symbolP, s);
9081 + /* The value is some complex expression.
9082 + Set segment and frag back to that of a newly created symbol. */
9083 + S_SET_SEGMENT (symbolP, undefined_section);
9084 + symbol_set_value_expression (symbolP, &exp);
9085 + set_zero_frag (symbolP);
9089 +#if (defined (OBJ_AOUT) || defined (OBJ_BOUT)) && ! defined (BFD_ASSEMBLER)
9091 + S_SET_EXTERNAL (symbolP);
9093 + S_CLEAR_EXTERNAL (symbolP);
9094 +#endif /* OBJ_AOUT or OBJ_BOUT */
9099 + CONStruct more frag of .bytes, or .words etc.
9100 + Should need_pass_2 be 1 then emit no frag(s).
9101 + This understands EXPRESSIONS.
9105 + This has a split personality. We use expression() to read the
9106 + value. We can detect if the value won't fit in a byte or word.
9107 + But we can't detect if expression() discarded significant digits
9108 + in the case of a long. Not worth the crocks required to fix it. */
9110 +/* Select a parser for cons expressions. */
9112 +/* Some targets need to parse the expression in various fancy ways.
9113 + You can define TC_PARSE_CONS_EXPRESSION to do whatever you like
9114 + (for example, the HPPA does this). Otherwise, you can define
9115 + BITFIELD_CONS_EXPRESSIONS to permit bitfields to be specified, or
9116 + REPEAT_CONS_EXPRESSIONS to permit repeat counts. If none of these
9117 + are defined, which is the normal case, then only simple expressions
9122 +parse_mri_cons (expressionS *exp, unsigned int nbytes);
9125 +#ifndef TC_PARSE_CONS_EXPRESSION
9126 +#ifdef BITFIELD_CONS_EXPRESSIONS
9127 +#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_bitfield_cons (EXP, NBYTES)
9129 +parse_bitfield_cons (expressionS *exp, unsigned int nbytes);
9131 +#ifdef REPEAT_CONS_EXPRESSIONS
9132 +#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) parse_repeat_cons (EXP, NBYTES)
9134 +parse_repeat_cons (expressionS *exp, unsigned int nbytes);
9137 +/* If we haven't gotten one yet, just call expression. */
9138 +#ifndef TC_PARSE_CONS_EXPRESSION
9139 +#define TC_PARSE_CONS_EXPRESSION(EXP, NBYTES) expression (EXP)
9144 +do_parse_cons_expression (expressionS *exp,
9145 + int nbytes ATTRIBUTE_UNUSED)
9147 + TC_PARSE_CONS_EXPRESSION (exp, nbytes);
9151 +/* Worker to do .byte etc statements.
9152 + Clobbers input_line_pointer and checks end-of-line. */
9155 +cons_worker (register int nbytes, /* 1=.byte, 2=.word, 4=.long. */
9160 + char *stop = NULL;
9163 +#ifdef md_flush_pending_output
9164 + md_flush_pending_output ();
9168 + stop = mri_comment_field (&stopc);
9170 + if (is_it_end_of_statement ())
9172 + demand_empty_rest_of_line ();
9174 + mri_comment_end (stop, stopc);
9178 +#ifdef TC_ADDRESS_BYTES
9180 + nbytes = TC_ADDRESS_BYTES ();
9183 +#ifdef md_cons_align
9184 + md_cons_align (nbytes);
9191 + if (flag_m68k_mri)
9192 + parse_mri_cons (&exp, (unsigned int) nbytes);
9195 + TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
9199 + if (exp.X_op == O_symbol)
9200 + exp.X_op = O_symbol_rva;
9202 + as_fatal (_("rva without symbol"));
9204 + emit_expr (&exp, (unsigned int) nbytes);
9207 + while (*input_line_pointer++ == ',');
9209 + /* In MRI mode, after an odd number of bytes, we must align to an
9210 + even word boundary, unless the next instruction is a dc.b, ds.b
9212 + if (flag_mri && nbytes == 1 && (c & 1) != 0)
9213 + mri_pending_align = 1;
9215 + input_line_pointer--; /* Put terminator back into stream. */
9217 + demand_empty_rest_of_line ();
9220 + mri_comment_end (stop, stopc);
9226 + cons_worker (size, 0);
9232 + cons_worker (size, 1);
9235 +/* Put the contents of expression EXP into the object file using
9236 + NBYTES bytes. If need_pass_2 is 1, this does nothing. */
9239 +emit_expr (expressionS *exp, unsigned int nbytes)
9243 + valueT extra_digit = 0;
9245 + /* Don't do anything if we are going to make another pass. */
9249 + dot_value = frag_now_fix ();
9253 + /* When gcc emits DWARF 1 debugging pseudo-ops, a line number will
9254 + appear as a four byte positive constant in the .line section,
9255 + followed by a 2 byte 0xffff. Look for that case here. */
9257 + static int dwarf_line = -1;
9259 + if (strcmp (segment_name (now_seg), ".line") != 0)
9261 + else if (dwarf_line >= 0
9263 + && exp->X_op == O_constant
9264 + && (exp->X_add_number == -1 || exp->X_add_number == 0xffff))
9265 + listing_source_line ((unsigned int) dwarf_line);
9266 + else if (nbytes == 4
9267 + && exp->X_op == O_constant
9268 + && exp->X_add_number >= 0)
9269 + dwarf_line = exp->X_add_number;
9274 + /* When gcc emits DWARF 1 debugging pseudo-ops, a file name will
9275 + appear as a 2 byte TAG_compile_unit (0x11) followed by a 2 byte
9276 + AT_sibling (0x12) followed by a four byte address of the sibling
9277 + followed by a 2 byte AT_name (0x38) followed by the name of the
9278 + file. We look for that case here. */
9280 + static int dwarf_file = 0;
9282 + if (strcmp (segment_name (now_seg), ".debug") != 0)
9284 + else if (dwarf_file == 0
9286 + && exp->X_op == O_constant
9287 + && exp->X_add_number == 0x11)
9289 + else if (dwarf_file == 1
9291 + && exp->X_op == O_constant
9292 + && exp->X_add_number == 0x12)
9294 + else if (dwarf_file == 2
9297 + else if (dwarf_file == 3
9299 + && exp->X_op == O_constant
9300 + && exp->X_add_number == 0x38)
9305 + /* The variable dwarf_file_string tells stringer that the string
9306 + may be the name of the source file. */
9307 + if (dwarf_file == 4)
9308 + dwarf_file_string = 1;
9310 + dwarf_file_string = 0;
9315 + if (check_eh_frame (exp, &nbytes))
9320 + /* Allow `.word 0' in the absolute section. */
9321 + if (now_seg == absolute_section)
9323 + if (op != O_constant || exp->X_add_number != 0)
9324 + as_bad (_("attempt to store value in absolute section"));
9325 + abs_section_offset += nbytes;
9329 + /* Handle a negative bignum. */
9330 + if (op == O_uminus
9331 + && exp->X_add_number == 0
9332 + && symbol_get_value_expression (exp->X_add_symbol)->X_op == O_big
9333 + && symbol_get_value_expression (exp->X_add_symbol)->X_add_number > 0)
9336 + unsigned long carry;
9338 + exp = symbol_get_value_expression (exp->X_add_symbol);
9340 + /* Negate the bignum: one's complement each digit and add 1. */
9342 + for (i = 0; i < exp->X_add_number; i++)
9344 + unsigned long next;
9346 + next = (((~(generic_bignum[i] & LITTLENUM_MASK))
9349 + generic_bignum[i] = next & LITTLENUM_MASK;
9350 + carry = next >> LITTLENUM_NUMBER_OF_BITS;
9353 + /* We can ignore any carry out, because it will be handled by
9354 + extra_digit if it is needed. */
9356 + extra_digit = (valueT) -1;
9360 + if (op == O_absent || op == O_illegal)
9362 + as_warn (_("zero assumed for missing expression"));
9363 + exp->X_add_number = 0;
9366 + else if (op == O_big && exp->X_add_number <= 0)
9368 + as_bad (_("floating point number invalid"));
9369 + exp->X_add_number = 0;
9372 + else if (op == O_register)
9374 + as_warn (_("register value used as expression"));
9378 + p = frag_more ((int) nbytes);
9380 +#ifndef WORKING_DOT_WORD
9381 + /* If we have the difference of two symbols in a word, save it on
9382 + the broken_words list. See the code in write.c. */
9383 + if (op == O_subtract && nbytes == 2)
9385 + struct broken_word *x;
9387 + x = (struct broken_word *) xmalloc (sizeof (struct broken_word));
9388 + x->next_broken_word = broken_words;
9391 + x->subseg = now_subseg;
9392 + x->frag = frag_now;
9393 + x->word_goes_here = p;
9395 + x->add = exp->X_add_symbol;
9396 + x->sub = exp->X_op_symbol;
9397 + x->addnum = exp->X_add_number;
9400 + new_broken_words++;
9405 + /* If we have an integer, but the number of bytes is too large to
9406 + pass to md_number_to_chars, handle it as a bignum. */
9407 + if (op == O_constant && nbytes > sizeof (valueT))
9409 + extra_digit = exp->X_unsigned ? 0 : -1;
9410 + convert_to_bignum (exp);
9414 + if (op == O_constant)
9416 + register valueT get;
9417 + register valueT use;
9418 + register valueT mask;
9420 + register valueT unmask;
9422 + /* JF << of >= number of bits in the object is undefined. In
9423 + particular SPARC (Sun 4) has problems. */
9424 + if (nbytes >= sizeof (valueT))
9427 + if (nbytes > sizeof (valueT))
9430 + hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1);
9434 + /* Don't store these bits. */
9435 + mask = ~(valueT) 0 << (BITS_PER_CHAR * nbytes);
9436 + hibit = (valueT) 1 << (nbytes * BITS_PER_CHAR - 1);
9439 + unmask = ~mask; /* Do store these bits. */
9442 + "Do this mod if you want every overflow check to assume SIGNED 2's complement data.";
9443 + mask = ~(unmask >> 1); /* Includes sign bit now. */
9446 + get = exp->X_add_number;
9447 + use = get & unmask;
9448 + if ((get & mask) != 0
9449 + && ((get & mask) != mask
9450 + || (get & hibit) == 0))
9451 + { /* Leading bits contain both 0s & 1s. */
9452 + as_warn (_("value 0x%lx truncated to 0x%lx"),
9453 + (unsigned long) get, (unsigned long) use);
9455 + /* Put bytes in right order. */
9456 + md_number_to_chars (p, use, (int) nbytes);
9458 + else if (op == O_big)
9460 + unsigned int size;
9461 + LITTLENUM_TYPE *nums;
9463 + know (nbytes % CHARS_PER_LITTLENUM == 0);
9465 + size = exp->X_add_number * CHARS_PER_LITTLENUM;
9466 + if (nbytes < size)
9468 + as_warn (_("bignum truncated to %d bytes"), nbytes);
9472 + if (target_big_endian)
9474 + while (nbytes > size)
9476 + md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
9477 + nbytes -= CHARS_PER_LITTLENUM;
9478 + p += CHARS_PER_LITTLENUM;
9481 + nums = generic_bignum + size / CHARS_PER_LITTLENUM;
9482 + while (size >= CHARS_PER_LITTLENUM)
9485 + md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
9486 + size -= CHARS_PER_LITTLENUM;
9487 + p += CHARS_PER_LITTLENUM;
9492 + nums = generic_bignum;
9493 + while (size >= CHARS_PER_LITTLENUM)
9495 + md_number_to_chars (p, (valueT) *nums, CHARS_PER_LITTLENUM);
9497 + size -= CHARS_PER_LITTLENUM;
9498 + p += CHARS_PER_LITTLENUM;
9499 + nbytes -= CHARS_PER_LITTLENUM;
9502 + while (nbytes >= CHARS_PER_LITTLENUM)
9504 + md_number_to_chars (p, extra_digit, CHARS_PER_LITTLENUM);
9505 + nbytes -= CHARS_PER_LITTLENUM;
9506 + p += CHARS_PER_LITTLENUM;
9512 + memset (p, 0, nbytes);
9514 + /* Now we need to generate a fixS to record the symbol value.
9515 + This is easy for BFD. For other targets it can be more
9516 + complex. For very complex cases (currently, the HPPA and
9517 + NS32K), you can define TC_CONS_FIX_NEW to do whatever you
9518 + want. For simpler cases, you can define TC_CONS_RELOC to be
9519 + the name of the reloc code that should be stored in the fixS.
9520 + If neither is defined, the code uses NO_RELOC if it is
9521 + defined, and otherwise uses 0. */
9523 +#ifdef BFD_ASSEMBLER
9524 +#ifdef TC_CONS_FIX_NEW
9525 + TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
9528 + bfd_reloc_code_real_type r;
9545 + as_bad (_("unsupported BFD relocation size %u"), nbytes);
9549 + fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp,
9554 +#ifdef TC_CONS_FIX_NEW
9555 + TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
9557 + /* Figure out which reloc number to use. Use TC_CONS_RELOC if
9558 + it is defined, otherwise use NO_RELOC if it is defined,
9559 + otherwise use 0. */
9560 +#ifndef TC_CONS_RELOC
9562 +#define TC_CONS_RELOC NO_RELOC
9564 +#define TC_CONS_RELOC 0
9567 + fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp, 0,
9569 +#endif /* TC_CONS_FIX_NEW */
9570 +#endif /* BFD_ASSEMBLER */
9574 +#ifdef BITFIELD_CONS_EXPRESSIONS
9576 +/* i960 assemblers, (eg, asm960), allow bitfields after ".byte" as
9577 + w:x,y:z, where w and y are bitwidths and x and y are values. They
9578 + then pack them all together. We do a little better in that we allow
9579 + them in words, longs, etc. and we'll pack them in target byte order
9582 + The rules are: pack least significant bit first, if a field doesn't
9583 + entirely fit, put it in the next unit. Overflowing the bitfield is
9584 + explicitly *not* even a warning. The bitwidth should be considered
9587 + To use this function the tc-XXX.h file should define
9588 + BITFIELD_CONS_EXPRESSIONS. */
9591 +parse_bitfield_cons (exp, nbytes)
9593 + unsigned int nbytes;
9595 + unsigned int bits_available = BITS_PER_CHAR * nbytes;
9596 + char *hold = input_line_pointer;
9598 + (void) expression (exp);
9600 + if (*input_line_pointer == ':')
9607 + unsigned long width;
9609 + if (*input_line_pointer != ':')
9611 + input_line_pointer = hold;
9613 + } /* Next piece is not a bitfield. */
9615 + /* In the general case, we can't allow
9616 + full expressions with symbol
9617 + differences and such. The relocation
9618 + entries for symbols not defined in this
9619 + assembly would require arbitrary field
9620 + widths, positions, and masks which most
9621 + of our current object formats don't
9624 + In the specific case where a symbol
9625 + *is* defined in this assembly, we
9626 + *could* build fixups and track it, but
9627 + this could lead to confusion for the
9628 + backends. I'm lazy. I'll take any
9629 + SEG_ABSOLUTE. I think that means that
9630 + you can use a previous .set or
9631 + .equ type symbol. xoxorich. */
9633 + if (exp->X_op == O_absent)
9635 + as_warn (_("using a bit field width of zero"));
9636 + exp->X_add_number = 0;
9637 + exp->X_op = O_constant;
9638 + } /* Implied zero width bitfield. */
9640 + if (exp->X_op != O_constant)
9642 + *input_line_pointer = '\0';
9643 + as_bad (_("field width \"%s\" too complex for a bitfield"), hold);
9644 + *input_line_pointer = ':';
9645 + demand_empty_rest_of_line ();
9647 + } /* Too complex. */
9649 + if ((width = exp->X_add_number) > (BITS_PER_CHAR * nbytes))
9651 + as_warn (_("field width %lu too big to fit in %d bytes: truncated to %d bits"),
9652 + width, nbytes, (BITS_PER_CHAR * nbytes));
9653 + width = BITS_PER_CHAR * nbytes;
9656 + if (width > bits_available)
9658 + /* FIXME-SOMEDAY: backing up and reparsing is wasteful. */
9659 + input_line_pointer = hold;
9660 + exp->X_add_number = value;
9662 + } /* Won't fit. */
9665 + hold = ++input_line_pointer;
9667 + (void) expression (exp);
9668 + if (exp->X_op != O_constant)
9670 + char cache = *input_line_pointer;
9672 + *input_line_pointer = '\0';
9673 + as_bad (_("field value \"%s\" too complex for a bitfield"), hold);
9674 + *input_line_pointer = cache;
9675 + demand_empty_rest_of_line ();
9677 + } /* Too complex. */
9679 + value |= ((~(-1 << width) & exp->X_add_number)
9680 + << ((BITS_PER_CHAR * nbytes) - bits_available));
9682 + if ((bits_available -= width) == 0
9683 + || is_it_end_of_statement ()
9684 + || *input_line_pointer != ',')
9687 + } /* All the bitfields we're gonna get. */
9689 + hold = ++input_line_pointer;
9690 + (void) expression (exp);
9693 + exp->X_add_number = value;
9694 + exp->X_op = O_constant;
9695 + exp->X_unsigned = 1;
9699 +#endif /* BITFIELD_CONS_EXPRESSIONS */
9701 +/* Handle an MRI style string expression. */
9705 +parse_mri_cons (exp, nbytes)
9707 + unsigned int nbytes;
9709 + if (*input_line_pointer != '\''
9710 + && (input_line_pointer[1] != '\''
9711 + || (*input_line_pointer != 'A'
9712 + && *input_line_pointer != 'E')))
9713 + TC_PARSE_CONS_EXPRESSION (exp, nbytes);
9716 + unsigned int scan;
9717 + unsigned int result = 0;
9719 + /* An MRI style string. Cut into as many bytes as will fit into
9720 + a nbyte chunk, left justify if necessary, and separate with
9721 + commas so we can try again later. */
9722 + if (*input_line_pointer == 'A')
9723 + ++input_line_pointer;
9724 + else if (*input_line_pointer == 'E')
9726 + as_bad (_("EBCDIC constants are not supported"));
9727 + ++input_line_pointer;
9730 + input_line_pointer++;
9731 + for (scan = 0; scan < nbytes; scan++)
9733 + if (*input_line_pointer == '\'')
9735 + if (input_line_pointer[1] == '\'')
9737 + input_line_pointer++;
9742 + result = (result << 8) | (*input_line_pointer++);
9745 + /* Left justify. */
9746 + while (scan < nbytes)
9752 + /* Create correct expression. */
9753 + exp->X_op = O_constant;
9754 + exp->X_add_number = result;
9756 + /* Fake it so that we can read the next char too. */
9757 + if (input_line_pointer[0] != '\'' ||
9758 + (input_line_pointer[0] == '\'' && input_line_pointer[1] == '\''))
9760 + input_line_pointer -= 2;
9761 + input_line_pointer[0] = ',';
9762 + input_line_pointer[1] = '\'';
9765 + input_line_pointer++;
9768 +#endif /* TC_M68K */
9770 +#ifdef REPEAT_CONS_EXPRESSIONS
9772 +/* Parse a repeat expression for cons. This is used by the MIPS
9773 + assembler. The format is NUMBER:COUNT; NUMBER appears in the
9774 + object file COUNT times.
9776 + To use this for a target, define REPEAT_CONS_EXPRESSIONS. */
9779 +parse_repeat_cons (exp, nbytes)
9781 + unsigned int nbytes;
9783 + expressionS count;
9788 + if (*input_line_pointer != ':')
9790 + /* No repeat count. */
9794 + ++input_line_pointer;
9795 + expression (&count);
9796 + if (count.X_op != O_constant
9797 + || count.X_add_number <= 0)
9799 + as_warn (_("unresolvable or nonpositive repeat count; using 1"));
9803 + /* The cons function is going to output this expression once. So we
9804 + output it count - 1 times. */
9805 + for (i = count.X_add_number - 1; i > 0; i--)
9806 + emit_expr (exp, nbytes);
9809 +#endif /* REPEAT_CONS_EXPRESSIONS */
9811 +/* Parse a floating point number represented as a hex constant. This
9812 + permits users to specify the exact bits they want in the floating
9816 +hex_float (int float_type, char *bytes)
9821 + switch (float_type)
9848 + as_bad (_("unknown floating type type '%c'"), float_type);
9852 + /* It would be nice if we could go through expression to parse the
9853 + hex constant, but if we get a bignum it's a pain to sort it into
9854 + the buffer correctly. */
9856 + while (hex_p (*input_line_pointer) || *input_line_pointer == '_')
9860 + /* The MRI assembler accepts arbitrary underscores strewn about
9861 + through the hex constant, so we ignore them as well. */
9862 + if (*input_line_pointer == '_')
9864 + ++input_line_pointer;
9870 + as_warn (_("floating point constant too large"));
9873 + d = hex_value (*input_line_pointer) << 4;
9874 + ++input_line_pointer;
9875 + while (*input_line_pointer == '_')
9876 + ++input_line_pointer;
9877 + if (hex_p (*input_line_pointer))
9879 + d += hex_value (*input_line_pointer);
9880 + ++input_line_pointer;
9882 + if (target_big_endian)
9885 + bytes[length - i - 1] = d;
9891 + if (target_big_endian)
9892 + memset (bytes + i, 0, length - i);
9894 + memset (bytes, 0, length - i);
9902 + CONStruct some more frag chars of .floats .ffloats etc.
9903 + Makes 0 or more new frags.
9904 + If need_pass_2 == 1, no frags are emitted.
9905 + This understands only floating literals, not expressions. Sorry.
9907 + A floating constant is defined by atof_generic(), except it is preceded
9908 + by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its
9909 + reading, I decided to be incompatible. This always tries to give you
9910 + rounded bits to the precision of the pseudo-op. Former AS did premature
9911 + truncation, restored noisy bits instead of trailing 0s AND gave you
9912 + a choice of 2 flavours of noise according to which of 2 floating-point
9913 + scanners you directed AS to use.
9915 + In: input_line_pointer->whitespace before, or '0' of flonum. */
9918 +float_cons (/* Clobbers input_line-pointer, checks end-of-line. */
9919 + register int float_type /* 'f':.ffloat ... 'F':.float ... */)
9922 + int length; /* Number of chars in an object. */
9923 + register char *err; /* Error from scanning floating literal. */
9924 + char temp[MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT];
9926 + if (is_it_end_of_statement ())
9928 + demand_empty_rest_of_line ();
9932 +#ifdef md_flush_pending_output
9933 + md_flush_pending_output ();
9938 + /* input_line_pointer->1st char of a flonum (we hope!). */
9939 + SKIP_WHITESPACE ();
9941 + /* Skip any 0{letter} that may be present. Don't even check if the
9942 + letter is legal. Someone may invent a "z" format and this routine
9943 + has no use for such information. Lusers beware: you get
9944 + diagnostics if your input is ill-conditioned. */
9945 + if (input_line_pointer[0] == '0'
9946 + && ISALPHA (input_line_pointer[1]))
9947 + input_line_pointer += 2;
9949 + /* Accept :xxxx, where the x's are hex digits, for a floating
9950 + point with the exact digits specified. */
9951 + if (input_line_pointer[0] == ':')
9953 + ++input_line_pointer;
9954 + length = hex_float (float_type, temp);
9957 + ignore_rest_of_line ();
9963 + err = md_atof (float_type, temp, &length);
9964 + know (length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
9965 + know (length > 0);
9968 + as_bad (_("bad floating literal: %s"), err);
9969 + ignore_rest_of_line ();
9980 +#ifdef REPEAT_CONS_EXPRESSIONS
9981 + if (*input_line_pointer == ':')
9983 + expressionS count_exp;
9985 + ++input_line_pointer;
9986 + expression (&count_exp);
9988 + if (count_exp.X_op != O_constant
9989 + || count_exp.X_add_number <= 0)
9990 + as_warn (_("unresolvable or nonpositive repeat count; using 1"));
9992 + count = count_exp.X_add_number;
9996 + while (--count >= 0)
9998 + p = frag_more (length);
9999 + memcpy (p, temp, (unsigned int) length);
10002 + SKIP_WHITESPACE ();
10004 + while (*input_line_pointer++ == ',');
10006 + /* Put terminator back into stream. */
10007 + --input_line_pointer;
10008 + demand_empty_rest_of_line ();
10011 +/* Return the size of a LEB128 value. */
10014 +sizeof_sleb128 (offsetT value)
10016 + register int size = 0;
10017 + register unsigned byte;
10021 + byte = (value & 0x7f);
10022 + /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
10023 + Fortunately, we can structure things so that the extra work reduces
10024 + to a noop on systems that do things "properly". */
10025 + value = (value >> 7) | ~(-(offsetT)1 >> 7);
10028 + while (!(((value == 0) && ((byte & 0x40) == 0))
10029 + || ((value == -1) && ((byte & 0x40) != 0))));
10035 +sizeof_uleb128 (valueT value)
10037 + register int size = 0;
10038 + register unsigned byte;
10042 + byte = (value & 0x7f);
10046 + while (value != 0);
10052 +sizeof_leb128 (valueT value, int sign)
10055 + return sizeof_sleb128 ((offsetT) value);
10057 + return sizeof_uleb128 (value);
10060 +/* Output a LEB128 value. */
10063 +output_sleb128 (char *p, offsetT value)
10065 + register char *orig = p;
10066 + register int more;
10070 + unsigned byte = (value & 0x7f);
10072 + /* Sadly, we cannot rely on typical arithmetic right shift behaviour.
10073 + Fortunately, we can structure things so that the extra work reduces
10074 + to a noop on systems that do things "properly". */
10075 + value = (value >> 7) | ~(-(offsetT)1 >> 7);
10077 + more = !((((value == 0) && ((byte & 0x40) == 0))
10078 + || ((value == -1) && ((byte & 0x40) != 0))));
10090 +output_uleb128 (char *p, valueT value)
10096 + unsigned byte = (value & 0x7f);
10099 + /* More bytes to follow. */
10104 + while (value != 0);
10110 +output_leb128 (char *p, valueT value, int sign)
10113 + return output_sleb128 (p, (offsetT) value);
10115 + return output_uleb128 (p, value);
10118 +/* Do the same for bignums. We combine sizeof with output here in that
10119 + we don't output for NULL values of P. It isn't really as critical as
10120 + for "normal" values that this be streamlined. */
10123 +output_big_sleb128 (char *p, LITTLENUM_TYPE *bignum, int size)
10130 + /* Strip leading sign extensions off the bignum. */
10132 + && bignum[size - 1] == LITTLENUM_MASK
10133 + && bignum[size - 2] > LITTLENUM_MASK / 2)
10138 + /* OR in the next part of the littlenum. */
10139 + val |= (*bignum << loaded);
10140 + loaded += LITTLENUM_NUMBER_OF_BITS;
10144 + /* Add bytes until there are less than 7 bits left in VAL
10145 + or until every non-sign bit has been written. */
10148 + byte = val & 0x7f;
10152 + || val != ((byte & 0x40) == 0 ? 0 : ((valueT) 1 << loaded) - 1))
10159 + while ((byte & 0x80) != 0 && loaded >= 7);
10161 + while (size > 0);
10163 + /* Mop up any left-over bits (of which there will be less than 7). */
10164 + if ((byte & 0x80) != 0)
10166 + /* Sign-extend VAL. */
10167 + if (val & (1 << (loaded - 1)))
10168 + val |= ~0 << loaded;
10178 +output_big_uleb128 (char *p, LITTLENUM_TYPE *bignum, int size)
10185 + /* Strip leading zeros off the bignum. */
10186 + /* XXX: Is this needed? */
10187 + while (size > 0 && bignum[size - 1] == 0)
10192 + if (loaded < 7 && size > 0)
10194 + val |= (*bignum << loaded);
10195 + loaded += 8 * CHARS_PER_LITTLENUM;
10200 + byte = val & 0x7f;
10204 + if (size > 0 || val)
10211 + while (byte & 0x80);
10217 +output_big_leb128 (char *p, LITTLENUM_TYPE *bignum, int size, int sign)
10220 + return output_big_sleb128 (p, bignum, size);
10222 + return output_big_uleb128 (p, bignum, size);
10225 +/* Generate the appropriate fragments for a given expression to emit a
10229 +emit_leb128_expr (expressionS *exp, int sign)
10231 + operatorT op = exp->X_op;
10232 + unsigned int nbytes;
10234 + if (op == O_absent || op == O_illegal)
10236 + as_warn (_("zero assumed for missing expression"));
10237 + exp->X_add_number = 0;
10240 + else if (op == O_big && exp->X_add_number <= 0)
10242 + as_bad (_("floating point number invalid"));
10243 + exp->X_add_number = 0;
10246 + else if (op == O_register)
10248 + as_warn (_("register value used as expression"));
10251 + else if (op == O_constant
10253 + && (exp->X_add_number < 0) != !exp->X_unsigned)
10255 + /* We're outputting a signed leb128 and the sign of X_add_number
10256 + doesn't reflect the sign of the original value. Convert EXP
10257 + to a correctly-extended bignum instead. */
10258 + convert_to_bignum (exp);
10262 + /* Let check_eh_frame know that data is being emitted. nbytes == -1 is
10263 + a signal that this is leb128 data. It shouldn't optimize this away. */
10264 + nbytes = (unsigned int) -1;
10265 + if (check_eh_frame (exp, &nbytes))
10268 + /* Let the backend know that subsequent data may be byte aligned. */
10269 +#ifdef md_cons_align
10270 + md_cons_align (1);
10273 + if (op == O_constant)
10275 + /* If we've got a constant, emit the thing directly right now. */
10277 + valueT value = exp->X_add_number;
10281 + size = sizeof_leb128 (value, sign);
10282 + p = frag_more (size);
10283 + output_leb128 (p, value, sign);
10285 + else if (op == O_big)
10287 + /* O_big is a different sort of constant. */
10292 + size = output_big_leb128 (NULL, generic_bignum, exp->X_add_number, sign);
10293 + p = frag_more (size);
10294 + output_big_leb128 (p, generic_bignum, exp->X_add_number, sign);
10298 + /* Otherwise, we have to create a variable sized fragment and
10299 + resolve things later. */
10301 + frag_var (rs_leb128, sizeof_uleb128 (~(valueT) 0), 0, sign,
10302 + make_expr_symbol (exp), 0, (char *) NULL);
10306 +/* Parse the .sleb128 and .uleb128 pseudos. */
10309 +s_leb128 (int sign)
10313 +#ifdef md_flush_pending_output
10314 + md_flush_pending_output ();
10319 + expression (&exp);
10320 + emit_leb128_expr (&exp, sign);
10322 + while (*input_line_pointer++ == ',');
10324 + input_line_pointer--;
10325 + demand_empty_rest_of_line ();
10328 +/* We read 0 or more ',' separated, double-quoted strings.
10329 + Caller should have checked need_pass_2 is FALSE because we don't
10333 +stringer (/* Worker to do .ascii etc statements. */
10334 + /* Checks end-of-line. */
10335 + register int append_zero /* 0: don't append '\0', else 1. */)
10337 + register unsigned int c;
10340 +#ifdef md_flush_pending_output
10341 + md_flush_pending_output ();
10344 + /* The following awkward logic is to parse ZERO or more strings,
10345 + comma separated. Recall a string expression includes spaces
10346 + before the opening '\"' and spaces after the closing '\"'.
10347 + We fake a leading ',' if there is (supposed to be)
10348 + a 1st, expression. We keep demanding expressions for each ','. */
10349 + if (is_it_end_of_statement ())
10351 + c = 0; /* Skip loop. */
10352 + ++input_line_pointer; /* Compensate for end of loop. */
10356 + c = ','; /* Do loop. */
10358 + /* If we have been switched into the abs_section then we
10359 + will not have an obstack onto which we can hang strings. */
10360 + if (now_seg == absolute_section)
10362 + as_bad (_("strings must be placed into a section"));
10364 + ignore_rest_of_line ();
10367 + while (c == ',' || c == '<' || c == '"')
10369 + SKIP_WHITESPACE ();
10370 + switch (*input_line_pointer)
10373 + ++input_line_pointer; /*->1st char of string. */
10374 + start = input_line_pointer;
10375 + while (is_a_char (c = next_char_of_string ()))
10377 + FRAG_APPEND_1_CHAR (c);
10381 + FRAG_APPEND_1_CHAR (0);
10383 + know (input_line_pointer[-1] == '\"');
10385 +#ifndef NO_LISTING
10387 + /* In ELF, when gcc is emitting DWARF 1 debugging output, it
10388 + will emit .string with a filename in the .debug section
10389 + after a sequence of constants. See the comment in
10390 + emit_expr for the sequence. emit_expr will set
10391 + dwarf_file_string to non-zero if this string might be a
10392 + source file name. */
10393 + if (strcmp (segment_name (now_seg), ".debug") != 0)
10394 + dwarf_file_string = 0;
10395 + else if (dwarf_file_string)
10397 + c = input_line_pointer[-1];
10398 + input_line_pointer[-1] = '\0';
10399 + listing_source_file (start);
10400 + input_line_pointer[-1] = c;
10407 + input_line_pointer++;
10408 + c = get_single_number ();
10409 + FRAG_APPEND_1_CHAR (c);
10410 + if (*input_line_pointer != '>')
10412 + as_bad (_("expected <nn>"));
10414 + input_line_pointer++;
10417 + input_line_pointer++;
10420 + SKIP_WHITESPACE ();
10421 + c = *input_line_pointer;
10424 + demand_empty_rest_of_line ();
10425 +} /* stringer() */
10427 +/* FIXME-SOMEDAY: I had trouble here on characters with the
10428 + high bits set. We'll probably also have trouble with
10429 + multibyte chars, wide chars, etc. Also be careful about
10430 + returning values bigger than 1 byte. xoxorich. */
10433 +next_char_of_string (void)
10435 + register unsigned int c;
10437 + c = *input_line_pointer++ & CHAR_MASK;
10445 + as_warn (_("unterminated string; newline inserted"));
10446 + bump_line_counters ();
10449 +#ifndef NO_STRING_ESCAPES
10451 + switch (c = *input_line_pointer++)
10479 + break; /* As itself. */
10495 + for (i = 0, number = 0;
10496 + ISDIGIT (c) && i < 3;
10497 + c = *input_line_pointer++, i++)
10499 + number = number * 8 + c - '0';
10502 + c = number & 0xff;
10504 + --input_line_pointer;
10513 + c = *input_line_pointer++;
10514 + while (ISXDIGIT (c))
10517 + number = number * 16 + c - '0';
10518 + else if (ISUPPER (c))
10519 + number = number * 16 + c - 'A' + 10;
10521 + number = number * 16 + c - 'a' + 10;
10522 + c = *input_line_pointer++;
10524 + c = number & 0xff;
10525 + --input_line_pointer;
10530 + /* To be compatible with BSD 4.2 as: give the luser a linefeed!! */
10531 + as_warn (_("unterminated string; newline inserted"));
10533 + bump_line_counters ();
10538 +#ifdef ONLY_STANDARD_ESCAPES
10539 + as_bad (_("bad escaped character in string"));
10541 +#endif /* ONLY_STANDARD_ESCAPES */
10546 +#endif /* ! defined (NO_STRING_ESCAPES) */
10555 +get_segmented_expression (register expressionS *expP)
10557 + register segT retval;
10559 + retval = expression (expP);
10560 + if (expP->X_op == O_illegal
10561 + || expP->X_op == O_absent
10562 + || expP->X_op == O_big)
10564 + as_bad (_("expected address expression"));
10565 + expP->X_op = O_constant;
10566 + expP->X_add_number = 0;
10567 + retval = absolute_section;
10573 +get_known_segmented_expression (register expressionS *expP)
10575 + register segT retval;
10577 + if ((retval = get_segmented_expression (expP)) == undefined_section)
10579 + /* There is no easy way to extract the undefined symbol from the
10581 + if (expP->X_add_symbol != NULL
10582 + && S_GET_SEGMENT (expP->X_add_symbol) != expr_section)
10583 + as_warn (_("symbol \"%s\" undefined; zero assumed"),
10584 + S_GET_NAME (expP->X_add_symbol));
10586 + as_warn (_("some symbol undefined; zero assumed"));
10587 + retval = absolute_section;
10588 + expP->X_op = O_constant;
10589 + expP->X_add_number = 0;
10591 + know (retval == absolute_section || SEG_NORMAL (retval));
10595 +char /* Return terminator. */
10596 +get_absolute_expression_and_terminator (long *val_pointer /* Return value of expression. */)
10598 + /* FIXME: val_pointer should probably be offsetT *. */
10599 + *val_pointer = (long) get_absolute_expression ();
10600 + return (*input_line_pointer++);
10603 +/* Like demand_copy_string, but return NULL if the string contains any '\0's.
10604 + Give a warning if that happens. */
10607 +demand_copy_C_string (int *len_pointer)
10609 + register char *s;
10611 + if ((s = demand_copy_string (len_pointer)) != 0)
10613 + register int len;
10615 + for (len = *len_pointer; len > 0; len--)
10621 + *len_pointer = 0;
10622 + as_bad (_("this string may not contain \'\\0\'"));
10630 +/* Demand string, but return a safe (=private) copy of the string.
10631 + Return NULL if we can't read a string here. */
10634 +demand_copy_string (int *lenP)
10636 + register unsigned int c;
10637 + register int len;
10641 + SKIP_WHITESPACE ();
10642 + if (*input_line_pointer == '\"')
10644 + input_line_pointer++; /* Skip opening quote. */
10646 + while (is_a_char (c = next_char_of_string ()))
10648 + obstack_1grow (¬es, c);
10651 + /* JF this next line is so demand_copy_C_string will return a
10652 + null terminated string. */
10653 + obstack_1grow (¬es, '\0');
10654 + retval = obstack_finish (¬es);
10658 + as_bad (_("missing string"));
10660 + ignore_rest_of_line ();
10666 +/* In: Input_line_pointer->next character.
10668 + Do: Skip input_line_pointer over all whitespace.
10670 + Out: 1 if input_line_pointer->end-of-line. */
10673 +is_it_end_of_statement (void)
10675 + SKIP_WHITESPACE ();
10676 + return (is_end_of_line[(unsigned char) *input_line_pointer]);
10680 +equals (char *sym_name, int reassign)
10682 + char *stop = NULL;
10685 + input_line_pointer++;
10686 + if (*input_line_pointer == '=')
10687 + input_line_pointer++;
10689 + while (*input_line_pointer == ' ' || *input_line_pointer == '\t')
10690 + input_line_pointer++;
10693 + stop = mri_comment_field (&stopc);
10695 + assign_symbol (sym_name, !reassign);
10699 + demand_empty_rest_of_line ();
10700 + mri_comment_end (stop, stopc);
10704 +/* .incbin -- include a file verbatim at the current location. */
10707 +s_incbin (int x ATTRIBUTE_UNUSED)
10718 +#ifdef md_flush_pending_output
10719 + md_flush_pending_output ();
10722 + SKIP_WHITESPACE ();
10723 + filename = demand_copy_string (& len);
10724 + if (filename == NULL)
10727 + SKIP_WHITESPACE ();
10729 + /* Look for optional skip and count. */
10730 + if (* input_line_pointer == ',')
10732 + ++ input_line_pointer;
10733 + skip = get_absolute_expression ();
10735 + SKIP_WHITESPACE ();
10737 + if (* input_line_pointer == ',')
10739 + ++ input_line_pointer;
10741 + count = get_absolute_expression ();
10743 + as_warn (_(".incbin count zero, ignoring `%s'"), filename);
10745 + SKIP_WHITESPACE ();
10749 + demand_empty_rest_of_line ();
10751 + /* Try opening absolute path first, then try include dirs. */
10752 + binfile = fopen (filename, FOPEN_RB);
10753 + if (binfile == NULL)
10757 + path = xmalloc ((unsigned long) len + include_dir_maxlen + 5);
10759 + for (i = 0; i < include_dir_count; i++)
10761 + sprintf (path, "%s/%s", include_dirs[i], filename);
10763 + binfile = fopen (path, FOPEN_RB);
10764 + if (binfile != NULL)
10768 + if (binfile == NULL)
10769 + as_bad (_("file not found: %s"), filename);
10772 + path = xstrdup (filename);
10778 + register_dependency (path);
10780 + /* Compute the length of the file. */
10781 + if (fseek (binfile, 0, SEEK_END) != 0)
10783 + as_bad (_("seek to end of .incbin file failed `%s'"), path);
10786 + file_len = ftell (binfile);
10788 + /* If a count was not specified use the remainder of the file. */
10790 + count = file_len - skip;
10792 + if (skip < 0 || count < 0 || file_len < 0 || skip + count > file_len)
10794 + as_bad (_("skip (%ld) or count (%ld) invalid for file size (%ld)"),
10795 + skip, count, file_len);
10799 + if (fseek (binfile, skip, SEEK_SET) != 0)
10801 + as_bad (_("could not skip to %ld in file `%s'"), skip, path);
10805 + /* Allocate frag space and store file contents in it. */
10806 + binfrag = frag_more (count);
10808 + bytes = fread (binfrag, 1, count, binfile);
10809 + if (bytes < count)
10810 + as_warn (_("truncated file `%s', %ld of %ld bytes read"),
10811 + path, bytes, count);
10814 + if (binfile != NULL)
10815 + fclose (binfile);
10820 +/* .include -- include a file at this point. */
10823 +s_include (int arg ATTRIBUTE_UNUSED)
10830 + if (!flag_m68k_mri)
10832 + filename = demand_copy_string (&i);
10833 + if (filename == NULL)
10835 + /* demand_copy_string has already printed an error and
10836 + called ignore_rest_of_line. */
10842 + SKIP_WHITESPACE ();
10844 + while (!is_end_of_line[(unsigned char) *input_line_pointer]
10845 + && *input_line_pointer != ' '
10846 + && *input_line_pointer != '\t')
10848 + obstack_1grow (¬es, *input_line_pointer);
10849 + ++input_line_pointer;
10853 + obstack_1grow (¬es, '\0');
10854 + filename = obstack_finish (¬es);
10855 + while (!is_end_of_line[(unsigned char) *input_line_pointer])
10856 + ++input_line_pointer;
10859 + demand_empty_rest_of_line ();
10860 + path = xmalloc ((unsigned long) i + include_dir_maxlen + 5 /* slop */ );
10862 + for (i = 0; i < include_dir_count; i++)
10864 + strcpy (path, include_dirs[i]);
10865 + strcat (path, "/");
10866 + strcat (path, filename);
10867 + if (0 != (try = fopen (path, FOPEN_RT)))
10877 + /* malloc Storage leak when file is found on path. FIXME-SOMEDAY. */
10878 + register_dependency (path);
10879 + input_scrub_insert_file (path);
10883 +add_include_dir (char *path)
10887 + if (include_dir_count == 0)
10889 + include_dirs = (char **) xmalloc (2 * sizeof (*include_dirs));
10890 + include_dirs[0] = "."; /* Current dir. */
10891 + include_dir_count = 2;
10895 + include_dir_count++;
10897 + (char **) realloc (include_dirs,
10898 + include_dir_count * sizeof (*include_dirs));
10901 + include_dirs[include_dir_count - 1] = path; /* New one. */
10903 + i = strlen (path);
10904 + if (i > include_dir_maxlen)
10905 + include_dir_maxlen = i;
10908 +/* Output debugging information to denote the source file. */
10911 +generate_file_debug (void)
10913 + if (debug_type == DEBUG_STABS)
10914 + stabs_generate_asm_file ();
10917 +/* Output line number debugging information for the current source line. */
10920 +generate_lineno_debug (void)
10922 + switch (debug_type)
10924 + case DEBUG_UNSPECIFIED:
10926 + case DEBUG_DWARF:
10928 + case DEBUG_STABS:
10929 + stabs_generate_asm_lineno ();
10931 + case DEBUG_ECOFF:
10932 + ecoff_generate_asm_lineno ();
10934 + case DEBUG_DWARF2:
10935 + /* ??? We could here indicate to dwarf2dbg.c that something
10936 + has changed. However, since there is additional backend
10937 + support that is required (calling dwarf2_emit_insn), we
10938 + let dwarf2dbg.c call as_where on its own. */
10943 +/* Output debugging information to mark a function entry point or end point.
10944 + END_P is zero for .func, and non-zero for .endfunc. */
10947 +s_func (int end_p)
10949 + do_s_func (end_p, NULL);
10952 +/* Subroutine of s_func so targets can choose a different default prefix.
10953 + If DEFAULT_PREFIX is NULL, use the target's "leading char". */
10956 +do_s_func (int end_p, const char *default_prefix)
10958 + /* Record the current function so that we can issue an error message for
10959 + misplaced .func,.endfunc, and also so that .endfunc needs no
10961 + static char *current_name;
10962 + static char *current_label;
10966 + if (current_name == NULL)
10968 + as_bad (_("missing .func"));
10969 + ignore_rest_of_line ();
10973 + if (debug_type == DEBUG_STABS)
10974 + stabs_generate_asm_endfunc (current_name, current_label);
10976 + current_name = current_label = NULL;
10978 + else /* ! end_p */
10980 + char *name, *label;
10981 + char delim1, delim2;
10983 + if (current_name != NULL)
10985 + as_bad (_(".endfunc missing for previous .func"));
10986 + ignore_rest_of_line ();
10990 + name = input_line_pointer;
10991 + delim1 = get_symbol_end ();
10992 + name = xstrdup (name);
10993 + *input_line_pointer = delim1;
10994 + SKIP_WHITESPACE ();
10995 + if (*input_line_pointer != ',')
10997 + if (default_prefix)
10998 + asprintf (&label, "%s%s", default_prefix, name);
11001 + char leading_char = 0;
11002 +#ifdef BFD_ASSEMBLER
11003 + leading_char = bfd_get_symbol_leading_char (stdoutput);
11005 + /* Missing entry point, use function's name with the leading
11006 + char prepended. */
11007 + if (leading_char)
11008 + asprintf (&label, "%c%s", leading_char, name);
11015 + ++input_line_pointer;
11016 + SKIP_WHITESPACE ();
11017 + label = input_line_pointer;
11018 + delim2 = get_symbol_end ();
11019 + label = xstrdup (label);
11020 + *input_line_pointer = delim2;
11023 + if (debug_type == DEBUG_STABS)
11024 + stabs_generate_asm_func (name, label);
11026 + current_name = name;
11027 + current_label = label;
11030 + demand_empty_rest_of_line ();
11034 +s_ignore (int arg ATTRIBUTE_UNUSED)
11036 + ignore_rest_of_line ();
11040 +read_print_statistics (FILE *file)
11042 + hash_print_statistics (file, "pseudo-op table", po_hash);
11045 +/* Inserts the given line into the input stream.
11047 + This call avoids macro/conditionals nesting checking, since the contents of
11048 + the line are assumed to replace the contents of a line already scanned.
11050 + An appropriate use of this function would be substitution of input lines when
11051 + called by md_start_line_hook(). The given line is assumed to already be
11052 + properly scrubbed. */
11055 +input_scrub_insert_line (const char *line)
11058 + sb_new (&newline);
11059 + sb_add_string (&newline, line);
11060 + input_scrub_include_sb (&newline, input_line_pointer, 0);
11061 + sb_kill (&newline);
11062 + buffer_limit = input_scrub_next_buffer (&input_line_pointer);
11065 +/* Insert a file into the input stream; the path must resolve to an actual
11066 + file; no include path searching or dependency registering is performed. */
11069 +input_scrub_insert_file (char *path)
11071 + input_scrub_include_file (path, input_line_pointer);
11072 + buffer_limit = input_scrub_next_buffer (&input_line_pointer);
11075 +/* Find the end of a line, considering quotation and escaping of quotes. */
11077 +#if !defined(TC_SINGLE_QUOTE_STRINGS) && defined(SINGLE_QUOTE_STRINGS)
11078 +# define TC_SINGLE_QUOTE_STRINGS 1
11082 +_find_end_of_line (char *s, int mri_string, int insn ATTRIBUTE_UNUSED)
11084 + char inquote = '\0';
11085 + int inescape = 0;
11087 + while (!is_end_of_line[(unsigned char) *s]
11088 + || (inquote && !ISCNTRL (*s))
11089 + || (inquote == '\'' && flag_mri)
11090 +#ifdef TC_EOL_IN_INSN
11091 + || (insn && TC_EOL_IN_INSN (s))
11095 + if (mri_string && *s == '\'')
11097 + else if (inescape)
11099 + else if (*s == '\\')
11101 + else if (!inquote
11103 +#ifdef TC_SINGLE_QUOTE_STRINGS
11104 + || (TC_SINGLE_QUOTE_STRINGS && *s == '\'')
11111 + as_warn (_("missing closing `%c'"), inquote);
11113 + as_warn (_("stray `\\'"));
11118 +find_end_of_line (char *s, int mri_string)
11120 + return _find_end_of_line (s, mri_string, 0);