diff options
| author | svn2git <svn2git@FreeBSD.org> | 1994-05-01 08:00:00 +0000 |
|---|---|---|
| committer | svn2git <svn2git@FreeBSD.org> | 1994-05-01 08:00:00 +0000 |
| commit | a16f65c7d117419bd266c28a1901ef129a337569 (patch) | |
| tree | 2626602f66dc3551e7a7c7bc9ad763c3bc7ab40a /gnu/gas | |
| parent | 8503f4f13f77abf7adc8f7e329c6f9c1d52b6a20 (diff) | |
Diffstat (limited to 'gnu/gas')
52 files changed, 0 insertions, 17309 deletions
diff --git a/gnu/gas/COPYING b/gnu/gas/COPYING deleted file mode 100644 index 9a1703758111..000000000000 --- a/gnu/gas/COPYING +++ /dev/null @@ -1,249 +0,0 @@ - - GNU GENERAL PUBLIC LICENSE - Version 1, February 1989 - - Copyright (C) 1989 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The license agreements of most software companies try to keep users -at the mercy of those companies. By contrast, our General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. The -General Public License applies to the Free Software Foundation's -software and to any other program whose authors commit to using it. -You can use it for your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Specifically, the General Public License is designed to make -sure that you have the freedom to give away or sell copies of free -software, that you receive source code or can get it if you want it, -that you can change the software or use pieces of it in new free -programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of a such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must tell them their rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any program or other work which -contains a notice placed by the copyright holder saying it may be -distributed under the terms of this General Public License. The -"Program", below, refers to any such program or work, and a "work based -on the Program" means either the Program or any work containing the -Program or a portion of it, either verbatim or with modifications. Each -licensee is addressed as "you". - - 1. You may copy and distribute verbatim copies of the Program's source -code as you receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice and -disclaimer of warranty; keep intact all the notices that refer to this -General Public License and to the absence of any warranty; and give any -other recipients of the Program a copy of this General Public License -along with the Program. You may charge a fee for the physical act of -transferring a copy. - - 2. You may modify your copy or copies of the Program or any portion of -it, and copy and distribute such modifications under the terms of Paragraph -1 above, provided that you also do the following: - - a) cause the modified files to carry prominent notices stating that - you changed the files and the date of any change; and - - b) cause the whole of any work that you distribute or publish, that - in whole or in part contains the Program or any part thereof, either - with or without modifications, to be licensed at no charge to all - third parties under the terms of this General Public License (except - that you may choose to grant warranty protection to some or all - third parties, at your option). - - c) If the modified program normally reads commands interactively when - run, you must cause it, when started running for such interactive use - in the simplest and most usual way, to print or display an - announcement including an appropriate copyright notice and a notice - that there is no warranty (or else, saying that you provide a - warranty) and that users may redistribute the program under these - conditions, and telling the user how to view a copy of this General - Public License. - - d) You may charge a fee for the physical act of transferring a - copy, and you may at your option offer warranty protection in - exchange for a fee. - -Mere aggregation of another independent work with the Program (or its -derivative) on a volume of a storage or distribution medium does not bring -the other work under the scope of these terms. - - 3. You may copy and distribute the Program (or a portion or derivative of -it, under Paragraph 2) in object code or executable form under the terms of -Paragraphs 1 and 2 above provided that you also do one of the following: - - a) accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of - Paragraphs 1 and 2 above; or, - - b) accompany it with a written offer, valid for at least three - years, to give any third party free (except for a nominal charge - for the cost of distribution) a complete machine-readable copy of the - corresponding source code, to be distributed under the terms of - Paragraphs 1 and 2 above; or, - - c) accompany it with the information you received as to where the - corresponding source code may be obtained. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form alone.) - -Source code for a work means the preferred form of the work for making -modifications to it. For an executable file, complete source code means -all the source code for all modules it contains; but, as a special -exception, it need not include source code for modules which are standard -libraries that accompany the operating system on which the executable -file runs, or for standard header files or definitions files that -accompany that operating system. - - 4. You may not copy, modify, sublicense, distribute or transfer the -Program except as expressly provided under this General Public License. -Any attempt otherwise to copy, modify, sublicense, distribute or transfer -the Program is void, and will automatically terminate your rights to use -the Program under this License. However, parties who have received -copies, or rights to use copies, from you under this General Public -License will not have their licenses terminated so long as such parties -remain in full compliance. - - 5. By copying, distributing or modifying the Program (or any work based -on the Program) you indicate your acceptance of this license to do so, -and all its terms and conditions. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the original -licensor to copy, distribute or modify the Program subject to these -terms and conditions. You may not impose any further restrictions on the -recipients' exercise of the rights granted herein. - - 7. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of the license which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -the license, you may choose any version ever published by the Free Software -Foundation. - - 8. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - Appendix: How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to humanity, the best way to achieve this is to make it -free software which everyone can redistribute and change under these -terms. - - To do so, attach the following notices to the program. It is safest to -attach them to the start of each source file to most effectively convey -the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the program's name and a brief idea of what it does.> - Copyright (C) 19yy <name of author> - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 1, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19xx name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the -appropriate parts of the General Public License. Of course, the -commands you use may be called something other than `show w' and `show -c'; they could even be mouse-clicks or menu items--whatever suits your -program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - program `Gnomovision' (a program to direct compilers to make passes - at assemblers) written by James Hacker. - - <signature of Ty Coon>, 1 April 1989 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/gnu/gas/ChangeLog b/gnu/gas/ChangeLog deleted file mode 100644 index 3e0e64f37a10..000000000000 --- a/gnu/gas/ChangeLog +++ /dev/null @@ -1,917 +0,0 @@ -Fri Jan 4 12:48:22 EST 1991 Jay Fenlason (hack@ai.mit.edu) - - * messages.c Moved as_perror from input-scrub.c Modified the - error messages to look better. - - * output-file.c Don't call as_fatal, just call exit() - - expr.c Slightly improve checking for foo-foo case in - clean_up_expression(). Detect foo: bar: ... foo-bar... - -Tue Dec 4 16:29:20 EST 1990 Jay Fenlason (hack@ai.mit.edu) - - * m68k.c Fixed an obscure bug involving AOFF mode with a - large constant displacement (Was forgetting to output the - extension word.) - - make-gas.com Added a three line patch from Eric Youngdale that - makes it possible to submit make-gas.com to a batch queue. - -Wed Nov 21 15:07:51 EST 1990 Jay Fenlason (hack@ai.mit.edu) - - * vms.c (VMS_TBT_Routine_END) Add a four line patch from - Eric Youngdale. - -Tue Nov 13 14:02:15 EST 1990 Jay Fenlason (hack@ai.mti.edu) - - * vms-dbg.c (VMS_DBG_record()) Another one character patch from - Eric Youngdale. - -Mon Oct 29 15:49:21 EST 1990 Jay Fenlason (hack@ai.mit.edu) - - * read.c Replace some as_warn calls with as_bad. - -Fri Oct 26 15:21:15 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * i386.c, i860.c, ns32k.c Add const changes. - -Mon Oct 22 14:04:26 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * sparc.c Add const changes. - - * make-gas.com define const= for VMS, since many older versions of - GCC don't work correctly with const under VMS. - -Thu Oct 18 12:44:11 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * i860.c i860-opcode.h Added patches from rgb@mcc.com - - * read.c, symbols.c, vms.c, + new_file vms-dbg-module.c - Added Eric Youngdale's <YOUNGDALE@v6550c.nrl.navy.mil> VMS debugging - patches, so debugging GCC output now works. - - * hash.c (hash_grow) Remember to blank out the wall entry in the new - hash table. This is important on systems where malloc() returns - non-zero storage. . . - -Tue Oct 16 10:11:35 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * output-file.c (output_file_create) if output filename is given as - '-', write to stdout. - - * m68k.c Finally get the PCREL code to work right. Add relaxation of - PCREL stuff This small fix from Ken Woodland - (kenny%datacube.uucp@uunet.uu.net). - - * m68k.c Added some const declarations to constants. (md_relax_table, - md_pseudo_table, etc. . .) - -Thu Oct 11 11:15:10 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * Makefile, read.c, write.c Include the i860 port. - (New files i860.c i860-opcode.h i860.h) - - * m68k.c Fix some addressing modes, (AOFF, AINDEX, etc) to work in - PC relative mode. - - * (all over) Raeburn's const hacking. This reduces the data-space size by - declaring many tables, etc, as 'const'. - -Thu Sep 27 13:43:49 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * m68k.c (get_num) Fix so that 1:w is treated properly. - - * Makefile Replace references to a.out.h with a.out.gnu.h - -Tue Sep 25 15:50:36 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * sparc.c (md_number_to_imm) Fix so that RELOC_32 locations contain - zero, so that it will work with some sparc loaders which don't assume - that the locations in question do. A xix line patch from Michael Bloom - (usc!srhqla!quad1!psivax!ttidca!mb@zaphod.mps.ohio-state.edu) - -Mon Sep 24 11:43:15 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * as.c #include <sys/types.h> if _POSIX_SOURCE defined. This because - <signal.h> uses pid_t that's defined in it. - - * m68k.c reverse the sense of -l option, and allow :w and :l to - override the default size of AOFF indexes. - - Also, allow -l to shorten branches to unknown labels from LONG to WORD. - -Thu Sep 13 17:05:09 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * vax.c (md_parse_option) Don't print a warning msg if given -J - -Wed Sep 5 14:26:14 EDT 1990 Jay Fenlason - - * expr.c (operand) Don't get garbaged high-order bits when given a - lot of leading zeroes. - -Tue Sep 4 11:40:21 EDT 1990 Jay Fenlason - - * read.c (pseudo_set) Compain if we're setting the symbol to the - difference of two symbols which are in different frags. (We can't - find out how far apart they are.) - -Wed Aug 15 12:18:58 EDT 1990 Jay Fenlason - - * m68k.c (m68k_ip_op) Dyke out the code that deals with parsing - :[wl] at the end of expressions since it is handled in get_num() - and this was putting the result in the wrong place anyway. - Corrected a couple of other references to ->isiz instead of con?->e_siz - -Mon Aug 13 15:53:46 EDT 1990 Jay Fenlason - - * read.c Handle .align specially on the sparc, or any other machine - where OTHER_ALIGN is defined. Added option and comments about it - to Makefile. - -Fri Aug 10 12:24:33 EDT 1990 Jay Fenlason - - * m68k.c (get_num) Handle SEG_PASS1 expressions. - -Mon Aug 6 16:32:29 EDT 1990 Jay Fenlason - - * write.c (fixup_segment) Added two patches for the NS32k - and SEQUENT A six line patch from Ian Dall - (asgard!aegir!hugin!augean!sibyl!ian@munnari.oz.au) - -Wed Aug 1 13:30:48 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * m68k.c Include REGISTER_PREFIX ifdefs. - - * write.c Include LOCAL_LABEL() and DOT_LABEL_PREFIX feature. - - * vax.c (md_parse_option) Accept -H option. - - * vms.c New version of case hasher, etc. These from Eric Youngdale - <YOUNGDALE@v6550c.nrl.navy.mil> - -Fri Jul 20 13:39:02 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * README Added README.APOLLO and README.COFF stuff - -Wed Jul 18 16:29:22 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * Makefile Added option for SEQUENT_COMPATABILITY - - * ns32k.c Add configurable syntax feature from - ian@sibyl.eleceng.ua.oz@augean.ua.oz.au - and SEQUENT_COMPATABILITY - - * ns32k-opcode.h Add configurable syntax feature. - -Mon Jul 16 11:44:14 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * write.c (relax_segment) On ns32k, add fragP->fr_pcrel_adjust to - aim. - (fixup_segment) On ns32k, don't subtract size from - add_number on pcrel external symbols. - - * ns32k.c (md_relax_table) Use correct max displacements. - This is a six-line patch from ian@sibyl.eleceng.ua.oz.au - - * ns32k.c (md_atof, convert_iif) Emit floating point numbers in - the correct byte order. A seven line patch from - ian@sibyl.eleceng.ua.oz.au - - * ns32k.c (all over) Some lint fixes. - -Mon Jul 9 13:17:00 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * app.c (do_scrub_next_char) If a comment is #{whitespace} - don't treat the next line as comment also. - - * m68k.c (...) Accept apc@(num:[wl]), etc. - - * i386.c (md_assemble) Get bitfields correct when doing cross - assembly to 386. A two line patch from Michael Bloom. - (usc!srhqla!quad1!ttidca!mb@zaphod.mps.ohio-state.edu). - - * README.APOLLO a new file with vasta@apollo's name, address - and phone # in it. - - * make-gas.com Deleted references to gdb source files. - -Fri Jul 6 14:34:27 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * i386.c Ignore the .optim directive - - * input-file.c Change from _IOLBF to _IOFBF in setbuffer emulation - for SYSV. - -Mon Jun 18 15:36:49 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * sparc.c #ifdef DONTDEF s_sparc_align, since it isn't called from - anywhere. - -Fri Jun 15 15:53:30 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * vax.c (md_parse_option) make the code agree with the documentation - on the behaviour of the -d option. - -Thu Jun 7 14:23:54 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * atof-ieee.c (gen_to_words) Assemble 0r-0 correctly. - - * Makefile Remove last references to gdb*.c files. - - * version.c New version 1.36 - -Tue May 22 13:22:26 EDT 1990 Jay Fenlason (hack@ai.mit.edu) - - * Makefile Mention a work-around for a possible problem with HPUX7.0 - -Mon May 21 14:06:04 1990 Jim Kingdon (kingdon at pogo.ai.mit.edu) - - * sparc.c (sparc_ip): Change error message from "not in hash table" - to "unknown opcode". - -Wed May 16 15:33:14 EDT 1990 hack@wookumz - - * i386.c (i386_operand) Print error msg if given an operand like - 4(mumble) which we can't parse. - - * m68k.c (md_assemble) Add '3' to the list of operand-places that - can be found in 'symbol-dependent info'. Also change - 'confusing width' diagnostic to something more meaningful. - -Fri May 11 12:09:21 EDT 1990 hack@wookumz - - app.c (do_scrub_next_char) Don't flush the line after a line - consisting of a single '/' A one-line patch from Mike Kupfer - (kupfer@orc.olivetti.com) - - * i386.c (md_assemble) Call frag_wane() before calling frag_new() - A one line patch from Steve Bleazard (steve@robobar.co.uk - -Tue May 8 12:56:25 EDT 1990 hack@wookumz - - * atof-generic.c (atof-generic) Modified the Infinity detection code - to accept 0rinfinity and 0r-infinity as well as 0rinf and 0r-inf - -Thu Apr 26 15:17:31 EDT 1990 hack@wookumz - - * atof-ieee.c Change value of NaNs to 0x7fff ffff (float) and - 0x7fff ffff ffff ffff (double) If you want some other value for - NaN, use .long and spell it out yourself. - - atof-generic.c (atof_generic) Cleaned up code that detects NaN - and Inf. - - vax.c (md_assemble) print a useful error message if expression() - returns SEG_PASS1 or SEG_DIFFERENCE and we can't deal with those. - -Thu Apr 19 10:30:47 EDT 1990 hack@wookumz - - * input-scrub.c (AFTER_STRING) Make AFTER_STRING contain a null - so that the strstr() call when looking for "#NO_APP" after a "#APP" - will work. A two character patch from Bruce Robertson - (bruce@heather.pooh.com) - - * Makefile, i386.c Use atof-ieee.c instead of atof-i386.c - -Mon Apr 16 16:20:55 EDT 1990 hack@wookumz - - * m68k.c (md_relax_table) Many of the offsets were off by two. - Fixed some generic spacing problems thoughout the file. - -Thu Apr 12 12:22:35 EDT 1990 hack@wookumz - - * sparc.c (md_ri_to_chars) Handle little-endian cross assembly. - - * write.c (relax_segment) Compare addresses correctly to avoid - accidentally relaxing a branch that we don't have to. - These small changes from John Gilmore (gnu@toad.com) - -Fri Apr 6 12:52:15 EDT 1990 hack@wookumz - - * Makefile, expr.c symbols.c Correctly document the SUN_ASM_SYNTAX - option, and make it work. - -Tue Mar 20 12:46:59 EST 1990 - - * as.c (main) Only trap SIGHUP, SIGINT, SIGPIPE, and SIGTERM, - and only if they aren't being ignored. A three line patch - from Paul Eggert (eggert@twinsun.com) - - * write.c (relax_segment) Correct typo 'growth - ' should have been - growth = - - * atof-vax.c (next_bits, flonum_gen2vax) Clean up by sharing some - variables. While we're at it, fix next_bits so that it - doesn't use littlenums that don't exist. . . - -Tue Mar 13 16:23:21 EST 1990 hack@wookumz - - * Rename atof-m68k.c atof-ieee.c - - * Delete atof-ns32k.c - - * m68k.c sparc.c ns32k.c atof-ieee.c Call atof-ieee instead of - atof-m68k or atof-ns32k - - * Makefile Compile with atof-ieee.c instead of atof-ns32k.c or - atof-m68k.c - -Mon Mar 12 14:06:55 EST 1990 hack@wookumz - - * as.c If the signal handler gets called twice, exit immediatly. - - * ns32k.c Call gen_to_words with a pointer of the proper type, and - call md_number_to_chars to put the results in the proper byte-order. - Whoever wrote this code was *sloppy*! - - * Makefile ns32k.o depends on ns32k.c - - * vax.c (md_parse_option) If VMS, accept -+ and -h options. - - * vms.c (VMS_Case_Hack_Symbol) Replace #if NO_CASE_HACKING - with references to the -h option. These small VMS patches - from Angel Li (angel@flipper.miami.edu). - -Thu Mar 8 19:18:59 EST 1990 hack@wookumz - * vms.c Some trivial patches from Eric Youngdale - (YOUNGDALE@v6550c.nrl.navy.mil) - -Wed Mar 7 17:12:09 EST 1990 hack@wookumz - * make-gas.com (Define error as as_fatal when compiling vax.c and vms.c - A two line patch from Eric Youngdale - (YOUNGDALE@v6550c.nrl.navy.mil) - -Tue Mar 6 16:01:09 EST 1990 hack@wookumz - - * Makefile Include ns32k options in makefile. A small patch from - David Taylor (taylor@think.com). - - * as.c read.c write.c Makefile #ifdef DONTDEF out all the gdb - symbol stuff, since it isn't used anymore and it doesn't work. - -Mon Mar 5 14:51:04 EST 1990 hack@wookumz - - * i386.c (md_assemble) Replace memchr() with index(). - - * as.c Trap signals 1 through NSIG, print an error msg, and don't - produce an object file. - - * m68k.c Added a hack so that fsincosx fpx,fpy:fpz works. - - * messages.c New function: as_bad This is like as_warn, except - -W doesn't disable it, and calling it inhibits production of an - object file and causes a non-zero exit code. - -Tue Feb 13 14:25:53 EST 1990 hack@wookumz - * Makefile Include G0 and LOADLIBES for Sequent Symmetry. - Based on a small patch from Johan Widen (jw@sics.se) - -Thu Feb 1 14:08:58 EST 1990 hack@wookumz - * m68k.c Replace 'abort' with 'abort()' which will work. - -Wed Jan 24 17:15:08 EST 1990 hack@ai.mit.edu - - * read.c (ignore_rest_of_line) Have it print the first junk char - in both decimal and %c form. - - (read_a_source_file) On bad pseudo-op, print out the unknown - pseudo-op's name. - -Tue Jan 23 13:12:48 EST 1990 hack@ai.mit.edu - - * read.c (pseudo_set) If the symbol is external, have it remain - external. - - * i386-opcode.h Allow jc as a synonym for jb and jnc as a syn for jnb. - - -Wed Jan 3 09:35:31 EST 1990 hack@ai.mit.edu - - * ns32k.c [cpureg_032] Change register id of psr from 0x0b to 0x0d - * ns32k-opcode.h Change shift-counts for lsh and lshd - to one byte instead of 2 and 4. - A Trivial patch from John F. Peters (think!ames!practic.com!jfp@eddie) - -Tue Dec 5 16:37:44 EST 1989 hack@ai.mit.edu - - * ns32k.c (md_create_{long,short}_jump) Six line patch from - John F Peters (think!ames!vine!practice.com!jfp) to use the - correct addressing mode and byte-order for broken-word stuff. - - * write.c (write_object_file) One line patch to call fix_new_ns32k - with the correct # of args. - -Fri Dec 1 16:44:21 EST 1989 hack@ai.mit.edu - - * atof-generic.c, flonum-mult.c A real fix for the trailing-zeroes - problem from Georg Feil (ghfeil@white.toronto.edu) (two line change) - -Mon Nov 27 15:30:46 EST 1989 hack@ai.mit.edu - - * i386-opcode.h Fixed opcode-table entry for ljmp. A one char - patch from eliot@mgm.mit.edu - -Mon Nov 20 12:41:28 EST 1989 hack@ai.mit.edu - - * expr.c Replace the generic_buffer hack with a more portable one */ - - * atof-generic.c (atof_generic) Ignore trailing zeroes after a decimal - point. For some reason trailing zeroes (but not trailing nonzeroes) were - causing loss of precision. I don't know why. . . - - * vms.c Change copyright notice. Install changes from Kenneth Adelman - (adelman@tgv.com) for c++? (A dozen lines or so) - -Mon Nov 13 11:48:44 EST 1989 hack@ai.mit.edu - - * Makefile Add BINDIR and use it to control where the executable is - installed. - - * i386.c Use __builtin_alloca if possible (trivial patch from - Marco S. Hyman pacbell!dumbcat!marc) - -Mon Nov 6 18:24:47 EST 1989 hack@ai.mit.edu - - * version.c New version: 1.35 will be distributed with the - 1.36 gcc release. - -Mon Oct 30 10:38:11 EST 1989 hack@ai.mit.edu - - * atof-m68k.c (atof_m68k) Don't put the bits[] array on the stack, - since it may be pointed to after atof-m68k exits. - -Tue Oct 24 11:15:57 EDT 1989 hack@ai.mit.edu - - * atof-m68k.c Added #define for bcopy on USG systems. - #ifdef TEST the print_gen() function. - - * a.out.h if USE_HP_INC_HDR then use ../binutils/hp-include/a.out.h - -Fri Oct 13 14:36:48 EDT 1989 hack@ai.mit.edu - - * vax.c (all) Ran vax through indent -gnu to make it readable. - - vax.c (vip_op) Correctly assemble code like jmp $*0x11223344 - by setting vip_nbytes to 4 when using an immediate address. - I hope this works! - - m68k.c (s_proc (new)) Added s_proc no-op pseudo-op. - - Makefile Added instructions for compiling on Sequent Symmetry - and HP 9000/300. - - a.out.h Modified to compile on Sequent and HP above. (HP port - based on a msg from asjl@comp.vuw.ac.nz (real name unknown)). - -Tue Oct 10 14:39:44 EDT 1989 hack@ai.mit.edu - * vax.c (vip_op) Fixed a typo in an error msg and cleaned - up some spacing stuff. - -Wed Sep 27 19:07:12 EDT 1989 hack@ai.mit.edu - - * app.c (do_scrub_next_char) Fixed parsing of - # <line> "file" garbage - text so that it'll work again? (8 line patch from Mike Hibler - (mike@cs.utah.edu)) - -Mon Sep 18 16:26:01 EDT 1989 hack@ai.mit.edu - - * app.c (do_scrub_next_char): Modify parsing of /* ... */ to work - on the text /* ****/ - - * sparc.c (sparc_ip): Don't abort on insns that use the Alternate - Spaces. Try to assemble them correctly. - -Thu Sep 14 11:42:44 EDT 1989 hack@ai.mit.edu - - * sparc.c (md_number_to_imm) Dozen line patch from jkp@sauna.hut.fi - (Jyrki Kuoppala) so that gas output will work with shared libraries. - - * ns32k.c Include <string.h> instead of <strings.h> if USG defined. - - (md_end) free(freeptr_static) instead of free(freeptr) . - - * atof-ns32k.c Include as.h so that sysV stuff (bzero) will be - defined if needed. These ns32k changes from - nixbur!mollers.pad@seismo.css.gov (Josef Moellers) - -Fri Sep 1 11:39:52 EDT 1989 hack@ai.mit.edu - - * atof-m68k.c (gen_to_words) Get the sign right on negative - floating-point numbers. - -Wed Aug 30 13:59:57 EDT 1989 hack@ai.mit.edu - - * Makefile Remove the rest of the $< entries that kill sun make - -Fri Aug 25 15:00:30 EDT 1989 Nobody You Know (hack@ai.mit.edu) - - * atof-m68k.c (gen_to_words) deal with denormalized floating-point - numbers. - -Tue Aug 22 02:03:05 1989 Roland McGrath (roland at hobbes.ai.mit.edu) - - * Makefile (gas-dist.tar): Put ChangeLog in the tar file. - - * version.c: Added comment telling Jay Fenl--I mean people--not to put - changes in version.c, but to use ChangeLog instead. - - * version.c (version_string): Put "GNU" in all-caps. - - * version.c: Moved all comments about changes to ChangeLog (this file). - Many anonymous entries have been attributed to Jay Fenlason (hack). - -Thu Aug 17 15:53:57 1989 Jay Fenlason (hack at apple-gunkies.ai.mit.edu) - - * Makefile: Removed $< references that seem - to choke some versions of make. - - * frags.c (frag_grow): Fixed to deal with requests for very - large frags (larger than frags.chunk_size). - - * app.c (do_scrub_next_char): Have it ignore any characters - after the filename in a # line "filename". - - * sparc.c (s_common): On an error, don't print out - input_line_pointer past the end of the line where the error is. - - * atof-generic.c (atof_generic): Accept any case for - inf and nan. - - * m68k.c (m68_ip): Don't use PC-relative mode for alterable - addressing modes. - -Tue Aug 15 04:58:36 1989 Roland McGrath (roland at apple-gunkies.ai.mit.edu) - - * sparc.c (md_begin): Rewrote this function to perform consistency - checks with the new opcode table. - -Fri Aug 11 16:01:16 1989 Roland McGrath (roland at apple-gunkies.ai.mit.edu) - - * sparc-opcode.h (struct sparc_opcode): Replaced `mask' field with - `lose'; removed `last' field. Updated all opcodes accordingly. - Fixed several opcodes that generated the wrong instructions. - sparc.c (md_begin, sparc_ip): Changed to use new struct sparc_opcode. - -Thu Aug 3 14:44:24 1989 Jay Fenlason (hack at apple-gunkies.ai.mit.edu) - - * Makefile (a32k): Use read- and write-ns32k.o - * ns32k.c (encode_operand): Make sure pcrel_adjust starts out zeroed. - * read.c (cons): Call fix_new_ns32k() if NS32K is defined. - * write.c (write_object_file): Ditto. - These so that .word sym-sym (etc) will produce values with - the proper byte-order. - -Wed Aug 2 12:55:?? 1989 Jay Fenlason (hack at apple-gunkies.ai.mit.edu) - - * sparc.c (comment_chars[]): Removed '|' because it was causing - problems. Probably not the best fix, since I suspect other - assemblers (68020) may get | in .stabs also, and the 68020 needs - the '|' comment character. - -Mon Jul 31 09:22:28 1989 Roland McGrath (roland at apple-gunkies.ai.mit.edu) - - * sparc.c (sparc_ip): Allow the characters [0123] in opcodes. - -Tue Jul 25 16:32:12 1989 Jay Fenlason (hack) - - * atof-generic.c (atof_generic): Tried to keep - size_of_digits_in_littlenum from going negative. - - * sparc-opcode.h: Added duplicate [i+1] entries to go with - the [1+i] entries already there. A kludgy fix, but it works. - -Mon Jul 24 17:20:03 1989 Jay Fenlason (hack) - - * write.c (relax_segment): Modified rs_org code so it won't - occasionally dump core. - - * write.c (pseudo_set): Modified SEG_DIFFERENCE to (perhaps) - allow one to set a symbol to the difference of two other symbols. - - * ns32k.c (convert_iif): Moved size_so_far+=size and size=0 inside - the check for a valid type. - - * sparc-opcode.h: Modified the entries for std "q,[1+i]", "D,[1+i]", - and "Q,[1+i]". - -(In version 1.34) Jay Fenlason (hack) - - * Makefile: Reorganized, added stuff to make asparc. - - * sparc.c, sparc-opcode.h, sparc.h: Sparc port. - - * write.c: Set the size of text and bss segments to a multiple of eight - bytes. - - * m68k.c: Moved .single pseudo-op to machine independent part. - - * atof-generic.c: Fixed type in #ifdef __GNUC__. - - * sparc-opcode.h: Handle "mov REG, %y". - - * make-gas.com: Know that error.c no longer exists. - - * sparc.c: Handle [expr+reg]. - Don't call getExpression when looking for an immediate and getting - something that starts with % and isn't %hi or %lo. - - * Teach the 68k about long conditional branches. - -(In version 1.33) Jay Fenlason (hack) - - * Use __builtin_alloca if available. - - * README: Added more instructions for reporting bugs. - - * ns32k-opcode.h: Changed the acbb, acbw, and acbd insns. - - * vax.c: Replaced instances of LENGTH[STRING] with STRING[LENGTH]. - - * ns32k.c (encode_operand): Increased max size of bit field for exts - and inss instructions from 31 to 32 bits. - - * flonum-mult.c (flonum_multip): Fixed typo. - - * m68kc.: Allow #32 to be the same as #0 for bit-field ops. - - * make-gas.com, version.c, hex-value.c, flonum-const.c: VMS fixes. - - * ns32k.c, ns32k-opcode.h: More fixes from taylor@think.com. - Mostly typos in comments, etc. - - * ns32k-opcode.h: Fixed size of immediate operands to andw and andd - instructions. - -(In version 1.32) Jay Fenlason (hack) - - * read.c (s_set): Fixed misnamed variable. - - * as.c: Don't hang if given an invalid option. - - * m68k.c: Fixed bug in creating absolute long addresses for branches. - - * ns3k*: Some small ns32k patches. - - * m68k.c: Recognize 0rnan, 0rinf, 0r-inf. - - * app.c: Don't dump core on unterminated strings. - - * symbols.c: Give reasonable error messages. - - * ns32k*: Allow -m32032 and -m32532 options. - - * atof-*.c: Added support for NaN, Inf, and -Inf in atof_generic and - the various descriptions. - - * m68k.c (add_fix): Replace occurrences of "width==" with - "(width)==". This correct a precedence problem. - - * write.c, struc-symbol.h, m68k-opcode.h, m-hpux.h, Makefile: Changes - for HP-UX from Chris Hanson (cph@kleph.ai.mit.edu). - - * m68k-opcode.h: Reorder movem insns so gdb will see the ones using the - register list syntax first. - - * symbols.c (colon): Give more useful error messages when something was - defined as a .comm and is now trying to be defined locally. - Also, redefining a symbol is a fatal, not a warning. - - * m68k.c: Fixed a bug in using bignums as literal bit patterns for - floating-point numbers. - -(In version 1.31) Jay Fenlason (hack) - - * i386*: More patches. - - * Moved machine-dependent option parsing into the machine-dependent - source files. - -(In version 1.30) Jay Fenlason (hack) - - * i386*: New new version. - - * atof-m68k.c: Changed to be smaller, with somewhat better modularity. - Also fixed an obscure bug wherein next_bits would return random bits. - - * m68k.c: Be more careful about creating PC-relative addressing modes - on the 68000 and 68010. - - * frags.c (frag_new): Zero out the new frag. - - * Don't choke on "foo= bar" or on formfeeds. - - * read.c: Allow Sun-syntax local labels #ifdef SUN_ASM_SYNTAX. - * m-sun3.h: Defined SUN_ASM_SYNTAX. - -(In version 1.29) Jay Fenlason (hack) - - * i386.c: Newer version that fixes a bug wherein a jump instruction - would be split between two frags. - - * i386*: New version. - - * m68k.c: #ifdef M_SUN and -m68010, produce Sun-2 executables. - -(In version 1.28) Jay Fenlason (hack) - - * m68k.c: Added .single pseudo-op. - - * Made ". = X" and ".set .,X" equivalent to ".org X". - The pseudo-symbol "." has the value of the location the assembler is - currently assembling to. - -(In version 1.27) Jay Fenlason (hack) - - * Merged ns32k and i386 support. - -(In version 1.26) Jay Fenlason (hack) - - * Added partial ns32k support. - - * Added RMS's evil .word misfeature. Invented the -k (kludge) option - to warn that this misfeature was used. - - * Modified some files to get rid of warnings from GCC. - - * Added fix so that / can also be a comment character by itself. - -(In version 1.25) Jay Fenlason (hack) - - * Installed patches for VMS. - - * as.h (SIZEOF_STRUCT_FRAG): Added space before backslash-newline. - - * messages.c: Fixed typo. - - * app.c: Handle : correctly. - - * error.c: Removed; no longer used. - - * m68k-opcode.h: Added fnop. - Fixed to correctly handle fmovem with a register list and - non-predecriment addressing mode. - - * m68k-opcode.h: Fixed to know about long form of FBcc insns. - - * write.c: Warn if a fixup ended up being wider than its field width. - -(In version 1.24) Jay Fenlason (hack) - - * Accept and ignore -mc68010 and -m68010 switches. - - * Correctly assemble long subroutine calls on the 68000 without using a - 68020-specific instruction. - - * When calling with no filenames, read stdin. - -(In version 1.23) Jay Fenlason (hack) - - * app.c: Rewritten. - - * xmalloc.c, xrealloc.c: Replaced to work with GCC. - -(In version 1.22) Jay Fenlason (hack) - - * write.c: Fixed a VMS bug. - - * m68k.c: Fixed a bug having to do with turning absolute into - PC-relative. - - * atof-m68k.c (atof_m68k, gen_to_words): Try to avoid a problem with - running off the end of the LITTLENUMS. - - * vax.c: Fixed so parenthesized expressions work. - - * atof-generic.c: Added a cast that fixes problems with some C - compilers. - -(In version 1.21) - - * Changes for VMS support and correct bitfield order for - cross-assembly. - -(In version 1.20) - - * m68k*: Fixed "fmovel #N, fpcr". Added fpcr and fpsr to the list of - registers. - -(In version 1.19) - - * m68k.c? (md_convert_frag): Don't put the fixups for absolute long to - PC-relative in the data segment. - - * atof-generic.c: #include <alloca.h> #ifdef sparc. - -(In version 1.18) - - * Re-fixed _vfprintf stuff (?). - - * Made "movem REG, ADDR" work. - - * Improved preprocessing, without temporary files. - -(In version 1.17) - - * Don't produce an undefined empty symbol for ".globl foo," (a line - ending with a comma). - - * Fixed a bug wherein ".long X" became ".long 0" on the Sparc. - - * Fixed a bug which caused many "#APP" "#NO_APP" pairs to dump core. - - * Fixed calls to _doprnt to call _vfprintf #ifndef NO_VARARGS. - -(In version 1.16) - - * Merged HP-UX changes from Chris Hanson (cph@zurich.ai.mit.edu). - - * flonum-multip.c: Renamed to flonum-mult.c. - - * m-hpux.h: Created. - - * m68k.c (bcopy): Fixed. - -(In version 1.15) - - * struct-symbol.h: Renamed to struc-symbol.h. - -(In version 1.14) - - * vax.c: Added a quick fix for the offset of fixed-width branches not - fitting in the field given. - - * gdb-lines.c, read.c: Added support for .gdline and .gdbline - pseudo-ops. - -(In version 1.13) - - * read.c, atof-generic.c: Fixed bugs in reading in floating-point - numbers. - - * m68k-opcode.h: Made "fmovep a0@, fp0" work. - -(In version 1.12) - - * write.c: Fixed an obscure bug in relaction that would occasionally - cause the assembler to stop relaxing when it really had at least one - more pass to do. - -(In version 1.11) - - * m68k*: Allow register lists in fmovem. - - * Added more floating-point exponents. - - * Print an error message on exponent overflow. - -(In version 1.10) - - * Fixed floating point bugs that made it generate incorrect numbers for - values over 10^16 or so. - -(In version 1.09) - - * Fixed bug wherein you couldn't forward reference local label 0. - -(In version 1.08) - - * m68k.c, m68k-opcode.h: Added support for fmovem with register lists. - - * Fixed an obscure bug having to do with generating PC-relative - addressing mode for things in the middle of the instruction instead of - at the end. - -Wed Mar 1 15:29:24 1989 Randall Smith (randy at apple-gunkies.ai.mit.edu) - - * *.*: Modified copyright notices to reflect new General Public - License. - - * Makefile: Added copyright notice. - -Fri Feb 17 09:42:01 1989 Jay Fenlason (hack at spiff) - - * Patched frags.c so that new frags start out bzero()ed. - -Thu Jan 26 14:23:44 1989 Jay Fenlason (hack at apple-gunkies.ai.mit.edu) - - * Added patches from pace to files as.h i386.c i386-opcode.h - imull foo,%eax no longer gets assembled into the 32-64 bit - multiply, which clobbers %edx behind gcc's back - - jcxz/jecxz were backwards - - There was a bug when using %ebp as a base register with no - displacement - - Instructions like andb $0xffffff, %al used to put out too many - immediate bytes - - The splitting jump instructions across frags could happen when - obstack_room()==6 too. - -Local Variables: -mode: indented-text -left-margin: 8 -version-control: never -End: diff --git a/gnu/gas/Makefile b/gnu/gas/Makefile deleted file mode 100644 index e75351b64278..000000000000 --- a/gnu/gas/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -# @(#)Makefile 6.1 (Berkeley) 3/3/91 - -PROG= as -SRCS= app.c append.c as.c atof-generic.c bignum-copy.c \ - expr.c flonum-const.c flonum-copy.c flonum-mult.c \ - frags.c hash.c hex-value.c input-file.c input-scrub.c \ - messages.c obstack.c output-file.c read.c subsegs.c \ - symbols.c version.c write.c xmalloc.c xrealloc.c -CFLAGS+= -I$(.CURDIR) -I$(.CURDIR)/config \ - -DSIGTY=void -Derror=as_fatal -.PATH: $(.CURDIR)/config - -.include "config/Makefile.$(MACHINE)" - -.include <bsd.prog.mk> diff --git a/gnu/gas/Makefile.gnu b/gnu/gas/Makefile.gnu deleted file mode 100644 index 4b81b0c1adf1..000000000000 --- a/gnu/gas/Makefile.gnu +++ /dev/null @@ -1,356 +0,0 @@ -# Makefile for GAS. -# Copyright (C) 1989, Free Software Foundation -# -# This file is part of GAS, the GNU Assembler. -# -# GAS is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 1, or (at your option) -# any later version. -# -# GAS is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with GAS; see the file COPYING. If not, write to -# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. - -# This makefile may be used to make the VAX, 68020, 80386, -# SPARC, ns32k, or i860 assembler(s). - -BINDIR = /usr/local/bin -#CC=gcc - -# If you are on a BSD system, un-comment the next two lines, and comment out -# the lines for SystemV and HPUX below -G0 = -g -I. #-O -Wall -LDFLAGS = $(CFLAGS) -# -# To compile gas on a System Five machine, comment out the two lines above -# and un-comment out the next three lines -# Comment out the -lPW on the LOADLIBES line if you are using GCC. -# G0 = -g -I. -DUSG -# LDFLAGS = $(CFLAGS) -# LOADLIBES = -lmalloc -lPW -# -# To compile gas for HPUX, link m-hpux.h to m68k.h , and un-comment the -# next two lines. (If you are using GCC, comment out the alloca.o part) -# (Get alloca from the emacs distribution, or use GCC.) -# HPUX 7.0 may have a bug in setvbuf. gas gives an error message like -# 1:"Unknown operator" -- Statement 'NO_APP' ignored -# if setvbuf is broken. Re-compile input-file.c (and only input-file.c -# with -DVMS and the problem should go away. -# -# G0 = -g -I. -DUSG -# LOADLIBES = alloca.o -# -# To compile gas for a Sequent Symmetry, comment out all the above lines, -# and un-comment the next two lines. -# G0 = -g -I. -DUSE_SYSTEM_HDR -DEXEC_VERSION=1 -# LOADLIBES = -lc /usr/att/lib/libc.a - -# If you just want to compile the vax assembler, type 'make avax' - -# If you just want to compile the i386 assembler, type 'make a386' - -# If you just want to compile the ns32k assembler, type 'make a32k' - -# If you just want to compile the sparc assembler, type 'make asparc' - -# If you just want to compile the mc68020 assembler, make sure m68k.h -# is correctly set up, and type type 'make a68' (Except on HPUX machines, -# where you will have to make the changes marked below before typing -# 'make a68' -# m68k.h should be a symbolic or hard-link to one of -# m-sun3.h , m-hpux.h or m-generic.h -# depending on which machine you want to compile the 68020 assembler for. -# -# If you want the 68k assembler to be completely compatable with the the -# SUN one, un-comment the -DSUN_ASM_SYNTAX line below. -# -# If you machine does not have vfprintf, but does have _doprnt(), -# remove the # from the -DNO_VARARGS line below. -# -# If the return-type of a signal-hander is void (instead of int), -# remove the # from the -DSIGTY line below. -# -# To include the mc68851 mmu coprocessor instructions in the 68020 assembler, -# remove the # from the -Dm68851 line below. -# -# If you want the 68020 assembler use a register prefix character, un-comment -# the REGISTER_PREFIX line, and (maybe) change the '%' to the appropriate -# character. -# -# If you want the assembler to treat .L* or ..* symbols as local, instead of -# the usual L* symbols, un-comment the DOT_LABEL_PREFIX line. -# -# If you want the 80386 assembler to correctly handle fsub/fsubr and fdiv/fdivr -# opcodes (unlike most 80386 assemblers), remove the # from -# the -DNON_BROKEN_WORDS line below. -# -# To compile 80386 Gas for the Sequent Symmetry, un-comment the -DEXEC_VERSION -# and the -DUSE_SYSTEM_HDR lines below. -# -# To compile gas for the HP 9000/300 un-comment the -DUSE_HP_HDR line below. -# -# For the ns32k, the options are 32532 or 32032 CPU and 32381 or 32081 FPU. -# To select the NS32532, remove the # from the -DNS32532 line below. -# To compile in tne NS32381 opcodes in addition to the NS32081 opcodes -# (the 32381 is a superset of the 32081), remove the # from the -DNS32381 -# line below. -# -# For the ns32k on a Sequent, uncomment the SEQUENT_COMPATABILITY line below. -# -# If you want the .align N directive to align to the next N byte boundry, -# instead of the next 1<<N boundry, un-comment the OTHER_ALIGN line below. -# (This option is automatically enabled when building the sparc assembler. -# - -O1 = -DNO_VARARGS -O2 = # -DNON_BROKEN_WORDS -O3 = # -Dm68851 -O4 = # -DEXEC_VERSION=1 -O5 = # -DSIGTY=void -O6 = # -DNS32532 -O6 = # -DNS32381 -O7 = # -DDOT_LABEL_PREFIX -O8 = # -DSEQUENT_COMPATABILITY -O9 = # -DREGISTER_PREFIX=\'%\' -O10= # -DOTHER_ALIGN - -G1 = # -DUSE_SYSTEM_HDR -G2 = # -DUSE_HP_HDR -G3 = # -DSUN_ASM_SYNTAX - -OPTIONS = $(O1) $(O2) $(O3) $(O4) $(O5) $(O6) $(O7) $(O8) $(O9) $(O10) - -CFLAGS = $(G0) $(G1) $(G2) $(G3) $(G4) - -# -# To make the 68020 assembler compile as the default, un-comment the next -# line, and comment out all the other lines that start with DEFAULT_GAS -DEFAULT_GAS=a68 -# -# To make the VAX assembler compile as the default, un-comment the next -# line and commment out all the other lines that start with DEFAULT_GAS -#DEFAULT_GAS=avax -# -# To make the 80386 assembler compile as the default, un-comment the next -# line and commment out all the other lines that start with DEFAULT_GAS -#DEFAULT_GAS=a386 -# -# To make the ns32k assembler compile as the default, un-comment the next -# line and commment out all the other lines that start with DEFAULT_GAS -#DEFAULT_GAS=a32k -# -# To make the sparc assembler compile as the default, un-comment the next -# line and commment out all the other lines that start with DEFAULT_GAS -#DEFAULT_GAS=asparc -# -# To make the i860 assembler compile as the default, un-comment the next -# line and comment out all the other lines that start with DEFAULT_GAS -#DEFAULT_GAS=a860 - -# Global Sources ------------------------------------------------------------- - -a =\ -as.o xrealloc.o xmalloc.o hash.o hex-value.o \ -atof-generic.o append.o messages.o expr.o app.o \ -frags.o input-file.o input-scrub.o output-file.o \ -subsegs.o symbols.o version.o \ -flonum-const.o flonum-copy.o flonum-mult.o strstr.o bignum-copy.o \ -obstack.o -#gdb.o gdb-file.o gdb-symbols.o gdb-blocks.o gdb-lines.o - -a: $(DEFAULT_GAS) - @rm -f a - @ln $(DEFAULT_GAS) a - -# I860 GAS ------------------------------------------------------------------ -u = i860.o atof-ieee.o write-i860.o read-i860.o - -U = i860.c i860.h i860-opcode.h - -i860.o: i860.c i860.h i860-opcode.h as.h frags.h struc-symbol.h -i860.o: flonum.h expr.h hash.h md.h write.h read.h symbols.h - $(CC) -c $(CFLAGS) -DI860 i860.c - -atof-ieee.o: flonum.h - -write-i860.o: write.c i860.h - $(CC) -c -DI860 $(CFLAGS) write.c - mv write.o write-i860.o - -read-i860.o: read.c i860.h - $(CC) -c -DI860 $(CFLAGS) read.c - mv read.o read-i860.o - -a860: $a $u - $(CC) -o a860 $(LDFLAGS) $a $u $(LOADLIBES) - -# SPARC GAS ------------------------------------------------------------------ -v = sparc.o atof-ieee.o write-sparc.o read-sparc.o - -V = sparc.c sparc.h sparc-opcode.h - -atof-ieee.o: flonum.h -sparc.o: sparc.c sparc.h sparc-opcode.h as.h frags.h struc-symbol.h -sparc.o: flonum.h expr.h hash.h md.h write.h read.h symbols.h - $(CC) -c $(CFLAGS) -DSPARC sparc.c - -write-sparc.o: write.c - $(CC) -c -DSPARC $(CFLAGS) write.c - mv write.o write-sparc.o - -read-sparc.o: read.c - $(CC) -c -DSPARC $(CFLAGS) read.c - mv read.o read-sparc.o - -asparc: $a $v - $(CC) -o asparc $(LDFLAGS) $a $v $(LOADLIBES) - -# NS32K GAS ------------------------------------------------------------------ -w = ns32k.o atof-ieee.o write-ns32k.o read-ns32k.o - -W = ns32k.c ns32k-opcode.h - -atof-ieee.o: flonum.h -ns32k.o: as.h frags.h struc-symbol.h flonum.h expr.h md.h hash.h -ns32k.o: write.h symbols.h ns32k-opcode.h ns32k.c - $(CC) $(CFLAGS) $(OPTIONS) -c ns32k.c - -write-ns32k.o: write.c - $(CC) -c -DNS32K $(CFLAGS) write.c - mv write.o write-ns32k.o - -read-ns32k.o: - $(CC) -c -DNS32K $(CFLAGS) read.c - mv read.o read-ns32k.o - -a32k: $a $w - $(CC) -o a32k $(LDFLAGS) $a $w $(LOADLIBES) - -# 80386 GAS ------------------------------------------------------------------ -x = i386.o atof-ieee.o write.o read.o - -X = i386.c i386.h i386-opcode.h - -i386.o: i386.c as.h read.h flonum.h frags.h struc-symbol.h expr.h -i386.o: symbols.h hash.h md.h i386.h i386-opcode.h - $(CC) $(CFLAGS) $(OPTIONS) -c i386.c - -atof-ieee.o: flonum.h - -a386: $a $x - $(CC) -o a386 $(LDFLAGS) $a $x $(LOADLIBES) - -# 68020 GAS ------------------------------------------------------------------ -y = m68k.o atof-ieee.o write.o read.o - -Y = m68k.c atof-ieee.c m68k-opcode.h m-hpux.h m-sun3.h m-generic.h - -atof-ieee.o: flonum.h - -m68k.o: m68k.c a.out.gnu.h as.h expr.h flonum.h frags.h hash.h -m68k.o: m68k-opcode.h m68k.h md.h obstack.h struc-symbol.h - $(CC) $(CFLAGS) $(OPTIONS) -c m68k.c - -a68: $a $y - $(CC) -o a68 $(LDFLAGS) $a $y $(LOADLIBES) - -# VAX GAS -------------------------------------------------------------------- -z = vax.o atof-vax.o write.o read.o - -Z = vax.c atof-vax.c vax-opcode.h vax-inst.h \ - make-gas.com objrecdef.h vms.c vms-dbg.c README-vms-dbg - -vax.o: vax.c a.out.gnu.h as.h expr.h flonum.h frags.h md.h obstack.h -vax.o: read.h struc-symbol.h symbols.h vax-inst.h vax-opcode.h -atof-vax.o: as.h flonum.h read.h - -avax: $a $z - $(CC) -o avax $(LDFLAGS) $a $z $(LOADLIBES) - -# global files --------------------------------------------------------------- - -as.o: as.c - $(CC) $(CFLAGS) $(OPTIONS) -c as.c - -messages.o: messages.c - $(CC) $(CFLAGS) $(OPTIONS) -c messages.c - -hash.o: hash.c - $(CC) $(CFLAGS) -Derror=as_fatal -c hash.c - -xmalloc.o: xmalloc.c - $(CC) $(CFLAGS) -Derror=as_fatal -c xmalloc.c - -xrealloc.o: xrealloc.c - $(CC) $(CFLAGS) -Derror=as_fatal -c xrealloc.c - -A =\ -as.c xrealloc.c xmalloc.c hash.c hex-value.c \ -atof-generic.c append.c messages.c expr.c bignum-copy.c \ -frags.c input-file.c input-scrub.c output-file.c read.c \ -subsegs.c symbols.c write.c strstr.c \ -flonum-const.c flonum-copy.c flonum-mult.c app.c version.c \ -obstack.c \ -#gdb.c gdb-file.c gdb-symbols.c gdb-blocks.c \ -#gdb-lines.c - -H = \ -a.out.gnu.h as.h bignum.h expr.h flonum.h \ -frags.h hash.h input-file.h md.h \ -obstack.h read.h struc-symbol.h subsegs.h \ -symbols.h write.h - -dist: COPYING README ChangeLog $A $H $Z $Y $X $W $V $U Makefile - echo gas-`sed -n -e '/ version /s/[^0-9.]*\([0-9.]*\).*/\1/p' < version.c` > .fname - mkdir `cat .fname` - - ln COPYING README ChangeLog $A $H $Z $Y $X $W $V $U Makefile `cat .fname` - tar cvhZf `cat .fname`.tar.Z `cat .fname` - -rm -r `cat .fname` - -rm .fname - -clean: - rm -f a avax a68 a386 a32k asparc $a $v $w $x $y $z a core gmon.out bugs a.out - -install: a - cp a $(BINDIR)/gas - - -# General .o-->.h dependencies - -app.o: as.h -as.o: a.out.gnu.h as.h read.h struc-symbol.h write.h -atof-generic.o: flonum.h -bignum-copy.o: bignum.h -expr.o: a.out.gnu.h as.h expr.h flonum.h obstack.h read.h struc-symbol.h -expr.o: symbols.h -flonum-const.o: flonum.h -flonum-copy.o: flonum.h -flonum-mult.o: flonum.h -flonum-normal.o:flonum.h -flonum-print.o: flonum.h -frags.o: a.out.gnu.h as.h frags.h obstack.h struc-symbol.h subsegs.h -#gdb.o: as.h -#gdb-blocks.o: as.h -#gdb-lines.o: as.h frags.h obstack.h -#gdb-symbols.o: a.out.gnu.h as.h struc-symbol.h -hash.o: hash.h -input-file.o: input-file.h -input-scrub.o: as.h input-file.h read.h -messages.o: as.h -obstack.o: obstack.h -read.o: a.out.gnu.h as.h expr.h flonum.h frags.h hash.h md.h obstack.h -read.o: read.h struc-symbol.h symbols.h -subsegs.o: a.out.gnu.h as.h frags.h obstack.h struc-symbol.h subsegs.h write.h -symbols.o: a.out.gnu.h as.h frags.h hash.h obstack.h struc-symbol.h symbols.h -write.o: a.out.gnu.h as.h md.h obstack.h struc-symbol.h subsegs.h -write.o: symbols.h write.h - -flonum.h: bignum.h - diff --git a/gnu/gas/NOTES b/gnu/gas/NOTES deleted file mode 100644 index b3f3f92d2ef7..000000000000 --- a/gnu/gas/NOTES +++ /dev/null @@ -1,35 +0,0 @@ -gdb debugging of assembly sources: - write a function linestab() that generates a .stabd symbol - independently of the input - write a function filestab() to generate a .stabs symbol - we need to take especial care with #line directives - since we want to handle locore, and locore is passed thru cpp - this could be tough - outline of a solution: - cpp sends us lines of the form - # logical-line "logical-file" trash - these lines are interpreted ahead of the gas preprocess pass - in the starting state, the logical filename is the same - as the real filename (in case there're no #lines) - the initial logical line number is 1 - every time we're ready to process a new instruction line, - if the source file has changed, - emit a .stabs for the logical file - emit a .stabd for the logical line - bump the logical line number - can gas eat multiple actual lines in one insn? - -i386 nits: - jmp *$foo produces a short relative branch - string quotes in comments - Bill says gas eats text across newlines to find matches - works fine for me - I think it's most likely due to cpp - make / no longer be a comment char - it's now like the VAX: # is the only comment char - incorrectly assembles lcall, int3, into, bsr/f instructions - constant expressions fail if more than a few terms - gives (low+2)*3+4*5 as an example - works fine for me - cpp seems to think $ is a valid literal - use -$ in /usr/bin/cpp diff --git a/gnu/gas/README.gnu b/gnu/gas/README.gnu deleted file mode 100644 index 46f135fcfd86..000000000000 --- a/gnu/gas/README.gnu +++ /dev/null @@ -1,133 +0,0 @@ -This is the beta-test version of the GNU assembler. (Probably -around Version 1.35, but check version.c which gets updated more -often than this readme.) - -The assembler has been modified to support a feature that is -potentially useful when assembling compiler output, but which may -confuse assembly language programmers. If assembler encounters a -.word pseudo-op of the form symbol1-symbol2 (the difference of two -symbols), and the difference of those two symbols will not fit in 16 -bits, the assembler will create a branch around a long jump to -symbol1, and insert this into the output directly before the next -label: The .word will (instead of containing garbage, or giving an -error message) contain (the address of the long jump)-symbol2. This -allows the assembler to assemble jump tables that jump to locations -very far away into code that works properly. If the next label is -more than 32K away from the .word, you lose (silently) RMS claims -this will never happen. If the -k option is given, you will get a -warning message when this happens. - -These files are currently set up to allow you to compile all of the -versions of the assembler (68020, VAX, ns32k, and i386) on the same -machine. To compile the 68020 version, type 'make a68'. To compile -the VAX version, type 'make avax'. To compile the ns32k version, -type 'make a32k'. To compile the Intel 80386 version, type 'make -a386'. The Makefile contains instructions on how to make one of the -assemblers compile as the default. - -Before you can compile the 68020 version of the assembler, you must -make m68k.h be a link to m-sun3.h , m-hpux.h or m-generic.h . If -you are on a SUN-3 (or other machine that uses a magic number of -(2 << 16) | OMAGIC type 'ln -s m-sun3.h m68k.h' else if you are on a -machine running HP-UX, type 'ln m-hpux.h m689k.h' else type -'ln -s m-generic.h m68k.h' If your machine does not support symbolic -links, omit the '-s'. - -See the instructions in the Makefile for compiling gas for the Sequent -Symmetry (dynix 3.0.12 + others?) or for the HP 9000/300 - -If your machine does not have both varargs.h and vfprintf(), but does have -_doprnt() add -DNO_VARARGS to the CFLAGS line in the makefile. If your -machine has neither vfprintf() or _doprnt(), you will have to change -messages.c in order to get readable error messages from the assembler. - - - REPORTING BUGS IN GAS - -Bugs in gas should be reported to bug-gnu-utils@prep.ai.mit.edu If you can't -get through to prep, try hack@gnu.ai.mit.edu or hack@media-lab.media.mit.edu - -If you report a bug in GAS, please remember to include: - -A description of exactly what went wrong. - -The type of machine GAS was running on (VAX, 68020, etc), - -The Operating System GAS was running under. - -The options given to GAS. - -The actual input file that caused the problem. - -It is silly to report a bug in GAS without including an input file for -GAS. Don't ask us to generate the file just because you made it from -files you think we have access to. - -1. You might be mistaken. -2. It might take us a lot of time to install things to regenerate that file. -3. We might get a different file from the one you got, and might not see any -bug. - -To save us these delays and uncertainties, always send the input file -for the program that failed. - -If the input file is very large, and you are on the internet, you may -want to make it avaliable for anonymous FTP instead of mailing it. If you -do, include instructions for FTP'ing it in your bug report. - ------------------------------- README.APOLLO --------------------------------- - -The changes required to get the GNU C compiler running on -Apollo 68K platforms are available via anonymous ftp from -labrea.stanford.edu (36.8.0.47) in the form of a compressed -tar file named "/pub/gnu/apollo-gcc-1.37.tar.Z". -The size of the file is 84145 bytes. - -To build GCC for the Apollo you'll need the virgin FSF -distributions of bison-1.03, gas-1.34, and gcc-1.37. They -are also on labrea.stanford.edu as well as prep.ai.mit.edu. -My changes are to enable gas to produce Apollo COFF object -files and allow gcc to parse some of the syntax extensions -which appear in Apollo C header files. Note that the -COFF encapsulation technique cannot be used on the Apollo. - -The tar file should be unpacked in the directory containing -the gas-1.34 and gcc-1.37 directories; a few files will be overlaid, -and an APOLLO-GCC-README file will appear in the top directory. -This file contains detailed instructions on how to proceed. - -These changes will only work for SR10.1 or later systems, using -the 6.6 or later version of the Apollo C compiler. - -If you do not have ftp access, I can mail you the changes in the -form of diffs; they are approximately 40K in length. If you request -them, be sure to give me a voice phone number so I can contact you -in case I can't send you mail; I've had several requests in the -past from people I can't contact. - -By the way, I'm working on getting the GNU C++ compiler running; -there are a couple problems to solve. I hope to be able to announce -the Apollo version shortly after the 1.37 version is released. - -John Vasta Hewlett-Packard Apollo Systems Division -vasta@apollo.hp.com M.S. CHA-01-LT -(508) 256-6600 x6362 300 Apollo Drive, Chelmsford, MA 01824 -UUCP: {decwrl!decvax, mit-eddie, attunix}!apollo!vasta - ------------------------------------- - -You might refer others who are interested in a similar thing. - -Kevin Buchs buchs@mayo.edu - - ------------------------------- README.COFF ----------------------------------- - -If you have a COFF system, you may wish to aquire - - UUCP: osu-cis!~/gnu/coff/gnu-coff.tar.Z - or - FTP: tut.cis.ohio-state.edu:/pub/gnu/coff/gnu-coff.tar.Z - -These contain patches for gas that will make it produce COFF output. -I have never seen these patches, so I don't know how well they work. diff --git a/gnu/gas/app.c b/gnu/gas/app.c deleted file mode 100644 index a0ec8a28e808..000000000000 --- a/gnu/gas/app.c +++ /dev/null @@ -1,392 +0,0 @@ -/* This is the Assembler Pre-Processor - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* App, the assembler pre-processor. This pre-processor strips out excess - spaces, turns single-quoted characters into a decimal constant, and turns - # <number> <filename> <garbage> into a .line <number>;.file <filename> pair. - This needs better error-handling. - */ -#include <stdio.h> -#ifdef USG -#define bzero(s,n) memset(s,0,n) -#endif -#if !defined(__STDC__) && !defined(const) -#define const /* Nothing */ -#endif - -static char lex [256]; -static const char symbol_chars[] = - "$._ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - -extern const char comment_chars[]; -extern const char line_comment_chars[]; - -#define LEX_IS_SYMBOL_COMPONENT (1) -#define LEX_IS_WHITESPACE (2) -#define LEX_IS_LINE_SEPERATOR (4) -#define LEX_IS_COMMENT_START (8) /* JF added these two */ -#define LEX_IS_LINE_COMMENT_START (16) -#define IS_SYMBOL_COMPONENT(c) (lex [c] & LEX_IS_SYMBOL_COMPONENT) -#define IS_WHITESPACE(c) (lex [c] & LEX_IS_WHITESPACE) -#define IS_LINE_SEPERATOR(c) (lex [c] & LEX_IS_LINE_SEPERATOR) -#define IS_COMMENT(c) (lex [c] & LEX_IS_COMMENT_START) -#define IS_LINE_COMMENT(c) (lex [c] & LEX_IS_LINE_COMMENT_START) - -void -do_scrub_begin() -{ - const char *p; - - bzero (lex, sizeof(lex)); /* Trust NOBODY! */ - lex [' '] |= LEX_IS_WHITESPACE; - lex ['\t'] |= LEX_IS_WHITESPACE; - for (p =symbol_chars;*p;++p) - lex [*p] |= LEX_IS_SYMBOL_COMPONENT; - lex ['\n'] |= LEX_IS_LINE_SEPERATOR; -#ifdef DONTDEF - lex [':'] |= LEX_IS_LINE_SEPERATOR; -#endif - lex [';'] |= LEX_IS_LINE_SEPERATOR; - for (p=comment_chars;*p;p++) - lex[*p] |= LEX_IS_COMMENT_START; - for (p=line_comment_chars;*p;p++) - lex[*p] |= LEX_IS_LINE_COMMENT_START; -} - -FILE *scrub_file; - -int -scrub_from_file() -{ - return getc(scrub_file); -} - -void -scrub_to_file(ch) -int ch; -{ - ungetc(ch,scrub_file); -} - -char *scrub_string; -char *scrub_last_string; - -int -scrub_from_string() -{ - return scrub_string == scrub_last_string ? EOF : *scrub_string++; -} - -void -scrub_to_string(ch) -int ch; -{ - *--scrub_string=ch; -} - -int -do_scrub_next_char(get,unget) -int (*get)(); -void (*unget)(); -/* FILE *fp; */ -{ - /* State 0: beginning of normal line - 1: After first whitespace on normal line (flush more white) - 2: After first non-white on normal line (keep 1white) - 3: after second white on normal line (flush white) - 4: after putting out a .line, put out digits - 5: parsing a string, then go to old-state - 6: putting out \ escape in a "d string. - 7: After putting out a .file, put out string. - 8: After putting out a .file string, flush until newline. - -1: output string in out_string and go to the state in old_state - -2: flush text until a '*' '/' is seen, then go to state old_state - */ - - static state; - static old_state; - static char *out_string; - static char out_buf[20]; - static add_newlines; - int ch; - - if(state==-1) { - ch= *out_string++; - if(*out_string==0) { - state=old_state; - old_state=3; - } - return ch; - } - if(state==-2) { - for(;;) { - do ch=(*get)(); - while(ch!=EOF && ch!='\n' && ch!='*'); - if(ch=='\n' || ch==EOF) - return ch; - ch=(*get)(); - if(ch==EOF || ch=='/') - break; - (*unget)(ch); - } - state=old_state; - return ' '; - } - if(state==4) { - ch=(*get)(); - if(ch==EOF || (ch>='0' && ch<='9')) - return ch; - else { - while(ch!=EOF && IS_WHITESPACE(ch)) - ch=(*get)(); - if(ch=='"') { - (*unget)(ch); - out_string="; .file "; - old_state=7; - state= -1; - return *out_string++; - } else { - while(ch!=EOF && ch!='\n') - ch=(*get)(); - return ch; - } - } - } - if(state==5) { - ch=(*get)(); - if(ch=='"') { - state=old_state; - return '"'; - } else if(ch=='\\') { - state=6; - return ch; - } else if(ch==EOF) { - as_warn("End of file in string: inserted '\"'"); - state=old_state; - (*unget)('\n'); - return '"'; - } else { - return ch; - } - } - if(state==6) { - state=5; - ch=(*get)(); - switch(ch) { - /* This is neet. Turn "string - more string" into "string\n more string" - */ - case '\n': - (*unget)('n'); - add_newlines++; - return '\\'; - - case '"': - case '\\': - case 'b': - case 'f': - case 'n': - case 'r': - case 't': - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - break; - default: - as_warn("Unknown escape '\\%c' in string: Ignored",ch); - break; - - case EOF: - as_warn("End of file in string: '\"' inserted"); - return '"'; - } - return ch; - } - - if(state==7) { - ch=(*get)(); - state=5; - old_state=8; - return ch; - } - - if(state==8) { - do ch= (*get)(); - while(ch!='\n'); - state=0; - return ch; - } - - flushchar: - ch=(*get)(); - switch(ch) { - case ' ': - case '\t': - do ch=(*get)(); - while(ch!=EOF && IS_WHITESPACE(ch)); - if(ch==EOF) - return ch; - if(IS_COMMENT(ch) || (state==0 && IS_LINE_COMMENT(ch)) || ch=='/' || IS_LINE_SEPERATOR(ch)) { - (*unget)(ch); - goto flushchar; - } - (*unget)(ch); - if(state==0 || state==2) { - state++; - return ' '; - } else goto flushchar; - - case '/': - ch=(*get)(); - if(ch=='*') { - for(;;) { - do { - ch=(*get)(); - if(ch=='\n') - add_newlines++; - } while(ch!=EOF && ch!='*'); - ch=(*get)(); - if(ch==EOF || ch=='/') - break; - (*unget)(ch); - } - if(ch==EOF) - as_warn("End of file in '/' '*' string: */ inserted"); - - (*unget)(' '); - goto flushchar; - } else { - if(IS_COMMENT('/') || (state==0 && IS_LINE_COMMENT('/'))) { - (*unget)(ch); - ch='/'; - goto deal_misc; - } - if(ch!=EOF) - (*unget)(ch); - return '/'; - } - break; - - case '"': - old_state=state; - state=5; - return '"'; - break; - - case '\'': - ch=(*get)(); - if(ch==EOF) { - as_warn("End-of-file after a ': \000 inserted"); - ch=0; - } - sprintf(out_buf,"(%d)",ch&0xff); - old_state=state; - state= -1; - out_string=out_buf; - return *out_string++; - - case ':': - if(state!=3) - state=0; - return ch; - - case '\n': - if(add_newlines) { - --add_newlines; - (*unget)(ch); - } - case ';': - state=0; - return ch; - - default: - deal_misc: - if(state==0 && IS_LINE_COMMENT(ch)) { - do ch=(*get)(); - while(ch!=EOF && IS_WHITESPACE(ch)); - if(ch==EOF) { - as_warn("EOF in comment: Newline inserted"); - return '\n'; - } - if(ch<'0' || ch>'9') { - while(ch!=EOF && ch!='\n') - ch=(*get)(); - if(ch==EOF) - as_warn("EOF in Comment: Newline inserted"); - state=0; - return '\n'; - } - (*unget)(ch); - old_state=4; - state= -1; - out_string=".line "; - return *out_string++; - - } else if(IS_COMMENT(ch)) { - do ch=(*get)(); - while(ch!=EOF && ch!='\n'); - if(ch==EOF) - as_warn("EOF in comment: Newline inserted"); - state=0; - return '\n'; - - } else if(state==0) { - state=2; - return ch; - } else if(state==1) { - state=2; - return ch; - } else { - return ch; - - } - case EOF: - if(state==0) - return ch; - as_warn("End-of-File not at end of a line"); - } - return -1; -} - -#ifdef TEST - -char comment_chars[] = "|"; -char line_comment_chars[] = "#"; - -main() -{ - int ch; - - app_begin(); - while((ch=do_scrub_next_char(stdin))!=EOF) - putc(ch,stdout); -} - -as_warn(str) -char *str; -{ - fputs(str,stderr); - putc('\n',stderr); -} -#endif diff --git a/gnu/gas/append.c b/gnu/gas/append.c deleted file mode 100644 index d51a27fc65fc..000000000000 --- a/gnu/gas/append.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Append a string ontp another string - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* JF: This is silly. Why not stuff this in some other file? */ -#ifdef USG -#define bcopy(from,to,n) memcpy(to,from,n) -#endif - -void -append (charPP, fromP, length) -char **charPP; -char *fromP; -unsigned long length; -{ - if (length) { /* Don't trust bcopy() of 0 chars. */ - bcopy (fromP, * charPP,(int) length); - *charPP += length; - } -} - -/* end: append.c */ diff --git a/gnu/gas/as.1 b/gnu/gas/as.1 deleted file mode 100644 index 291027923aa4..000000000000 --- a/gnu/gas/as.1 +++ /dev/null @@ -1,271 +0,0 @@ -.\" Copyright (c) 1991, 1992 Free Software Foundation -.\" See section COPYING for conditions for redistribution -.TH as 1 "21 January 1992" "cygnus support" "GNU Development Tools" - -.SH NAME -GNU as\-\-the portable GNU assembler. - -.SH SYNOPSIS -.na -.B as -.RB "[\|" \-a "\||\|" \-al "\||\|" -as\c -\&\|] -.RB "[\|" \-D "\|]" -.RB "[\|" \-f "\|]" -.RB "[\|" \-I -.I path\c -\&\|] -.RB "[\|" \-K "\|]" -.RB "[\|" \-L "\|]" -.RB "[\|" \-o -.I objfile\c -\&\|] -.RB "[\|" \-R "\|]" -.RB "[\|" \-v "\|]" -.RB "[\|" \-w "\|]" -.RB "[\|" \-\^\- "\ |\ " \c -.I files\c -\&\|.\|.\|.\|] - -.I i960-only options: -.br -.RB "[\|" \-ACA "\||\|" \-ACA_A "\||\|" \-ACB\c -.RB "\||\|" \-ACC "\||\|" \-AKA "\||\|" \-AKB\c -.RB "\||\|" \-AKC "\||\|" \-AMC "\|]" -.RB "[\|" \-b "\|]" -.RB "[\|" \-norelax "\|]" - -.I m680x0-only options: -.br -.RB "[\|" \-l "\|]" -.RB "[\|" \-mc68000 "\||\|" \-mc68010 "\||\|" \-mc68020 "\|]" -.ad b - -.SH DESCRIPTION -GNU \c -.B as\c -\& is really a family of assemblers. -If you use (or have used) the GNU assembler on one architecture, you -should find a fairly similar environment when you use it on another -architecture. Each version has much in common with the others, -including object file formats, most assembler directives (often called -\c -.I pseudo-ops)\c -\& and assembler syntax. - -For information on the syntax and pseudo-ops used by GNU \c -.B as\c -\&, see `\|\c -.B as\c -\|' entry in \c -.B info \c -(or the manual \c -.I -.I -Using as: The GNU Assembler\c -\&). - -\c -.B as\c -\& is primarily intended to assemble the output of the GNU C -compiler \c -.B gcc\c -\& for use by the linker \c -.B ld\c -\&. Nevertheless, -we've tried to make \c -.B as\c -\& assemble correctly everything that the native -assembler would. -This doesn't mean \c -.B as\c -\& always uses the same syntax as another -assembler for the same architecture; for example, we know of several -incompatible versions of 680x0 assembly language syntax. - -Each time you run \c -.B as\c -\& it assembles exactly one source -program. The source program is made up of one or more files. -(The standard input is also a file.) - -If \c -.B as\c -\& is given no file names it attempts to read one input file -from the \c -.B as\c -\& standard input, which is normally your terminal. You -may have to type \c -.B ctl-D\c -\& to tell \c -.B as\c -\& there is no more program -to assemble. Use `\|\c -.B \-\^\-\c -\|' if you need to explicitly name the standard input file -in your command line. - -.B as\c -\& may write warnings and error messages to the standard error -file (usually your terminal). This should not happen when \c -.B as\c -\& is -run automatically by a compiler. Warnings report an assumption made so -that \c -.B as\c -\& could keep assembling a flawed program; errors report a -grave problem that stops the assembly. - -.SH OPTIONS -.TP -.BR \-a \||\| \-al \||\| \-as -Turn on assembly listings; `\|\c -.B \-al\c -\&\|', listing only, `\|\c -.B \-as\c -\&\|', symbols -only, `\|\c -.B \-a\c -\&\|', everything. -.TP -.B \-D -This option is accepted only for script compatibility with calls to -other assemblers; it has no effect on \c -.B as\c -\&. -.TP -.B \-f -``fast''--skip preprocessing (assume source is compiler output). -.TP -.BI "\-I\ " path -Add -.I path -to the search list for -.B .include -directives. -.TP -.B \-K -Issue warnings when difference tables altered for long displacements. -.TP -.B \-L -Keep (in symbol table) local symbols, starting with `\|\c -.B L\c -\|' -.TP -.BI "\-o\ " objfile -Name the object-file output from \c -.B as -.TP -.B \-R -Fold data section into text section -.TP -.B \-v -Announce \c -.B as\c -\& version -.TP -.B \-W -Suppress warning messages -.TP -.IR "\-\^\-" "\ |\ " "files\|.\|.\|." -Source files to assemble, or standard input (\c -.BR "\-\^\-" ")" -.TP -.BI \-A var -.I -(When configured for Intel 960.) -Specify which variant of the 960 architecture is the target. -.TP -.B \-b -.I -(When configured for Intel 960.) -Add code to collect statistics about branches taken. -.TP -.B \-norelax -.I -(When configured for Intel 960.) -Do not alter compare-and-branch instructions for long displacements; -error if necessary. -.TP -.B \-l -.I -(When configured for Motorola 68000). -.br -Shorten references to undefined symbols, to one word instead of two. -.TP -.BR "\-mc68000" "\||\|" "\-mc68010" "\||\|" "\-mc68020" -.I -(When configured for Motorola 68000). -.br -Specify what processor in the 68000 family is the target (default 68020) - -.PP -Options may be in any order, and may be -before, after, or between file names. The order of file names is -significant. - -`\|\c -.B \-\^\-\c -\|' (two hyphens) by itself names the standard input file -explicitly, as one of the files for \c -.B as\c -\& to assemble. - -Except for `\|\c -.B \-\^\-\c -\|' any command line argument that begins with a -hyphen (`\|\c -.B \-\c -\|') is an option. Each option changes the behavior of -\c -.B as\c -\&. No option changes the way another option works. An -option is a `\|\c -.B \-\c -\|' followed by one or more letters; the case of -the letter is important. All options are optional. - -The `\|\c -.B \-o\c -\|' option expects exactly one file name to follow. The file -name may either immediately follow the option's letter (compatible -with older assemblers) or it may be the next command argument (GNU -standard). - -These two command lines are equivalent: -.br -.B -as\ \ \-o\ \ my\-object\-file.o\ \ mumble.s -.br -.B -as\ \ \-omy\-object\-file.o\ \ mumble.s - -.SH "SEE ALSO" -.RB "`\|" as "\|'" -entry in -.B -info\c -\&; -.I -Using as: The GNU Assembler\c -\&; -.BR gcc "(" 1 ")," -.BR ld "(" 1 ")." - -.SH COPYING -Copyright (c) 1991, 1992 Free Software Foundation, Inc. -.PP -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. -.PP -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the -entire resulting derived work is distributed under the terms of a -permission notice identical to this one. -.PP -Permission is granted to copy and distribute translations of this -manual into another language, under the above conditions for modified -versions, except that this permission notice may be included in -translations approved by the Free Software Foundation instead of in -the original English. diff --git a/gnu/gas/as.c b/gnu/gas/as.c deleted file mode 100644 index db85525d5c82..000000000000 --- a/gnu/gas/as.c +++ /dev/null @@ -1,324 +0,0 @@ -/*- - * This code is derived from software copyrighted by the Free Software - * Foundation. - * - * Modified 1991 by Donn Seeley at UUNET Technologies, Inc. - */ - -#ifndef lint -static char sccsid[] = "@(#)as.c 6.3 (Berkeley) 5/8/91"; -#endif /* not lint */ - -/* as.c - GAS main program. - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - * Main program for AS; a 32-bit assembler of GNU. - * Understands command arguments. - * Has a few routines that don't fit in other modules because they - * are shared. - * - * - * bugs - * - * : initialisers - * Since no-one else says they will support them in future: I - * don't support them now. - * - */ - -#ifdef _POSIX_SOURCE -#include <sys/types.h> /* For pid_t in signal.h */ -#endif -#include <signal.h> - -#define COMMON -#include "as.h" -#include "struc-symbol.h" -#include "write.h" - /* Warning! This may have some slightly strange side effects - if you try to compile two or more assemblers in the same - directory! - */ - -#ifndef SIGTY -#define SIGTY int -#endif - -SIGTY got_sig(); - -#ifdef DONTDEF -static char * gdb_symbol_file_name; -long int gdb_begin(); -#endif - -char *myname; /* argv[0] */ -extern char version_string[]; - -main(argc,argv) -int argc; -char **argv; -{ - int work_argc; /* variable copy of argc */ - char **work_argv; /* variable copy of argv */ - char *arg; /* an arg to program */ - char a; /* an arg flag (after -) */ - static const int sig[] = { SIGHUP, SIGINT, SIGPIPE, SIGTERM, 0}; - - extern int bad_error; /* Did we hit a bad error ? */ - - char *stralloc(); /* Make a (safe) copy of a string. */ - void symbol_begin(); - void read_begin(); - void write_object_file(); - - for(a=0;sig[a]!=0;a++) - if(signal(sig[a], SIG_IGN) != SIG_IGN) - signal(sig[a], got_sig); - - myname=argv[0]; - bzero (flagseen, sizeof(flagseen)); /* aint seen nothing yet */ - out_file_name = "a.out"; /* default .o file */ - symbol_begin(); /* symbols.c */ - subsegs_begin(); /* subsegs.c */ - read_begin(); /* read.c */ - md_begin(); /* MACHINE.c */ - input_scrub_begin(); /* input_scrub.c */ -#ifdef DONTDEF - gdb_symbol_file_name = 0; -#endif - /* - * Parse arguments, but we are only interested in flags. - * When we find a flag, we process it then make it's argv[] NULL. - * This helps any future argv[] scanners avoid what we processed. - * Since it is easy to do here we interpret the special arg "-" - * to mean "use stdin" and we set that argv[] pointing to "". - * After we have munged argv[], the only things left are source file - * name(s) and ""(s) denoting stdin. These file names are used - * (perhaps more than once) later. - */ - work_argc = argc-1; /* don't count argv[0] */ - work_argv = argv+1; /* skip argv[0] */ - for (;work_argc--;work_argv++) { - arg = * work_argv; /* work_argv points to this argument */ - - if (*arg!='-') /* Filename. We need it later. */ - continue; /* Keep scanning args looking for flags. */ - if (arg[1] == '-' && arg[2] == 0) { - /* "--" as an argument means read STDIN */ - /* on this scan, we don't want to think about filenames */ - * work_argv = ""; /* Code that means 'use stdin'. */ - continue; - } - /* This better be a switch. */ - arg ++; /* -> letter. */ - - while (a = * arg) {/* scan all the 1-char flags */ - arg ++; /* arg -> after letter. */ - a &= 0x7F; /* ascii only please */ - if (flagseen[a]) - as_warn("%s: Flag option -%c has already been seen!",myname,a); - flagseen[a] = TRUE; - switch (a) { - case 'f': - break; /* -f means fast - no need for "app" preprocessor. */ - - case 'D': - /* DEBUG is implemented: it debugs different */ - /* things to other people's assemblers. */ - break; - -#ifdef DONTDEF - case 'G': /* GNU AS switch: include gdbsyms. */ - if (*arg) /* Rest of argument is file-name. */ - gdb_symbol_file_name = stralloc (arg); - else if (work_argc) { /* Next argument is file-name. */ - work_argc --; - * work_argv = NULL; /* Not a source file-name. */ - gdb_symbol_file_name = * ++ work_argv; - } else - as_warn( "%s: I expected a filename after -G",myname); - arg = ""; /* Finished with this arg. */ - break; -#endif - -#ifndef WORKING_DOT_WORD - case 'k': - break; -#endif - - case 'L': /* -L means keep L* symbols */ - break; - - case 'o': - if (*arg) /* Rest of argument is object file-name. */ - out_file_name = stralloc (arg); - else if (work_argc) { /* Want next arg for a file-name. */ - * work_argv = NULL; /* This is not a file-name. */ - work_argc--; - out_file_name = * ++ work_argv; - } else - as_warn("%s: I expected a filename after -o. \"%s\" assumed.",myname,out_file_name); - arg = ""; /* Finished with this arg. */ - break; - - case 'R': - /* -R means put data into text segment */ - break; - - case 'v': -#ifdef VMS - { - extern char *compiler_version_string; - compiler_version_string = arg; - } -#else /* not VMS */ - fprintf(stderr,version_string); - if(*arg && strcmp(arg,"ersion")) - as_warn("Unknown -v option ignored"); -#endif - while(*arg) arg++; /* Skip the rest */ - break; - - case 'W': - /* -W means don't warn about things */ - break; - - case 'g': - /* - * -g asks gas to produce gdb/dbx line number - * and file name stabs so that an assembly - * file can be handled by a source debugger. - */ - break; - - default: - --arg; - if(md_parse_option(&arg,&work_argc,&work_argv)==0) - as_warn("%s: I don't understand '%c' flag!",myname,a); - if(arg && *arg) - arg++; - break; - } - } - /* - * We have just processed a "-..." arg, which was not a - * file-name. Smash it so the - * things that look for filenames won't ever see it. - * - * Whatever work_argv points to, it has already been used - * as part of a flag, so DON'T re-use it as a filename. - */ - *work_argv = NULL; /* NULL means 'not a file-name' */ - } -#ifdef DONTDEF - if (gdb_begin(gdb_symbol_file_name) == 0) - flagseen ['G'] = 0; /* Don't do any gdbsym stuff. */ -#endif - /* Here with flags set up in flagseen[]. */ - perform_an_assembly_pass(argc,argv); /* Assemble it. */ - if (seen_at_least_1_file() && !bad_error) - write_object_file();/* relax() addresses then emit object file */ - input_scrub_end(); - md_end(); /* MACHINE.c */ -#ifndef VMS - exit(bad_error); /* WIN */ -#else /* VMS */ - exit(!bad_error); /* WIN */ -#endif /* VMS */ -} - - -/* perform_an_assembly_pass() - * - * Here to attempt 1 pass over each input file. - * We scan argv[*] looking for filenames or exactly "" which is - * shorthand for stdin. Any argv that is NULL is not a file-name. - * We set need_pass_2 TRUE if, after this, we still have unresolved - * expressions of the form (unknown value)+-(unknown value). - * - * Note the un*x semantics: there is only 1 logical input file, but it - * may be a catenation of many 'physical' input files. - */ -perform_an_assembly_pass (argc, argv) -int argc; -char ** argv; -{ - char * buffer; /* Where each bufferful of lines will start. */ - void read_a_source_file(); - int saw_a_file = 0; - - text_fix_root = NULL; - data_fix_root = NULL; - need_pass_2 = FALSE; - - argv++; /* skip argv[0] */ - argc--; /* skip argv[0] */ - while (argc--) { - if (*argv) { /* Is it a file-name argument? */ - /* argv -> "" if stdin desired, else -> filename */ - if (buffer = input_scrub_new_file (*argv) ) { - saw_a_file++; - read_a_source_file(buffer); - } - } - argv++; /* completed that argv */ - } - if(!saw_a_file) - if(buffer = input_scrub_new_file("") ) - read_a_source_file(buffer); -} - -/* - * stralloc() - * - * Allocate memory for a new copy of a string. Copy the string. - * Return the address of the new string. Die if there is any error. - */ - -char * -stralloc (str) -char * str; -{ - register char * retval; - register long int len; - - len = strlen (str) + 1; - retval = xmalloc (len); - (void)strcpy (retval, str); - return (retval); -} - -lose() -{ - as_fatal( "%s: 2nd pass not implemented - get your code from random(3)",myname ); -} - -SIGTY -got_sig(sig) -int sig; -{ - static here_before = 0; - - as_bad("Interrupted by signal %d",sig); - if(here_before++) - exit(1); -} - -/* end: as.c */ diff --git a/gnu/gas/as.h b/gnu/gas/as.h deleted file mode 100644 index 8de405257b5d..000000000000 --- a/gnu/gas/as.h +++ /dev/null @@ -1,292 +0,0 @@ -/* as.h - global header file - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifndef asH -#define asH /* Don't declare things twice. */ - -#if !defined(__STDC__) && !defined(const) -#define const /* ignore */ -#endif - -#ifdef USG -#define index strchr -#define bzero(s,n) memset((s),0,(n)) -#define bcopy(from,to,n) memcpy((to),(from),(n)) -#define setbuffer(a,b,c) -#endif - -/* - * CAPITALISED names are #defined. - * "lowercaseH" is #defined if "lowercase.h" has been #include-d. - * "lowercaseT" is a typedef of "lowercase" objects. - * "lowercaseP" is type "pointer to object of type 'lowercase'". - * "lowercaseS" is typedef struct ... lowercaseS. - * - * #define SUSPECT when debugging. - * #define DUMP to include data-structure dumpers. - * #define COMMON as "extern" for all modules except one, where you #define - * COMMON as "". - * If TEST is #defined, then we are testing a module: #define COMMON as "". - */ - - - -/* These #defines are for parameters of entire assembler. */ - -/* #define SUSPECT JF remove for speed testing */ -/* #define DUMP */ -#define NDEBUG /* JF disable asserts */ -/* These #includes are for type definitions etc. */ - -/* #include "style.h" */ -#include <stdio.h> -#include <assert.h> -#define obstack_chunk_alloc xmalloc -#define obstack_chunk_free xfree - -/* These defines are potentially useful */ -#define FALSE (0) -#define TRUE (!FALSE) -#define ASSERT assert -#define BAD_CASE(value) \ -{ \ - as_fatal ("Case value %d unexpected at line %d of file \"%s\"\n", \ - value, __LINE__, __FILE__); \ -} - - - - -/* These are assembler-wide concepts */ - - -#ifndef COMMON -#ifdef TEST -#define COMMON /* declare our COMMONs storage here. */ -#else -#define COMMON extern /* our commons live elswhere */ -#endif -#endif - /* COMMON now defined */ - -#ifdef SUSPECT -#define register /* no registers: helps debugging */ -#define know(p) ASSERT(p) /* know() is less ugly than #ifdef SUSPECT/ */ - /* assert()/#endif. */ -#else -#define know(p) /* know() checks are no-op.ed */ -#endif /* #ifdef SUSPECT */ - - -char *xmalloc(); /* keep C compilers happy */ -char *xrealloc(); /* " */ -void free(); /* " */ -#define xfree free - -/* input_scrub.c */ - -/* - * Supplies sanitised buffers to read.c. - * Also understands printing line-number part of error messages. - */ - - /* Line number things. */ -int seen_at_least_1_file(); -void bump_line_counters(); -void new_logical_line(); -void as_where(); -void as_perror(); -void as_howmuch(); - /* Sanitising things. */ -void input_scrub_begin(); -void input_scrub_end(); -char *input_scrub_new_file(); -char *input_scrub_next_buffer(); - -/* subsegs.c Sub-segments. Also, segment(=expression type)s.*/ - -/* - * This table describes the use of segments as EXPRESSION types. - * - * X_seg X_add_symbol X_subtract_symbol X_add_number - * SEG_NONE no (legal) expression - * SEG_PASS1 no (defined) " - * SEG_BIG * > 32 bits const. - * SEG_ABSOLUTE 0 - * SEG_DATA * 0 - * SEG_TEXT * 0 - * SEG_BSS * 0 - * SEG_UNKNOWN * 0 - * SEG_DIFFERENCE 0 * 0 - * - * The blank fields MUST be 0, and are nugatory. - * The '0' fields MAY be 0. The '*' fields MAY NOT be 0. - * - * SEG_BIG: X_add_number is < 0 if the result is in - * generic_floating_point_number. The value is -'c' where c is the - * character that introduced the constant. e.g. "0f6.9" will have -'f' - * as a X_add_number value. - * X_add_number > 0 is a count of how many littlenums it took to - * represent a bignum. - * SEG_DIFFERENCE: - * If segments of both symbols are known, they are the same segment. - * X_add_symbol != X_sub_symbol (then we just cancel them, => SEG_ABSOLUTE). - */ - -typedef enum -{ - SEG_ABSOLUTE, - SEG_TEXT, - SEG_DATA, - SEG_BSS, - SEG_UNKNOWN, - SEG_NONE, /* Mythical Segment: NO expression seen. */ - SEG_PASS1, /* Mythical Segment: Need another pass. */ - SEG_GOOF, /* Only happens if AS has a logic error. */ - /* Invented so we don't crash printing */ - /* error message involving weird segment. */ - SEG_BIG, /* Bigger than 32 bits constant. */ - SEG_DIFFERENCE /* Mythical Segment: absolute difference. */ -} segT; -#define SEG_MAXIMUM_ORDINAL (SEG_DIFFERENCE) - -typedef unsigned char subsegT; - -COMMON subsegT now_subseg; - /* What subseg we are accreting now? */ - - -COMMON segT now_seg; - /* Segment our instructions emit to. */ - /* Only OK values are SEG_TEXT or SEG_DATA. */ - - -extern char *const seg_name[]; -extern const int seg_N_TYPE[]; -extern const segT N_TYPE_seg[]; -void subsegs_begin(); -void subseg_change(); -void subseg_new(); - -/* relax() */ - -typedef enum -{ - rs_fill, /* Variable chars to be repeated fr_offset */ - /* times. Fr_symbol unused. */ - /* Used with fr_offset == 0 for a constant */ - /* length frag. */ - - rs_align, /* Align: Fr_offset: power of 2. */ - /* 1 variable char: fill character. */ - rs_org, /* Org: Fr_offset, fr_symbol: address. */ - /* 1 variable char: fill character. */ - - rs_machine_dependent, -#ifndef WORKING_DOT_WORD - rs_broken_word, /* JF: gunpoint */ -#endif -} -relax_stateT; - -/* typedef unsigned char relax_substateT; */ -/* JF this is more likely to leave the end of a struct frag on an align - boundry. Be very careful with this. */ -typedef unsigned long int relax_substateT; - -typedef unsigned long int relax_addressT;/* Enough bits for address. */ - /* Still an integer type. */ - - -/* frags.c */ - -/* - * A code fragment (frag) is some known number of chars, followed by some - * unknown number of chars. Typically the unknown number of chars is an - * instruction address whose size is yet unknown. We always know the greatest - * possible size the unknown number of chars may become, and reserve that - * much room at the end of the frag. - * Once created, frags do not change address during assembly. - * We chain the frags in (a) forward-linked list(s). The object-file address - * of the 1st char of a frag is generally not known until after relax(). - * Many things at assembly time describe an address by {object-file-address - * of a particular frag}+offset. - - BUG: it may be smarter to have a single pointer off to various different -notes for different frag kinds. See how code pans out. - - - */ -struct frag /* a code fragment */ -{ - long unsigned int fr_address; /* Object file address. */ - struct frag *fr_next; /* Chain forward; ascending address order. */ - /* Rooted in frch_root. */ - - long int fr_fix; /* (Fixed) number of chars we know we have. */ - /* May be 0. */ - long int fr_var; /* (Variable) number of chars after above. */ - /* May be 0. */ - struct symbol *fr_symbol; /* For variable-length tail. */ - long int fr_offset; /* For variable-length tail. */ - char *fr_opcode; /*->opcode low addr byte,for relax()ation*/ - relax_stateT fr_type; /* What state is my tail in? */ - relax_substateT fr_subtype; - /* These are needed only on the NS32K machines */ - char fr_pcrel_adjust; - char fr_bsr; - char fr_literal [1]; /* Chars begin here. */ - /* One day we will compile fr_literal[0]. */ -}; -#define SIZEOF_STRUCT_FRAG \ - ((int)zero_address_frag.fr_literal-(int)&zero_address_frag) - /* We want to say fr_literal[0] above. */ - -typedef struct frag fragS; - -COMMON fragS * frag_now; /* -> current frag we are building. */ - /* This frag is incomplete. */ - /* It is, however, included in frchain_now. */ - /* Frag_now->fr_fix is bogus. Use: */ -/* Virtual frag_now->fr_fix==obstack_next_free(&frags)-frag_now->fr_literal.*/ - -COMMON fragS zero_address_frag; /* For foreign-segment symbol fixups. */ -COMMON fragS bss_address_frag; /* For local common (N_BSS segment) fixups. */ - -void frag_new(); -char * frag_more(); -char * frag_var(); -void frag_wane(); -void frag_align(); - - -/* main program "as.c" (command arguments etc) */ - -COMMON char -flagseen[128]; /* ['x'] TRUE if "-x" seen. */ - -COMMON char * -out_file_name; /* name of emitted object file */ - -COMMON int need_pass_2; /* TRUE if we need a second pass. */ - - -#endif /* #ifdef asH */ - -/* end: as.h */ diff --git a/gnu/gas/atof-generic.c b/gnu/gas/atof-generic.c deleted file mode 100644 index 497541079af3..000000000000 --- a/gnu/gas/atof-generic.c +++ /dev/null @@ -1,526 +0,0 @@ -/* atof_generic.c - turn a string of digits into a Flonum - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include <ctype.h> -#include "flonum.h" -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else -#ifdef sparc -#include <alloca.h> -#endif -#endif - -#ifdef USG -#define bzero(s,n) memset(s,0,n) -#define index strchr -#endif - -#define FALSE (0) -#define TRUE (1) - -char *index(); - -/***********************************************************************\ -* * -* Given a string of decimal digits , with optional decimal * -* mark and optional decimal exponent (place value) of the * -* lowest_order decimal digit: produce a floating point * -* number. The number is 'generic' floating point: our * -* caller will encode it for a specific machine architecture. * -* * -* Assumptions * -* uses base (radix) 2 * -* this machine uses 2's complement binary integers * -* target flonums use " " " " * -* target flonums exponents fit in a long int * -* * -\***********************************************************************/ - -/* - - Syntax: - -<flonum> ::= <optional-sign> <decimal-number> <optional-exponent> -<optional-sign> ::= '+' | '-' | {empty} -<decimal-number> ::= <integer> - | <integer> <radix-character> - | <integer> <radix-character> <integer> - | <radix-character> <integer> -<optional-exponent> ::= {empty} | <exponent-character> <optional-sign> <integer> -<integer> ::= <digit> | <digit> <integer> -<digit> ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' -<exponent-character> ::= {one character from "string_of_decimal_exponent_marks"} -<radix-character> ::= {one character from "string_of_decimal_marks"} - -*/ - -int /* 0 if OK */ - -atof_generic ( - address_of_string_pointer, /* return pointer to just AFTER number we read. */ - string_of_decimal_marks, /* At most one per number. */ - string_of_decimal_exponent_marks, - address_of_generic_floating_point_number) - - char * * address_of_string_pointer; - const char * string_of_decimal_marks; - const char * string_of_decimal_exponent_marks; - FLONUM_TYPE * address_of_generic_floating_point_number; - -{ - - int return_value; /* 0 means OK. */ - char * first_digit; - /* char * last_digit; JF unused */ - int number_of_digits_before_decimal; - int number_of_digits_after_decimal; - long int decimal_exponent; - int number_of_digits_available; - char digits_sign_char; - - { - /* - * Scan the input string, abstracting (1)digits (2)decimal mark (3) exponent. - * It would be simpler to modify the string, but we don't; just to be nice - * to caller. - * We need to know how many digits we have, so we can allocate space for - * the digits' value. - */ - - char * p; - char c; - int seen_significant_digit; - - first_digit = * address_of_string_pointer; - c= *first_digit; - if (c=='-' || c=='+') - { - digits_sign_char = c; - first_digit ++; - } - else - digits_sign_char = '+'; - - if( (first_digit[0]=='n' || first_digit[0]=='N') - && (first_digit[1]=='a' || first_digit[1]=='A') - && (first_digit[2]=='n' || first_digit[2]=='N')) { - address_of_generic_floating_point_number->sign=0; - address_of_generic_floating_point_number->exponent=0; - address_of_generic_floating_point_number->leader=address_of_generic_floating_point_number->low; - (*address_of_string_pointer)=first_digit+3; - return 0; - } - if( (first_digit[0]=='i' || first_digit[0]=='I') - && (first_digit[1]=='n' || first_digit[1]=='N') - && (first_digit[2]=='f' || first_digit[2]=='F')) { - address_of_generic_floating_point_number->sign= digits_sign_char=='+' ? 'P' : 'N'; - address_of_generic_floating_point_number->exponent=0; - address_of_generic_floating_point_number->leader=address_of_generic_floating_point_number->low; - if( (first_digit[3]=='i' || first_digit[3]=='I') - && (first_digit[4]=='n' || first_digit[4]=='N') - && (first_digit[5]=='i' || first_digit[5]=='I') - && (first_digit[6]=='t' || first_digit[6]=='T') - && (first_digit[7]=='y' || first_digit[7]=='Y')) - (*address_of_string_pointer)=first_digit+8; - else - (*address_of_string_pointer)=first_digit+3; - return 0; - } - - number_of_digits_before_decimal = 0; - number_of_digits_after_decimal = 0; - decimal_exponent = 0; - seen_significant_digit = FALSE; - for (p = first_digit; - (c = * p) - && (!c || ! index (string_of_decimal_marks, c) ) - && (!c || ! index (string_of_decimal_exponent_marks, c) ); - p ++) - { - if (isdigit(c)) - { - if (seen_significant_digit || c > '0') - { - number_of_digits_before_decimal ++; - seen_significant_digit = TRUE; - } - else - { - first_digit++; - } - } - else - { - break; /* p -> char after pre-decimal digits. */ - } - } /* For each digit before decimal mark. */ - if (c && index (string_of_decimal_marks, c)) - { - for (p ++; - (c = * p) - && (!c || ! index (string_of_decimal_exponent_marks, c) ); - p ++) - { - if (isdigit(c)) - { - number_of_digits_after_decimal ++; /* This may be retracted below. */ - if (/* seen_significant_digit || */ c > '0') - { - seen_significant_digit = TRUE; - } - } - else - { - if ( ! seen_significant_digit) - { - number_of_digits_after_decimal = 0; - } - break; - } - } /* For each digit after decimal mark. */ - } - while(number_of_digits_after_decimal && first_digit[number_of_digits_before_decimal+number_of_digits_after_decimal]=='0') - --number_of_digits_after_decimal; -/* last_digit = p; JF unused */ - - if (c && index (string_of_decimal_exponent_marks, c) ) - { - char digits_exponent_sign_char; - - c = * ++ p; - if (c && index ("+-",c)) - { - digits_exponent_sign_char = c; - c = * ++ p; - } - else - { - digits_exponent_sign_char = '+'; - } - for (; - (c); - c = * ++ p) - { - if (isdigit(c)) - { - decimal_exponent = decimal_exponent * 10 + c - '0'; - /* - * BUG! If we overflow here, we lose! - */ - } - else - { - break; - } - } - if (digits_exponent_sign_char == '-') - { - decimal_exponent = - decimal_exponent; - } - } - * address_of_string_pointer = p; - } - - number_of_digits_available = - number_of_digits_before_decimal - + number_of_digits_after_decimal; - return_value = 0; - if (number_of_digits_available == 0) - { - address_of_generic_floating_point_number -> exponent = 0; /* Not strictly necessary */ - address_of_generic_floating_point_number -> leader - = -1 + address_of_generic_floating_point_number -> low; - address_of_generic_floating_point_number -> sign = digits_sign_char; - /* We have just concocted (+/-)0.0E0 */ - } - else - { - LITTLENUM_TYPE * digits_binary_low; - int precision; - int maximum_useful_digits; - int number_of_digits_to_use; - int more_than_enough_bits_for_digits; - int more_than_enough_littlenums_for_digits; - int size_of_digits_in_littlenums; - int size_of_digits_in_chars; - FLONUM_TYPE power_of_10_flonum; - FLONUM_TYPE digits_flonum; - - - precision = (address_of_generic_floating_point_number -> high - - address_of_generic_floating_point_number -> low - + 1 - ); /* Number of destination littlenums. */ - /* Includes guard bits (two littlenums worth) */ - maximum_useful_digits = ( ((double) (precision - 2)) - * ((double) (LITTLENUM_NUMBER_OF_BITS)) - / (LOG_TO_BASE_2_OF_10) - ) - + 2; /* 2 :: guard digits. */ - if (number_of_digits_available > maximum_useful_digits) - { - number_of_digits_to_use = maximum_useful_digits; - } - else - { - number_of_digits_to_use = number_of_digits_available; - } - decimal_exponent += number_of_digits_before_decimal - number_of_digits_to_use; - - more_than_enough_bits_for_digits - = ((((double)number_of_digits_to_use) * LOG_TO_BASE_2_OF_10) + 1); - more_than_enough_littlenums_for_digits - = ( more_than_enough_bits_for_digits - / LITTLENUM_NUMBER_OF_BITS - ) - + 2; - - /* - * Compute (digits) part. In "12.34E56" this is the "1234" part. - * Arithmetic is exact here. If no digits are supplied then - * this part is a 0 valued binary integer. - * Allocate room to build up the binary number as littlenums. - * We want this memory to disappear when we leave this function. - * Assume no alignment problems => (room for n objects) == - * n * (room for 1 object). - */ - - size_of_digits_in_littlenums = more_than_enough_littlenums_for_digits; - size_of_digits_in_chars = size_of_digits_in_littlenums - * sizeof( LITTLENUM_TYPE ); - digits_binary_low = (LITTLENUM_TYPE *) - alloca (size_of_digits_in_chars); - bzero ((char *)digits_binary_low, size_of_digits_in_chars); - - /* Digits_binary_low[] is allocated and zeroed. */ - - { - /* - * Parse the decimal digits as if * digits_low was in the units position. - * Emit a binary number into digits_binary_low[]. - * - * Use a large-precision version of: - * (((1st-digit) * 10 + 2nd-digit) * 10 + 3rd-digit ...) * 10 + last-digit - */ - - char * p; - char c; - int count; /* Number of useful digits left to scan. */ - - for (p = first_digit, count = number_of_digits_to_use; - count; - p ++, -- count) - { - c = * p; - if (isdigit(c)) - { - /* - * Multiply by 10. Assume can never overflow. - * Add this digit to digits_binary_low[]. - */ - - long int carry; - LITTLENUM_TYPE * littlenum_pointer; - LITTLENUM_TYPE * littlenum_limit; - - littlenum_limit - = digits_binary_low - + more_than_enough_littlenums_for_digits - - 1; - carry = c - '0'; /* char -> binary */ - for (littlenum_pointer = digits_binary_low; - littlenum_pointer <= littlenum_limit; - littlenum_pointer ++) - { - long int work; - - work = carry + 10 * (long)(*littlenum_pointer); - * littlenum_pointer = work & LITTLENUM_MASK; - carry = work >> LITTLENUM_NUMBER_OF_BITS; - } - if (carry != 0) - { - /* - * We have a GROSS internal error. - * This should never happen. - */ - abort(); /* RMS prefers abort() to any message. */ - } - } - else - { - ++ count; /* '.' doesn't alter digits used count. */ - } /* if valid digit */ - } /* for each digit */ - } - - /* - * Digits_binary_low[] properly encodes the value of the digits. - * Forget about any high-order littlenums that are 0. - */ - while (digits_binary_low [size_of_digits_in_littlenums - 1] == 0 - && size_of_digits_in_littlenums >= 2) - size_of_digits_in_littlenums --; - - digits_flonum . low = digits_binary_low; - digits_flonum . high = digits_binary_low + size_of_digits_in_littlenums - 1; - digits_flonum . leader = digits_flonum . high; - digits_flonum . exponent = 0; - /* - * The value of digits_flonum . sign should not be important. - * We have already decided the output's sign. - * We trust that the sign won't influence the other parts of the number! - * So we give it a value for these reasons: - * (1) courtesy to humans reading/debugging - * these numbers so they don't get excited about strange values - * (2) in future there may be more meaning attached to sign, - * and what was - * harmless noise may become disruptive, ill-conditioned (or worse) - * input. - */ - digits_flonum . sign = '+'; - - { - /* - * Compute the mantssa (& exponent) of the power of 10. - * If sucessful, then multiply the power of 10 by the digits - * giving return_binary_mantissa and return_binary_exponent. - */ - - LITTLENUM_TYPE *power_binary_low; - int decimal_exponent_is_negative; - /* This refers to the "-56" in "12.34E-56". */ - /* FALSE: decimal_exponent is positive (or 0) */ - /* TRUE: decimal_exponent is negative */ - FLONUM_TYPE temporary_flonum; - LITTLENUM_TYPE *temporary_binary_low; - int size_of_power_in_littlenums; - int size_of_power_in_chars; - - size_of_power_in_littlenums = precision; -/* Precision has a built-in fudge factor so we get a few guard bits. */ - - - decimal_exponent_is_negative = decimal_exponent < 0; - if (decimal_exponent_is_negative) - { - decimal_exponent = - decimal_exponent; - } - /* From now on: the decimal exponent is > 0. Its sign is seperate. */ - - size_of_power_in_chars - = size_of_power_in_littlenums - * sizeof( LITTLENUM_TYPE ) + 2; - power_binary_low = (LITTLENUM_TYPE *) alloca ( size_of_power_in_chars ); - temporary_binary_low = (LITTLENUM_TYPE *) alloca ( size_of_power_in_chars ); - bzero ((char *)power_binary_low, size_of_power_in_chars); - * power_binary_low = 1; - power_of_10_flonum . exponent = 0; - power_of_10_flonum . low = power_binary_low; - power_of_10_flonum . leader = power_binary_low; - power_of_10_flonum . high = power_binary_low + size_of_power_in_littlenums - 1; - power_of_10_flonum . sign = '+'; - temporary_flonum . low = temporary_binary_low; - temporary_flonum . high = temporary_binary_low + size_of_power_in_littlenums - 1; - /* - * (power) == 1. - * Space for temporary_flonum allocated. - */ - - /* - * ... - * - * WHILE more bits - * DO find next bit (with place value) - * multiply into power mantissa - * OD - */ - { - int place_number_limit; - /* Any 10^(2^n) whose "n" exceeds this */ - /* value will fall off the end of */ - /* flonum_XXXX_powers_of_ten[]. */ - int place_number; - const FLONUM_TYPE * multiplicand; /* -> 10^(2^n) */ - - place_number_limit = table_size_of_flonum_powers_of_ten; - multiplicand - = ( decimal_exponent_is_negative - ? flonum_negative_powers_of_ten - : flonum_positive_powers_of_ten); - for (place_number = 1; /* Place value of this bit of exponent. */ - decimal_exponent; /* Quit when no more 1 bits in exponent. */ - decimal_exponent >>= 1 - , place_number ++) - { - if (decimal_exponent & 1) - { - if (place_number > place_number_limit) - { - /* - * The decimal exponent has a magnitude so great that - * our tables can't help us fragment it. Although this - * routine is in error because it can't imagine a - * number that big, signal an error as if it is the - * user's fault for presenting such a big number. - */ - return_value = ERROR_EXPONENT_OVERFLOW; - /* - * quit out of loop gracefully - */ - decimal_exponent = 0; - } - else - { -#ifdef TRACE -printf("before multiply, place_number = %d., power_of_10_flonum:\n", place_number); -flonum_print( & power_of_10_flonum ); -(void)putchar('\n'); -#endif - flonum_multip (multiplicand + place_number, & power_of_10_flonum, & temporary_flonum); - flonum_copy (& temporary_flonum, & power_of_10_flonum); - } /* If this bit of decimal_exponent was computable.*/ - } /* If this bit of decimal_exponent was set. */ - } /* For each bit of binary representation of exponent */ -#ifdef TRACE -printf( " after computing power_of_10_flonum: " ); -flonum_print( & power_of_10_flonum ); -(void)putchar('\n'); -#endif - } - - } - - /* - * power_of_10_flonum is power of ten in binary (mantissa) , (exponent). - * It may be the number 1, in which case we don't NEED to multiply. - * - * Multiply (decimal digits) by power_of_10_flonum. - */ - - flonum_multip (& power_of_10_flonum, & digits_flonum, address_of_generic_floating_point_number); - /* Assert sign of the number we made is '+'. */ - address_of_generic_floating_point_number -> sign = digits_sign_char; - - } /* If we had any significant digits. */ - return (return_value); -} /* atof_generic () */ - -/* end: atof_generic.c */ diff --git a/gnu/gas/bignum-copy.c b/gnu/gas/bignum-copy.c deleted file mode 100644 index 26401213b9ff..000000000000 --- a/gnu/gas/bignum-copy.c +++ /dev/null @@ -1,75 +0,0 @@ -/* bignum_copy.c - copy a bignum - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "bignum.h" - -#ifdef USG -#define bzero(s,n) memset(s,0,n) -#define bcopy(from,to,n) memcpy(to,from,n) -#endif - -/* - * bignum_copy () - * - * Copy a bignum from in to out. - * If the output is shorter than the input, copy lower-order littlenums. - * Return 0 or the number of significant littlenums dropped. - * Assumes littlenum arrays are densely packed: no unused chars between - * the littlenums. Uses bcopy() to move littlenums, and wants to - * know length (in chars) of the input bignum. - */ - -/* void */ -int -bignum_copy (in, in_length, out, out_length) - register LITTLENUM_TYPE * in; - register int in_length; /* in sizeof(littlenum)s */ - register LITTLENUM_TYPE * out; - register int out_length; /* in sizeof(littlenum)s */ -{ - register int significant_littlenums_dropped; - - if (out_length < in_length) - { - register LITTLENUM_TYPE * p; /* -> most significant (non-zero) input littlenum. */ - - bcopy ((char *)in, (char *)out, out_length << LITTLENUM_SHIFT); - for (p = in + in_length - 1; p >= in; -- p) - { - if (* p) break; - } - significant_littlenums_dropped = p - in - in_length + 1; - if (significant_littlenums_dropped < 0) - { - significant_littlenums_dropped = 0; - } - } - else - { - bcopy ((char *)in, (char *)out, in_length << LITTLENUM_SHIFT); - if (out_length > in_length) - { - bzero ((char *)(out + out_length), (out_length - in_length) << LITTLENUM_SHIFT); - } - significant_littlenums_dropped = 0; - } - return (significant_littlenums_dropped); -} - -/* end: bignum_copy.c */ diff --git a/gnu/gas/bignum.h b/gnu/gas/bignum.h deleted file mode 100644 index dbc95a3b6403..000000000000 --- a/gnu/gas/bignum.h +++ /dev/null @@ -1,48 +0,0 @@ -/* bignum.h-arbitrary precision integers - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/***********************************************************************\ -* * -* Arbitrary-precision integer arithmetic. * -* For speed, we work in groups of bits, even though this * -* complicates algorithms. * -* Each group of bits is called a 'littlenum'. * -* A bunch of littlenums representing a (possibly large) * -* integer is called a 'bignum'. * -* Bignums are >= 0. * -* * -\***********************************************************************/ - -#define LITTLENUM_NUMBER_OF_BITS (16) -#define LITTLENUM_RADIX (1 << LITTLENUM_NUMBER_OF_BITS) -#define LITTLENUM_MASK (0xFFFF) -#define LITTLENUM_SHIFT (1) -#define CHARS_PER_LITTLENUM (1 << LITTLENUM_SHIFT) -#ifndef BITS_PER_CHAR -#define BITS_PER_CHAR (8) -#endif - -typedef unsigned short int LITTLENUM_TYPE; - - -/* JF truncated this to get around a problem with GCC */ -#define LOG_TO_BASE_2_OF_10 (3.3219280948873623478703194294893901758651 ) - /* WARNING: I haven't checked that the trailing digits are correct! */ - -/* end: bignum.h */ diff --git a/gnu/gas/config/Makefile.i386 b/gnu/gas/config/Makefile.i386 deleted file mode 100644 index 945246b3d85b..000000000000 --- a/gnu/gas/config/Makefile.i386 +++ /dev/null @@ -1,4 +0,0 @@ -# @(#)Makefile.i386 6.1 (Berkeley) 3/3/91 - -CFLAGS+= -DNON_BROKEN_WORDS -SRCS+= i386.c atof-ieee.c diff --git a/gnu/gas/config/a.out.gnu.h b/gnu/gas/config/a.out.gnu.h deleted file mode 100644 index 71b09a058fab..000000000000 --- a/gnu/gas/config/a.out.gnu.h +++ /dev/null @@ -1,261 +0,0 @@ -#ifndef __A_OUT_GNU_H__ -#define __A_OUT_GNU_H__ - -#define __GNU_EXEC_MACROS__ - -#ifndef __STRUCT_EXEC_OVERRIDE__ - -struct exec -{ - unsigned long a_info; /* Use macros N_MAGIC, etc for access */ - unsigned a_text; /* length of text, in bytes */ - unsigned a_data; /* length of data, in bytes */ - unsigned a_bss; /* length of uninitialized data area for file, in bytes */ - unsigned a_syms; /* length of symbol table data in file, in bytes */ - unsigned a_entry; /* start address */ - unsigned a_trsize; /* length of relocation info for text, in bytes */ - unsigned a_drsize; /* length of relocation info for data, in bytes */ -}; - -#endif /* __STRUCT_EXEC_OVERRIDE__ */ - -/* these go in the N_MACHTYPE field */ -enum machine_type { -#if defined (M_OLDSUN2) - M__OLDSUN2 = M_OLDSUN2, -#else - M_OLDSUN2 = 0, -#endif -#if defined (M_68010) - M__68010 = M_68010, -#else - M_68010 = 1, -#endif -#if defined (M_68020) - M__68020 = M_68020, -#else - M_68020 = 2, -#endif -#if defined (M_SPARC) - M__SPARC = M_SPARC, -#else - M_SPARC = 3, -#endif - /* skip a bunch so we don't run into any of sun's numbers */ - M_386 = 100, -}; - -#if !defined (N_MAGIC) -#define N_MAGIC(exec) ((exec).a_info & 0xffff) -#endif -#define N_MACHTYPE(exec) ((enum machine_type)(((exec).a_info >> 16) & 0xff)) -#define N_FLAGS(exec) (((exec).a_info >> 24) & 0xff) -#define N_SET_INFO(exec, magic, type, flags) \ - ((exec).a_info = ((magic) & 0xffff) \ - | (((int)(type) & 0xff) << 16) \ - | (((flags) & 0xff) << 24)) -#define N_SET_MAGIC(exec, magic) \ - ((exec).a_info = (((exec).a_info & 0xffff0000) | ((magic) & 0xffff))) - -#define N_SET_MACHTYPE(exec, machtype) \ - ((exec).a_info = \ - ((exec).a_info&0xff00ffff) | ((((int)(machtype))&0xff) << 16)) - -#define N_SET_FLAGS(exec, flags) \ - ((exec).a_info = \ - ((exec).a_info&0x00ffffff) | (((flags) & 0xff) << 24)) - -/* Code indicating object file or impure executable. */ -#define OMAGIC 0407 -/* Code indicating pure executable. */ -#define NMAGIC 0410 -/* Code indicating demand-paged executable. */ -#define ZMAGIC 0413 - -#if !defined (N_BADMAG) -#define N_BADMAG(x) \ - (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC \ - && N_MAGIC(x) != ZMAGIC) -#endif - -#define _N_BADMAG(x) \ - (N_MAGIC(x) != OMAGIC && N_MAGIC(x) != NMAGIC \ - && N_MAGIC(x) != ZMAGIC) - -#define _N_HDROFF(x) (1024 - sizeof (struct exec)) - -#if !defined (N_TXTOFF) -#define N_TXTOFF(x) \ - (N_MAGIC(x) == ZMAGIC ? _N_HDROFF((x)) + sizeof (struct exec) : sizeof (struct exec)) -#endif - -#if !defined (N_DATOFF) -#define N_DATOFF(x) (N_TXTOFF(x) + (x).a_text) -#endif - -#if !defined (N_TRELOFF) -#define N_TRELOFF(x) (N_DATOFF(x) + (x).a_data) -#endif - -#if !defined (N_DRELOFF) -#define N_DRELOFF(x) (N_TRELOFF(x) + (x).a_trsize) -#endif - -#if !defined (N_SYMOFF) -#define N_SYMOFF(x) (N_DRELOFF(x) + (x).a_drsize) -#endif - -#if !defined (N_STROFF) -#define N_STROFF(x) (N_SYMOFF(x) + (x).a_syms) -#endif - -/* Address of text segment in memory after it is loaded. */ -#if !defined (N_TXTADDR) -#define N_TXTADDR(x) 0 -#endif - -/* Address of data segment in memory after it is loaded. - Note that it is up to you to define SEGMENT_SIZE - on machines not listed here. */ -#if defined(vax) || defined(hp300) || defined(pyr) -#define SEGMENT_SIZE page_size -#endif -#ifdef sony -#define SEGMENT_SIZE 0x2000 -#endif /* Sony. */ -#ifdef is68k -#define SEGMENT_SIZE 0x20000 -#endif -#if defined(m68k) && defined(PORTAR) -#define PAGE_SIZE 0x400 -#define SEGMENT_SIZE PAGE_SIZE -#endif - -#define _N_SEGMENT_ROUND(x) (((x) + SEGMENT_SIZE - 1) & ~(SEGMENT_SIZE - 1)) - -#define _N_TXTENDADDR(x) (N_TXTADDR(x)+(x).a_text) - -#ifndef N_DATADDR -#define N_DATADDR(x) \ - (N_MAGIC(x)==OMAGIC? (_N_TXTENDADDR(x)) \ - : (_N_SEGMENT_ROUND (_N_TXTENDADDR(x)))) -#endif - -/* Address of bss segment in memory after it is loaded. */ -#if !defined (N_BSSADDR) -#define N_BSSADDR(x) (N_DATADDR(x) + (x).a_data) -#endif - -#if !defined (N_NLIST_DECLARED) -struct nlist { - union { - char *n_name; - struct nlist *n_next; - long n_strx; - } n_un; - unsigned char n_type; - char n_other; - short n_desc; - unsigned long n_value; -}; -#endif /* no N_NLIST_DECLARED. */ - -#if !defined (N_UNDF) -#define N_UNDF 0 -#endif -#if !defined (N_ABS) -#define N_ABS 2 -#endif -#if !defined (N_TEXT) -#define N_TEXT 4 -#endif -#if !defined (N_DATA) -#define N_DATA 6 -#endif -#if !defined (N_BSS) -#define N_BSS 8 -#endif -#if !defined (N_FN) -#define N_FN 15 -#endif - -#if !defined (N_EXT) -#define N_EXT 1 -#endif -#if !defined (N_TYPE) -#define N_TYPE 036 -#endif -#if !defined (N_STAB) -#define N_STAB 0340 -#endif - -/* The following type indicates the definition of a symbol as being - an indirect reference to another symbol. The other symbol - appears as an undefined reference, immediately following this symbol. - - Indirection is asymmetrical. The other symbol's value will be used - to satisfy requests for the indirect symbol, but not vice versa. - If the other symbol does not have a definition, libraries will - be searched to find a definition. */ -#define N_INDR 0xa - -/* The following symbols refer to set elements. - All the N_SET[ATDB] symbols with the same name form one set. - Space is allocated for the set in the text section, and each set - element's value is stored into one word of the space. - The first word of the space is the length of the set (number of elements). - - The address of the set is made into an N_SETV symbol - whose name is the same as the name of the set. - This symbol acts like a N_DATA global symbol - in that it can satisfy undefined external references. */ - -/* These appear as input to LD, in a .o file. */ -#define N_SETA 0x14 /* Absolute set element symbol */ -#define N_SETT 0x16 /* Text set element symbol */ -#define N_SETD 0x18 /* Data set element symbol */ -#define N_SETB 0x1A /* Bss set element symbol */ - -/* This is output from LD. */ -#define N_SETV 0x1C /* Pointer to set vector in data area. */ - -#if !defined (N_RELOCATION_INFO_DECLARED) -/* This structure describes a single relocation to be performed. - The text-relocation section of the file is a vector of these structures, - all of which apply to the text section. - Likewise, the data-relocation section applies to the data section. */ - -struct relocation_info -{ - /* Address (within segment) to be relocated. */ - int r_address; - /* The meaning of r_symbolnum depends on r_extern. */ - unsigned int r_symbolnum:24; - /* Nonzero means value is a pc-relative offset - and it should be relocated for changes in its own address - as well as for changes in the symbol or section specified. */ - unsigned int r_pcrel:1; - /* Length (as exponent of 2) of the field to be relocated. - Thus, a value of 2 indicates 1<<2 bytes. */ - unsigned int r_length:2; - /* 1 => relocate with value of symbol. - r_symbolnum is the index of the symbol - in file's the symbol table. - 0 => relocate with the address of a segment. - r_symbolnum is N_TEXT, N_DATA, N_BSS or N_ABS - (the N_EXT bit may be set also, but signifies nothing). */ - unsigned int r_extern:1; - /* Four bits that aren't used, but when writing an object file - it is desirable to clear them. */ -#ifdef NS32K - unsigned r_bsr:1; - unsigned r_disp:1; - unsigned r_pad:2; -#else - unsigned int r_pad:4; -#endif -}; -#endif /* no N_RELOCATION_INFO_DECLARED. */ - - -#endif /* __A_OUT_GNU_H__ */ diff --git a/gnu/gas/config/atof-ieee.c b/gnu/gas/config/atof-ieee.c deleted file mode 100644 index 6ff45c8404a8..000000000000 --- a/gnu/gas/config/atof-ieee.c +++ /dev/null @@ -1,505 +0,0 @@ -/* atof_ieee.c - turn a Flonum into an IEEE floating point number - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "flonum.h" -#ifdef USG -#define bzero(s,n) memset(s,0,n) -#define bcopy(from,to,n) memcpy((to),(from),(n)) -#endif - -extern FLONUM_TYPE generic_floating_point_number; /* Flonums returned here. */ -#define NULL (0) - -extern char EXP_CHARS[]; - /* Precision in LittleNums. */ -#define MAX_PRECISION (6) -#define F_PRECISION (2) -#define D_PRECISION (4) -#define X_PRECISION (6) -#define P_PRECISION (6) - - /* Length in LittleNums of guard bits. */ -#define GUARD (2) - -static unsigned long int mask [] = { - 0x00000000, - 0x00000001, - 0x00000003, - 0x00000007, - 0x0000000f, - 0x0000001f, - 0x0000003f, - 0x0000007f, - 0x000000ff, - 0x000001ff, - 0x000003ff, - 0x000007ff, - 0x00000fff, - 0x00001fff, - 0x00003fff, - 0x00007fff, - 0x0000ffff, - 0x0001ffff, - 0x0003ffff, - 0x0007ffff, - 0x000fffff, - 0x001fffff, - 0x003fffff, - 0x007fffff, - 0x00ffffff, - 0x01ffffff, - 0x03ffffff, - 0x07ffffff, - 0x0fffffff, - 0x1fffffff, - 0x3fffffff, - 0x7fffffff, - 0xffffffff - }; - -static int bits_left_in_littlenum; -static int littlenums_left; -static LITTLENUM_TYPE * littlenum_pointer; - -static int -next_bits (number_of_bits) - int number_of_bits; -{ - int return_value; - - if(!littlenums_left) - return 0; - if (number_of_bits >= bits_left_in_littlenum) - { - return_value = mask [bits_left_in_littlenum] & *littlenum_pointer; - number_of_bits -= bits_left_in_littlenum; - return_value <<= number_of_bits; - if(--littlenums_left) { - bits_left_in_littlenum = LITTLENUM_NUMBER_OF_BITS - number_of_bits; - littlenum_pointer --; - return_value |= (*littlenum_pointer>>bits_left_in_littlenum) & mask[number_of_bits]; - } - } - else - { - bits_left_in_littlenum -= number_of_bits; - return_value = mask [number_of_bits] & (*littlenum_pointer>>bits_left_in_littlenum); - } - return (return_value); -} - -/* Num had better be less than LITTLENUM_NUMBER_OF_BITS */ -static int -unget_bits(num) -{ - if(!littlenums_left) { - ++littlenum_pointer; - ++littlenums_left; - bits_left_in_littlenum=num; - } else if(bits_left_in_littlenum+num>LITTLENUM_NUMBER_OF_BITS) { - bits_left_in_littlenum= num-(LITTLENUM_NUMBER_OF_BITS-bits_left_in_littlenum); - ++littlenum_pointer; - ++littlenums_left; - } else - bits_left_in_littlenum+=num; -} - -static void -make_invalid_floating_point_number (words) - LITTLENUM_TYPE * words; -{ - as_warn("cannot create floating-point number"); - words[0]= ((unsigned)-1)>>1; /* Zero the leftmost bit */ - words[1]= -1; - words[2]= -1; - words[3]= -1; - words[4]= -1; - words[5]= -1; -} - -/***********************************************************************\ -* Warning: this returns 16-bit LITTLENUMs. It is up to the caller * -* to figure out any alignment problems and to conspire for the * -* bytes/word to be emitted in the right order. Bigendians beware! * -* * -\***********************************************************************/ - -/* Note that atof-ieee always has X and P precisions enabled. it is up - to md_atof to filter them out if the target machine does not support - them. */ - -char * /* Return pointer past text consumed. */ -atof_ieee (str, what_kind, words) - char * str; /* Text to convert to binary. */ - char what_kind; /* 'd', 'f', 'g', 'h' */ - LITTLENUM_TYPE * words; /* Build the binary here. */ -{ - static LITTLENUM_TYPE bits [MAX_PRECISION + MAX_PRECISION + GUARD]; - /* Extra bits for zeroed low-order bits. */ - /* The 1st MAX_PRECISION are zeroed, */ - /* the last contain flonum bits. */ - char * return_value; - int precision; /* Number of 16-bit words in the format. */ - long int exponent_bits; - - return_value = str; - generic_floating_point_number.low = bits + MAX_PRECISION; - generic_floating_point_number.high = NULL; - generic_floating_point_number.leader = NULL; - generic_floating_point_number.exponent = NULL; - generic_floating_point_number.sign = '\0'; - - /* Use more LittleNums than seems */ - /* necessary: the highest flonum may have */ - /* 15 leading 0 bits, so could be useless. */ - - bzero (bits, sizeof(LITTLENUM_TYPE) * MAX_PRECISION); - - switch(what_kind) { - case 'f': - case 'F': - case 's': - case 'S': - precision = F_PRECISION; - exponent_bits = 8; - break; - - case 'd': - case 'D': - case 'r': - case 'R': - precision = D_PRECISION; - exponent_bits = 11; - break; - - case 'x': - case 'X': - case 'e': - case 'E': - precision = X_PRECISION; - exponent_bits = 15; - break; - - case 'p': - case 'P': - - precision = P_PRECISION; - exponent_bits= -1; - break; - - default: - make_invalid_floating_point_number (words); - return NULL; - } - - generic_floating_point_number.high = generic_floating_point_number.low + precision - 1 + GUARD; - - if (atof_generic (& return_value, ".", EXP_CHARS, & generic_floating_point_number)) { - /* as_warn("Error converting floating point number (Exponent overflow?)"); */ - make_invalid_floating_point_number (words); - return NULL; - } - gen_to_words(words, precision, exponent_bits); - return return_value; -} - -/* Turn generic_floating_point_number into a real float/double/extended */ -gen_to_words(words,precision,exponent_bits) -LITTLENUM_TYPE *words; -long int exponent_bits; -int precision; -{ - int return_value=0; - - long int exponent_1; - long int exponent_2; - long int exponent_3; - long int exponent_4; - int exponent_skippage; - LITTLENUM_TYPE word1; - LITTLENUM_TYPE * lp; - - if (generic_floating_point_number.low > generic_floating_point_number.leader) { - /* 0.0e0 seen. */ - if(generic_floating_point_number.sign=='+') - words[0]=0x0000; - else - words[0]=0x8000; - bzero (&words[1], sizeof(LITTLENUM_TYPE) * (precision-1)); - return return_value; - } - - /* NaN: Do the right thing */ - if(generic_floating_point_number.sign==0) { - if(precision==F_PRECISION) { - words[0]=0x7fff; - words[1]=0xffff; - } else { - words[0]=0x7fff; - words[1]=0xffff; - words[2]=0xffff; - words[3]=0xffff; - } - return return_value; - } else if(generic_floating_point_number.sign=='P') { - /* +INF: Do the right thing */ - if(precision==F_PRECISION) { - words[0]=0x7f80; - words[1]=0; - } else { - words[0]=0x7ff0; - words[1]=0; - words[2]=0; - words[3]=0; - } - return return_value; - } else if(generic_floating_point_number.sign=='N') { - /* Negative INF */ - if(precision==F_PRECISION) { - words[0]=0xff80; - words[1]=0x0; - } else { - words[0]=0xfff0; - words[1]=0x0; - words[2]=0x0; - words[3]=0x0; - } - return return_value; - } - /* - * The floating point formats we support have: - * Bit 15 is sign bit. - * Bits 14:n are excess-whatever exponent. - * Bits n-1:0 (if any) are most significant bits of fraction. - * Bits 15:0 of the next word(s) are the next most significant bits. - * - * So we need: number of bits of exponent, number of bits of - * mantissa. - */ - bits_left_in_littlenum = LITTLENUM_NUMBER_OF_BITS; - littlenum_pointer = generic_floating_point_number.leader; - littlenums_left = 1+generic_floating_point_number.leader - generic_floating_point_number.low; - /* Seek (and forget) 1st significant bit */ - for (exponent_skippage = 0;! next_bits(1); exponent_skippage ++) - ; - exponent_1 = generic_floating_point_number.exponent + generic_floating_point_number.leader + 1 - - generic_floating_point_number.low; - /* Radix LITTLENUM_RADIX, point just higher than generic_floating_point_number.leader. */ - exponent_2 = exponent_1 * LITTLENUM_NUMBER_OF_BITS; - /* Radix 2. */ - exponent_3 = exponent_2 - exponent_skippage; - /* Forget leading zeros, forget 1st bit. */ - exponent_4 = exponent_3 + ((1 << (exponent_bits - 1)) - 2); - /* Offset exponent. */ - - lp = words; - - /* Word 1. Sign, exponent and perhaps high bits. */ - word1 = (generic_floating_point_number.sign == '+') ? 0 : (1<<(LITTLENUM_NUMBER_OF_BITS-1)); - - /* Assume 2's complement integers. */ - if(exponent_4<1 && exponent_4>=-62) { - int prec_bits; - int num_bits; - - unget_bits(1); - num_bits= -exponent_4; - prec_bits=LITTLENUM_NUMBER_OF_BITS*precision-(exponent_bits+1+num_bits); - if(precision==X_PRECISION && exponent_bits==15) - prec_bits-=LITTLENUM_NUMBER_OF_BITS+1; - - if(num_bits>=LITTLENUM_NUMBER_OF_BITS-exponent_bits) { - /* Bigger than one littlenum */ - num_bits-=(LITTLENUM_NUMBER_OF_BITS-1)-exponent_bits; - *lp++=word1; - if(num_bits+exponent_bits+1>=precision*LITTLENUM_NUMBER_OF_BITS) { - /* Exponent overflow */ - make_invalid_floating_point_number(words); - return return_value; - } - if(precision==X_PRECISION && exponent_bits==15) { - *lp++=0; - *lp++=0; - num_bits-=LITTLENUM_NUMBER_OF_BITS-1; - } - while(num_bits>=LITTLENUM_NUMBER_OF_BITS) { - num_bits-=LITTLENUM_NUMBER_OF_BITS; - *lp++=0; - } - if(num_bits) - *lp++=next_bits(LITTLENUM_NUMBER_OF_BITS-(num_bits)); - } else { - if(precision==X_PRECISION && exponent_bits==15) { - *lp++=word1; - *lp++=0; - if(num_bits==LITTLENUM_NUMBER_OF_BITS) { - *lp++=0; - *lp++=next_bits(LITTLENUM_NUMBER_OF_BITS-1); - } else if(num_bits==LITTLENUM_NUMBER_OF_BITS-1) - *lp++=0; - else - *lp++=next_bits(LITTLENUM_NUMBER_OF_BITS-1-num_bits); - num_bits=0; - } else { - word1|= next_bits ((LITTLENUM_NUMBER_OF_BITS-1) - (exponent_bits+num_bits)); - *lp++=word1; - } - } - while(lp<words+precision) - *lp++=next_bits(LITTLENUM_NUMBER_OF_BITS); - - /* Round the mantissa up, but don't change the number */ - if(next_bits(1)) { - --lp; - if(prec_bits>LITTLENUM_NUMBER_OF_BITS) { - int n = 0; - int tmp_bits; - - n=0; - tmp_bits=prec_bits; - while(tmp_bits>LITTLENUM_NUMBER_OF_BITS) { - if(lp[n]!=(LITTLENUM_TYPE)-1) - break; - --n; - tmp_bits-=LITTLENUM_NUMBER_OF_BITS; - } - if(tmp_bits>LITTLENUM_NUMBER_OF_BITS || (lp[n]&mask[tmp_bits])!=mask[tmp_bits]) { - unsigned long int carry; - - for (carry = 1; carry && (lp >= words); lp --) { - carry = * lp + carry; - * lp = carry; - carry >>= LITTLENUM_NUMBER_OF_BITS; - } - } - } else if((*lp&mask[prec_bits])!=mask[prec_bits]) - lp++; - } - - return return_value; - } else if (exponent_4 & ~ mask [exponent_bits]) { - /* - * Exponent overflow. Lose immediately. - */ - - /* - * We leave return_value alone: admit we read the - * number, but return a floating exception - * because we can't encode the number. - */ - make_invalid_floating_point_number (words); - return return_value; - } else { - word1 |= (exponent_4 << ((LITTLENUM_NUMBER_OF_BITS-1) - exponent_bits)) - | next_bits ((LITTLENUM_NUMBER_OF_BITS-1) - exponent_bits); - } - - * lp ++ = word1; - - /* X_PRECISION is special: it has 16 bits of zero in the middle, - followed by a 1 bit. */ - if(exponent_bits==15 && precision==X_PRECISION) { - *lp++=0; - *lp++= 1<<(LITTLENUM_NUMBER_OF_BITS)|next_bits(LITTLENUM_NUMBER_OF_BITS-1); - } - - /* The rest of the words are just mantissa bits. */ - while(lp < words + precision) - *lp++ = next_bits (LITTLENUM_NUMBER_OF_BITS); - - if (next_bits (1)) { - unsigned long int carry; - /* - * Since the NEXT bit is a 1, round UP the mantissa. - * The cunning design of these hidden-1 floats permits - * us to let the mantissa overflow into the exponent, and - * it 'does the right thing'. However, we lose if the - * highest-order bit of the lowest-order word flips. - * Is that clear? - */ - - -/* #if (sizeof(carry)) < ((sizeof(bits[0]) * BITS_PER_CHAR) + 2) - Please allow at least 1 more bit in carry than is in a LITTLENUM. - We need that extra bit to hold a carry during a LITTLENUM carry - propagation. Another extra bit (kept 0) will assure us that we - don't get a sticky sign bit after shifting right, and that - permits us to propagate the carry without any masking of bits. -#endif */ - for (carry = 1, lp --; carry && (lp >= words); lp --) { - carry = * lp + carry; - * lp = carry; - carry >>= LITTLENUM_NUMBER_OF_BITS; - } - if ( (word1 ^ *words) & (1 << (LITTLENUM_NUMBER_OF_BITS - 1)) ) { - /* We leave return_value alone: admit we read the - * number, but return a floating exception - * because we can't encode the number. - */ - *words&= ~ (1 << (LITTLENUM_NUMBER_OF_BITS - 1)); - /* make_invalid_floating_point_number (words); */ - /* return return_value; */ - } - } - return (return_value); -} - -/* This routine is a real kludge. Someone really should do it better, but - I'm too lazy, and I don't understand this stuff all too well anyway - (JF) - */ -void -int_to_gen(x) -long x; -{ - char buf[20]; - char *bufp; - - sprintf(buf,"%ld",x); - bufp= &buf[0]; - if(atof_generic(&bufp,".", EXP_CHARS, &generic_floating_point_number)) - as_warn("Error converting number to floating point (Exponent overflow?)"); -} - -#ifdef TEST -char * -print_gen(gen) -FLONUM_TYPE *gen; -{ - FLONUM_TYPE f; - LITTLENUM_TYPE arr[10]; - double dv; - float fv; - static char sbuf[40]; - - if(gen) { - f=generic_floating_point_number; - generic_floating_point_number= *gen; - } - gen_to_words(&arr[0],4,11); - bcopy(&arr[0],&dv,sizeof(double)); - sprintf(sbuf,"%x %x %x %x %.14G ",arr[0],arr[1],arr[2],arr[3],dv); - gen_to_words(&arr[0],2,8); - bcopy(&arr[0],&fv,sizeof(float)); - sprintf(sbuf+strlen(sbuf),"%x %x %.12g\n",arr[0],arr[1],fv); - if(gen) - generic_floating_point_number=f; - return sbuf; -} -#endif diff --git a/gnu/gas/config/i386-opcode.h b/gnu/gas/config/i386-opcode.h deleted file mode 100644 index cace0c356d39..000000000000 --- a/gnu/gas/config/i386-opcode.h +++ /dev/null @@ -1,806 +0,0 @@ -/*- - * This code is derived from software copyrighted by the Free Software - * Foundation. - * - * Modified 1991 by Donn Seeley at UUNET Technologies, Inc. - * - * @(#)i386-opcode.h 6.3 (Berkeley) 5/8/91 - */ - -/* i386-opcode.h -- Intel 80386 opcode table - Copyright (C) 1989, Free Software Foundation. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -template i386_optab[] = { - -#define _ None -/* move instructions */ -{ "mov", 2, 0xa0, _, DW|NoModrm, Disp32, Acc, 0 }, -{ "mov", 2, 0x88, _, DW|Modrm, Reg, Reg|Mem, 0 }, -{ "mov", 2, 0xb0, _, ShortFormW, Imm, Reg, 0 }, -{ "mov", 2, 0xc6, _, W|Modrm, Imm, Reg|Mem, 0 }, -{ "mov", 2, 0x8c, _, D|Modrm, SReg3|SReg2, Reg16|Mem16, 0 }, -/* move to/from control debug registers */ -{ "mov", 2, 0x0f20, _, D|Modrm, Control, Reg32, 0}, -{ "mov", 2, 0x0f21, _, D|Modrm, Debug, Reg32, 0}, -{ "mov", 2, 0x0f24, _, D|Modrm, Test, Reg32, 0}, - -/* move with sign extend */ -/* "movsbl" & "movsbw" must not be unified into "movsb" to avoid - conflict with the "movs" string move instruction. Thus, - {"movsb", 2, 0x0fbe, _, ReverseRegRegmem|Modrm, Reg8|Mem, Reg16|Reg32, 0}, - is not kosher; we must seperate the two instructions. */ -{"movsbl", 2, 0x0fbe, _, ReverseRegRegmem|Modrm, Reg8|Mem, Reg32, 0}, -{"movsbw", 2, 0x660fbe, _, ReverseRegRegmem|Modrm, Reg8|Mem, Reg16, 0}, -{"movswl", 2, 0x0fbf, _, ReverseRegRegmem|Modrm, Reg16|Mem, Reg32, 0}, - -/* move with zero extend */ -{"movzb", 2, 0x0fb6, _, ReverseRegRegmem|Modrm, Reg8|Mem, Reg16|Reg32, 0}, -{"movzwl", 2, 0x0fb7, _, ReverseRegRegmem|Modrm, Reg16|Mem, Reg32, 0}, - -/* push instructions */ -{"push", 1, 0x50, _, ShortForm, WordReg,0,0 }, -{"push", 1, 0xff, 0x6, Modrm, WordReg|WordMem, 0, 0 }, -{"push", 1, 0x6a, _, NoModrm, Imm8S, 0, 0}, -{"push", 1, 0x68, _, NoModrm, Imm16|Imm32, 0, 0}, -{"push", 1, 0x06, _, Seg2ShortForm, SReg2,0,0 }, -{"push", 1, 0x0fa0, _, Seg3ShortForm, SReg3,0,0 }, -/* push all */ -{"pusha", 0, 0x60, _, NoModrm, 0, 0, 0 }, - -/* pop instructions */ -{"pop", 1, 0x58, _, ShortForm, WordReg,0,0 }, -{"pop", 1, 0x8f, 0x0, Modrm, WordReg|WordMem, 0, 0 }, -#define POP_SEG_SHORT 0x7 -{"pop", 1, 0x07, _, Seg2ShortForm, SReg2,0,0 }, -{"pop", 1, 0x0fa1, _, Seg3ShortForm, SReg3,0,0 }, -/* pop all */ -{"popa", 0, 0x61, _, NoModrm, 0, 0, 0 }, - -/* xchg exchange instructions - xchg commutes: we allow both operand orders */ -{"xchg", 2, 0x90, _, ShortForm, WordReg, Acc, 0 }, -{"xchg", 2, 0x90, _, ShortForm, Acc, WordReg, 0 }, -{"xchg", 2, 0x86, _, W|Modrm, Reg, Reg|Mem, 0 }, -{"xchg", 2, 0x86, _, W|Modrm, Reg|Mem, Reg, 0 }, - -/* in/out from ports */ -{"in", 2, 0xe4, _, W|NoModrm, Imm8, Acc, 0 }, -{"in", 2, 0xec, _, W|NoModrm, InOutPortReg, Acc, 0 }, -{"out", 2, 0xe6, _, W|NoModrm, Acc, Imm8, 0 }, -{"out", 2, 0xee, _, W|NoModrm, Acc, InOutPortReg, 0 }, - -/* load effective address */ -{"lea", 2, 0x8d, _, Modrm, WordMem, WordReg, 0 }, - -/* load segment registers from memory */ -{"lds", 2, 0xc5, _, Modrm, Mem, Reg32, 0}, -{"les", 2, 0xc4, _, Modrm, Mem, Reg32, 0}, -{"lfs", 2, 0x0fb4, _, Modrm, Mem, Reg32, 0}, -{"lgs", 2, 0x0fb5, _, Modrm, Mem, Reg32, 0}, -{"lss", 2, 0x0fb2, _, Modrm, Mem, Reg32, 0}, - -/* flags register instructions */ -{"clc", 0, 0xf8, _, NoModrm, 0, 0, 0}, -{"cld", 0, 0xfc, _, NoModrm, 0, 0, 0}, -{"cli", 0, 0xfa, _, NoModrm, 0, 0, 0}, -{"clts", 0, 0x0f06, _, NoModrm, 0, 0, 0}, -{"cmc", 0, 0xf5, _, NoModrm, 0, 0, 0}, -{"lahf", 0, 0x9f, _, NoModrm, 0, 0, 0}, -{"sahf", 0, 0x9e, _, NoModrm, 0, 0, 0}, -{"pushf", 0, 0x9c, _, NoModrm, 0, 0, 0}, -{"popf", 0, 0x9d, _, NoModrm, 0, 0, 0}, -{"stc", 0, 0xf9, _, NoModrm, 0, 0, 0}, -{"std", 0, 0xfd, _, NoModrm, 0, 0, 0}, -{"sti", 0, 0xfb, _, NoModrm, 0, 0, 0}, - -{"add", 2, 0x0, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"add", 2, 0x83, 0, Modrm, Imm8S, WordReg|WordMem, 0}, -{"add", 2, 0x4, _, W|NoModrm, Imm, Acc, 0}, -{"add", 2, 0x80, 0, W|Modrm, Imm, Reg|Mem, 0}, - -{"inc", 1, 0x40, _, ShortForm, WordReg, 0, 0}, -{"inc", 1, 0xfe, 0, W|Modrm, Reg|Mem, 0, 0}, - -{"sub", 2, 0x28, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"sub", 2, 0x83, 5, Modrm, Imm8S, WordReg|WordMem, 0}, -{"sub", 2, 0x2c, _, W|NoModrm, Imm, Acc, 0}, -{"sub", 2, 0x80, 5, W|Modrm, Imm, Reg|Mem, 0}, - -{"dec", 1, 0x48, _, ShortForm, WordReg, 0, 0}, -{"dec", 1, 0xfe, 1, W|Modrm, Reg|Mem, 0, 0}, - -{"sbb", 2, 0x18, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"sbb", 2, 0x83, 3, Modrm, Imm8S, WordReg|WordMem, 0}, -{"sbb", 2, 0x1c, _, W|NoModrm, Imm, Acc, 0}, -{"sbb", 2, 0x80, 3, W|Modrm, Imm, Reg|Mem, 0}, - -{"cmp", 2, 0x38, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"cmp", 2, 0x83, 7, Modrm, Imm8S, WordReg|WordMem, 0}, -{"cmp", 2, 0x3c, _, W|NoModrm, Imm, Acc, 0}, -{"cmp", 2, 0x80, 7, W|Modrm, Imm, Reg|Mem, 0}, - -{"test", 2, 0x84, _, W|Modrm, Reg|Mem, Reg, 0}, -{"test", 2, 0x84, _, W|Modrm, Reg, Reg|Mem, 0}, -{"test", 2, 0xa8, _, W|NoModrm, Imm, Acc, 0}, -{"test", 2, 0xf6, 0, W|Modrm, Imm, Reg|Mem, 0}, - -{"and", 2, 0x20, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"and", 2, 0x83, 4, Modrm, Imm8S, WordReg|WordMem, 0}, -{"and", 2, 0x24, _, W|NoModrm, Imm, Acc, 0}, -{"and", 2, 0x80, 4, W|Modrm, Imm, Reg|Mem, 0}, - -{"or", 2, 0x08, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"or", 2, 0x83, 1, Modrm, Imm8S, WordReg|WordMem, 0}, -{"or", 2, 0x0c, _, W|NoModrm, Imm, Acc, 0}, -{"or", 2, 0x80, 1, W|Modrm, Imm, Reg|Mem, 0}, - -{"xor", 2, 0x30, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"xor", 2, 0x83, 6, Modrm, Imm8S, WordReg|WordMem, 0}, -{"xor", 2, 0x34, _, W|NoModrm, Imm, Acc, 0}, -{"xor", 2, 0x80, 6, W|Modrm, Imm, Reg|Mem, 0}, - -{"adc", 2, 0x10, _, DW|Modrm, Reg, Reg|Mem, 0}, -{"adc", 2, 0x83, 2, Modrm, Imm8S, WordReg|WordMem, 0}, -{"adc", 2, 0x14, _, W|NoModrm, Imm, Acc, 0}, -{"adc", 2, 0x80, 2, W|Modrm, Imm, Reg|Mem, 0}, - -{"neg", 1, 0xf6, 3, W|Modrm, Reg|Mem, 0, 0}, -{"not", 1, 0xf6, 2, W|Modrm, Reg|Mem, 0, 0}, - -{"aaa", 0, 0x37, _, NoModrm, 0, 0, 0}, -{"aas", 0, 0x3f, _, NoModrm, 0, 0, 0}, -{"daa", 0, 0x27, _, NoModrm, 0, 0, 0}, -{"das", 0, 0x2f, _, NoModrm, 0, 0, 0}, -{"aad", 0, 0xd50a, _, NoModrm, 0, 0, 0}, -{"aam", 0, 0xd40a, _, NoModrm, 0, 0, 0}, - -/* conversion insns */ -/* conversion: intel naming */ -{"cbw", 0, 0x6698, _, NoModrm, 0, 0, 0}, -{"cwd", 0, 0x6699, _, NoModrm, 0, 0, 0}, -{"cwde", 0, 0x98, _, NoModrm, 0, 0, 0}, -{"cdq", 0, 0x99, _, NoModrm, 0, 0, 0}, -/* att naming */ -{"cbtw", 0, 0x6698, _, NoModrm, 0, 0, 0}, -{"cwtl", 0, 0x98, _, NoModrm, 0, 0, 0}, -{"cwtd", 0, 0x6699, _, NoModrm, 0, 0, 0}, -{"cltd", 0, 0x99, _, NoModrm, 0, 0, 0}, - -/* Warning! the mul/imul (opcode 0xf6) must only have 1 operand! They are - expanding 64-bit multiplies, and *cannot* be selected to accomplish - 'imul %ebx, %eax' (opcode 0x0faf must be used in this case) - These multiplies can only be selected with single opearnd forms. */ -{"mul", 1, 0xf6, 4, W|Modrm, Reg|Mem, 0, 0}, -{"imul", 1, 0xf6, 5, W|Modrm, Reg|Mem, 0, 0}, - - - - -/* imulKludge here is needed to reverse the i.rm.reg & i.rm.regmem fields. - These instructions are exceptions: 'imul $2, %eax, %ecx' would put - '%eax' in the reg field and '%ecx' in the regmem field if we did not - switch them. */ -{"imul", 2, 0x0faf, _, Modrm|ReverseRegRegmem, WordReg|Mem, WordReg, 0}, -{"imul", 3, 0x6b, _, Modrm|ReverseRegRegmem, Imm8S, WordReg|Mem, WordReg}, -{"imul", 3, 0x69, _, Modrm|ReverseRegRegmem, Imm16|Imm32, WordReg|Mem, WordReg}, -/* - imul with 2 operands mimicks imul with 3 by puting register both - in i.rm.reg & i.rm.regmem fields -*/ -{"imul", 2, 0x6b, _, Modrm|imulKludge, Imm8S, WordReg, 0}, -{"imul", 2, 0x69, _, Modrm|imulKludge, Imm16|Imm32, WordReg, 0}, -{"div", 1, 0xf6, 6, W|Modrm, Reg|Mem, 0, 0}, -{"div", 2, 0xf6, 6, W|Modrm, Reg|Mem, Acc, 0}, -{"idiv", 1, 0xf6, 7, W|Modrm, Reg|Mem, 0, 0}, -{"idiv", 2, 0xf6, 7, W|Modrm, Reg|Mem, Acc, 0}, - -{"rol", 2, 0xd0, 0, W|Modrm, Imm1, Reg|Mem, 0}, -{"rol", 2, 0xc0, 0, W|Modrm, Imm8, Reg|Mem, 0}, -{"rol", 2, 0xd2, 0, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"rol", 1, 0xd0, 0, W|Modrm, Reg|Mem, 0, 0}, - -{"ror", 2, 0xd0, 1, W|Modrm, Imm1, Reg|Mem, 0}, -{"ror", 2, 0xc0, 1, W|Modrm, Imm8, Reg|Mem, 0}, -{"ror", 2, 0xd2, 1, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"ror", 1, 0xd0, 1, W|Modrm, Reg|Mem, 0, 0}, - -{"rcl", 2, 0xd0, 2, W|Modrm, Imm1, Reg|Mem, 0}, -{"rcl", 2, 0xc0, 2, W|Modrm, Imm8, Reg|Mem, 0}, -{"rcl", 2, 0xd2, 2, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"rcl", 1, 0xd0, 2, W|Modrm, Reg|Mem, 0, 0}, - -{"rcr", 2, 0xd0, 3, W|Modrm, Imm1, Reg|Mem, 0}, -{"rcr", 2, 0xc0, 3, W|Modrm, Imm8, Reg|Mem, 0}, -{"rcr", 2, 0xd2, 3, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"rcr", 1, 0xd0, 3, W|Modrm, Reg|Mem, 0, 0}, - -{"sal", 2, 0xd0, 4, W|Modrm, Imm1, Reg|Mem, 0}, -{"sal", 2, 0xc0, 4, W|Modrm, Imm8, Reg|Mem, 0}, -{"sal", 2, 0xd2, 4, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"sal", 1, 0xd0, 4, W|Modrm, Reg|Mem, 0, 0}, -{"shl", 2, 0xd0, 4, W|Modrm, Imm1, Reg|Mem, 0}, -{"shl", 2, 0xc0, 4, W|Modrm, Imm8, Reg|Mem, 0}, -{"shl", 2, 0xd2, 4, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"shl", 1, 0xd0, 4, W|Modrm, Reg|Mem, 0, 0}, - -{"shld", 3, 0x0fa4, _, Modrm, Imm8, WordReg, WordReg|Mem}, -{"shld", 3, 0x0fa5, _, Modrm, ShiftCount, WordReg, WordReg|Mem}, - -{"shr", 2, 0xd0, 5, W|Modrm, Imm1, Reg|Mem, 0}, -{"shr", 2, 0xc0, 5, W|Modrm, Imm8, Reg|Mem, 0}, -{"shr", 2, 0xd2, 5, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"shr", 1, 0xd0, 5, W|Modrm, Reg|Mem, 0, 0}, - -{"shrd", 3, 0x0fac, _, Modrm, Imm8, WordReg, WordReg|Mem}, -{"shrd", 3, 0x0fad, _, Modrm, ShiftCount, WordReg, WordReg|Mem}, - -{"sar", 2, 0xd0, 7, W|Modrm, Imm1, Reg|Mem, 0}, -{"sar", 2, 0xc0, 7, W|Modrm, Imm8, Reg|Mem, 0}, -{"sar", 2, 0xd2, 7, W|Modrm, ShiftCount, Reg|Mem, 0}, -{"sar", 1, 0xd0, 7, W|Modrm, Reg|Mem, 0, 0}, - -/* control transfer instructions */ -#define CALL_PC_RELATIVE 0xe8 -{"call", 1, 0xe8, _, JumpDword, Disp32, 0, 0}, -{"call", 1, 0xff, 2, Modrm, Reg|Mem|JumpAbsolute, 0, 0}, -#define CALL_FAR_IMMEDIATE 0x9a -{"lcall", 2, 0x9a, _, JumpInterSegment, Imm16, Imm32, 0}, -{"lcall", 1, 0xff, 3, Modrm, Mem, 0, 0}, - -#define JUMP_PC_RELATIVE 0xeb -{"jmp", 1, 0xeb, _, Jump, Disp, 0, 0}, -{"jmp", 1, 0xff, 4, Modrm, Reg32|Mem|JumpAbsolute, 0, 0}, -#define JUMP_FAR_IMMEDIATE 0xea -{"ljmp", 2, 0xea, _, JumpInterSegment, Imm16, Imm32, 0}, -{"ljmp", 1, 0xff, 5, Modrm, Mem, 0, 0}, - -{"ret", 0, 0xc3, _, NoModrm, 0, 0, 0}, -{"ret", 1, 0xc2, _, NoModrm, Imm16, 0, 0}, -{"lret", 0, 0xcb, _, NoModrm, 0, 0, 0}, -{"lret", 1, 0xca, _, NoModrm, Imm16, 0, 0}, -{"enter", 2, 0xc8, _, NoModrm, Imm16, Imm8, 0}, -{"leave", 0, 0xc9, _, NoModrm, 0, 0, 0}, - -/* conditional jumps */ -{"jo", 1, 0x70, _, Jump, Disp, 0, 0}, - -{"jno", 1, 0x71, _, Jump, Disp, 0, 0}, - -{"jb", 1, 0x72, _, Jump, Disp, 0, 0}, -{"jc", 1, 0x72, _, Jump, Disp, 0, 0}, -{"jnae", 1, 0x72, _, Jump, Disp, 0, 0}, - -{"jnb", 1, 0x73, _, Jump, Disp, 0, 0}, -{"jnc", 1, 0x73, _, Jump, Disp, 0, 0}, -{"jae", 1, 0x73, _, Jump, Disp, 0, 0}, - -{"je", 1, 0x74, _, Jump, Disp, 0, 0}, -{"jz", 1, 0x74, _, Jump, Disp, 0, 0}, - -{"jne", 1, 0x75, _, Jump, Disp, 0, 0}, -{"jnz", 1, 0x75, _, Jump, Disp, 0, 0}, - -{"jbe", 1, 0x76, _, Jump, Disp, 0, 0}, -{"jna", 1, 0x76, _, Jump, Disp, 0, 0}, - -{"jnbe", 1, 0x77, _, Jump, Disp, 0, 0}, -{"ja", 1, 0x77, _, Jump, Disp, 0, 0}, - -{"js", 1, 0x78, _, Jump, Disp, 0, 0}, - -{"jns", 1, 0x79, _, Jump, Disp, 0, 0}, - -{"jp", 1, 0x7a, _, Jump, Disp, 0, 0}, -{"jpe", 1, 0x7a, _, Jump, Disp, 0, 0}, - -{"jnp", 1, 0x7b, _, Jump, Disp, 0, 0}, -{"jpo", 1, 0x7b, _, Jump, Disp, 0, 0}, - -{"jl", 1, 0x7c, _, Jump, Disp, 0, 0}, -{"jnge", 1, 0x7c, _, Jump, Disp, 0, 0}, - -{"jnl", 1, 0x7d, _, Jump, Disp, 0, 0}, -{"jge", 1, 0x7d, _, Jump, Disp, 0, 0}, - -{"jle", 1, 0x7e, _, Jump, Disp, 0, 0}, -{"jng", 1, 0x7e, _, Jump, Disp, 0, 0}, - -{"jnle", 1, 0x7f, _, Jump, Disp, 0, 0}, -{"jg", 1, 0x7f, _, Jump, Disp, 0, 0}, - -/* these turn into pseudo operations when disp is larger than 8 bits */ -#define IS_JUMP_ON_CX_ZERO(o) \ - (o == 0x67e3) -#define IS_JUMP_ON_ECX_ZERO(o) \ - (o == 0xe3) - -{"jcxz", 1, 0x67e3, _, JumpByte, Disp, 0, 0}, -{"jecxz", 1, 0xe3, _, JumpByte, Disp, 0, 0}, - -#define IS_LOOP_ECX_TIMES(o) \ - (o == 0xe2 || o == 0xe1 || o == 0xe0) - -{"loop", 1, 0xe2, _, JumpByte, Disp, 0, 0}, - -{"loopz", 1, 0xe1, _, JumpByte, Disp, 0, 0}, -{"loope", 1, 0xe1, _, JumpByte, Disp, 0, 0}, - -{"loopnz", 1, 0xe0, _, JumpByte, Disp, 0, 0}, -{"loopne", 1, 0xe0, _, JumpByte, Disp, 0, 0}, - -/* set byte on flag instructions */ -{"seto", 1, 0x0f90, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setno", 1, 0x0f91, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setb", 1, 0x0f92, 0, Modrm, Reg8|Mem, 0, 0}, -{"setnae", 1, 0x0f92, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setnb", 1, 0x0f93, 0, Modrm, Reg8|Mem, 0, 0}, -{"setae", 1, 0x0f93, 0, Modrm, Reg8|Mem, 0, 0}, - -{"sete", 1, 0x0f94, 0, Modrm, Reg8|Mem, 0, 0}, -{"setz", 1, 0x0f94, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setne", 1, 0x0f95, 0, Modrm, Reg8|Mem, 0, 0}, -{"setnz", 1, 0x0f95, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setbe", 1, 0x0f96, 0, Modrm, Reg8|Mem, 0, 0}, -{"setna", 1, 0x0f96, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setnbe", 1, 0x0f97, 0, Modrm, Reg8|Mem, 0, 0}, -{"seta", 1, 0x0f97, 0, Modrm, Reg8|Mem, 0, 0}, - -{"sets", 1, 0x0f98, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setns", 1, 0x0f99, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setp", 1, 0x0f9a, 0, Modrm, Reg8|Mem, 0, 0}, -{"setpe", 1, 0x0f9a, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setnp", 1, 0x0f9b, 0, Modrm, Reg8|Mem, 0, 0}, -{"setpo", 1, 0x0f9b, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setl", 1, 0x0f9c, 0, Modrm, Reg8|Mem, 0, 0}, -{"setnge", 1, 0x0f9c, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setnl", 1, 0x0f9d, 0, Modrm, Reg8|Mem, 0, 0}, -{"setge", 1, 0x0f9d, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setle", 1, 0x0f9e, 0, Modrm, Reg8|Mem, 0, 0}, -{"setng", 1, 0x0f9e, 0, Modrm, Reg8|Mem, 0, 0}, - -{"setnle", 1, 0x0f9f, 0, Modrm, Reg8|Mem, 0, 0}, -{"setg", 1, 0x0f9f, 0, Modrm, Reg8|Mem, 0, 0}, - -#define IS_STRING_INSTRUCTION(o) \ - ((o) == 0xa6 || (o) == 0x6c || (o) == 0x6e || (o) == 0x6e || \ - (o) == 0xac || (o) == 0xa4 || (o) == 0xae || (o) == 0xaa || \ - (o) == 0xd7) - -/* string manipulation */ -{"cmps", 0, 0xa6, _, W|NoModrm, 0, 0, 0}, -{"ins", 0, 0x6c, _, W|NoModrm, 0, 0, 0}, -{"outs", 0, 0x6e, _, W|NoModrm, 0, 0, 0}, -{"lods", 0, 0xac, _, W|NoModrm, 0, 0, 0}, -{"movs", 0, 0xa4, _, W|NoModrm, 0, 0, 0}, -{"scas", 0, 0xae, _, W|NoModrm, 0, 0, 0}, -{"stos", 0, 0xaa, _, W|NoModrm, 0, 0, 0}, -{"xlat", 0, 0xd7, _, NoModrm, 0, 0, 0}, - -/* bit manipulation */ -{"bsf", 2, 0x0fbc, _, Modrm|ReverseRegRegmem, Reg|Mem, Reg, 0}, -{"bsr", 2, 0x0fbd, _, Modrm|ReverseRegRegmem, Reg|Mem, Reg, 0}, -{"bt", 2, 0x0fa3, _, Modrm, Reg, Reg|Mem, 0}, -{"bt", 2, 0x0fba, 4, Modrm, Imm8, Reg|Mem, 0}, -{"btc", 2, 0x0fbb, _, Modrm, Reg, Reg|Mem, 0}, -{"btc", 2, 0x0fba, 7, Modrm, Imm8, Reg|Mem, 0}, -{"btr", 2, 0x0fb3, _, Modrm, Reg, Reg|Mem, 0}, -{"btr", 2, 0x0fba, 6, Modrm, Imm8, Reg|Mem, 0}, -{"bts", 2, 0x0fab, _, Modrm, Reg, Reg|Mem, 0}, -{"bts", 2, 0x0fba, 5, Modrm, Imm8, Reg|Mem, 0}, - -/* interrupts & op. sys insns */ -/* See i386.c for conversion of 'int $3' into the special int 3 insn. */ -#define INT_OPCODE 0xcd -#define INT3_OPCODE 0xcc -{"int", 1, 0xcd, _, NoModrm, Imm8, 0, 0}, -{"int3", 0, 0xcc, _, NoModrm, 0, 0, 0}, -{"into", 0, 0xce, _, NoModrm, 0, 0, 0}, -{"iret", 0, 0xcf, _, NoModrm, 0, 0, 0}, - -{"boundl", 2, 0x62, _, Modrm, Reg32, Mem, 0}, -{"boundw", 2, 0x6662, _, Modrm, Reg16, Mem, 0}, - -{"hlt", 0, 0xf4, _, NoModrm, 0, 0, 0}, -{"wait", 0, 0x9b, _, NoModrm, 0, 0, 0}, -/* nop is actually 'xchgl %eax, %eax' */ -{"nop", 0, 0x90, _, NoModrm, 0, 0, 0}, - -/* protection control */ -{"arpl", 2, 0x63, _, Modrm, Reg16, Reg16|Mem, 0}, -{"lar", 2, 0x0f02, _, Modrm|ReverseRegRegmem, WordReg|Mem, WordReg, 0}, -{"lgdt", 1, 0x0f01, 2, Modrm, Mem, 0, 0}, -{"lidt", 1, 0x0f01, 3, Modrm, Mem, 0, 0}, -{"lldt", 1, 0x0f00, 2, Modrm, WordReg|Mem, 0, 0}, -{"lmsw", 1, 0x0f01, 6, Modrm, WordReg|Mem, 0, 0}, -{"lsl", 2, 0x0f03, _, Modrm|ReverseRegRegmem, WordReg|Mem, WordReg, 0}, -{"ltr", 1, 0x0f00, 3, Modrm, WordReg|Mem, 0, 0}, - -{"sgdt", 1, 0x0f01, 0, Modrm, Mem, 0, 0}, -{"sidt", 1, 0x0f01, 1, Modrm, Mem, 0, 0}, -{"sldt", 1, 0x0f00, 0, Modrm, WordReg|Mem, 0, 0}, -{"smsw", 1, 0x0f01, 4, Modrm, WordReg|Mem, 0, 0}, -{"str", 1, 0x0f00, 1, Modrm, Reg16|Mem, 0, 0}, - -{"verr", 1, 0x0f00, 4, Modrm, WordReg|Mem, 0, 0}, -{"verw", 1, 0x0f00, 5, Modrm, WordReg|Mem, 0, 0}, - -/* floating point instructions */ - -/* load */ -{"fld", 1, 0xd9c0, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"flds", 1, 0xd9, 0, Modrm, Mem, 0, 0}, /* %st0 <-- mem float */ -{"fildl", 1, 0xdb, 0, Modrm, Mem, 0, 0}, /* %st0 <-- mem word */ -{"fldl", 1, 0xdd, 0, Modrm, Mem, 0, 0}, /* %st0 <-- mem double */ -{"fldl", 1, 0xd9c0, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"filds", 1, 0xdf, 0, Modrm, Mem, 0, 0}, /* %st0 <-- mem dword */ -{"fildq", 1, 0xdf, 5, Modrm, Mem, 0, 0}, /* %st0 <-- mem qword */ -{"fldt", 1, 0xdb, 5, Modrm, Mem, 0, 0}, /* %st0 <-- mem efloat */ -{"fbld", 1, 0xdf, 4, Modrm, Mem, 0, 0}, /* %st0 <-- mem bcd */ - -/* store (no pop) */ -{"fst", 1, 0xddd0, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"fsts", 1, 0xd9, 2, Modrm, Mem, 0, 0}, /* %st0 --> mem float */ -{"fistl", 1, 0xdb, 2, Modrm, Mem, 0, 0}, /* %st0 --> mem dword */ -{"fstl", 1, 0xdd, 2, Modrm, Mem, 0, 0}, /* %st0 --> mem double */ -{"fstl", 1, 0xddd0, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"fists", 1, 0xdf, 2, Modrm, Mem, 0, 0}, /* %st0 --> mem word */ - -/* store (with pop) */ -{"fstp", 1, 0xddd8, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"fstps", 1, 0xd9, 3, Modrm, Mem, 0, 0}, /* %st0 --> mem float */ -{"fistpl", 1, 0xdb, 3, Modrm, Mem, 0, 0}, /* %st0 --> mem word */ -{"fstpl", 1, 0xdd, 3, Modrm, Mem, 0, 0}, /* %st0 --> mem double */ -{"fstpl", 1, 0xddd8, _, ShortForm, FloatReg, 0, 0}, /* register */ -{"fistps", 1, 0xdf, 3, Modrm, Mem, 0, 0}, /* %st0 --> mem dword */ -{"fistpq", 1, 0xdf, 7, Modrm, Mem, 0, 0}, /* %st0 --> mem qword */ -{"fstpt", 1, 0xdb, 7, Modrm, Mem, 0, 0}, /* %st0 --> mem efloat */ -{"fbstp", 1, 0xdf, 6, Modrm, Mem, 0, 0}, /* %st0 --> mem bcd */ - -/* exchange %st<n> with %st0 */ -{"fxch", 1, 0xd9c8, _, ShortForm, FloatReg, 0, 0}, - -/* comparison (without pop) */ -{"fcom", 1, 0xd8d0, _, ShortForm, FloatReg, 0, 0}, -{"fcoms", 1, 0xd8, 2, Modrm, Mem, 0, 0}, /* compare %st0, mem float */ -{"ficoml", 1, 0xda, 2, Modrm, Mem, 0, 0}, /* compare %st0, mem word */ -{"fcoml", 1, 0xdc, 2, Modrm, Mem, 0, 0}, /* compare %st0, mem double */ -{"fcoml", 1, 0xd8d0, _, ShortForm, FloatReg, 0, 0}, -{"ficoms", 1, 0xde, 2, Modrm, Mem, 0, 0}, /* compare %st0, mem dword */ - -/* comparison (with pop) */ -{"fcomp", 1, 0xd8d8, _, ShortForm, FloatReg, 0, 0}, -{"fcomps", 1, 0xd8, 3, Modrm, Mem, 0, 0}, /* compare %st0, mem float */ -{"ficompl", 1, 0xda, 3, Modrm, Mem, 0, 0}, /* compare %st0, mem word */ -{"fcompl", 1, 0xdc, 3, Modrm, Mem, 0, 0}, /* compare %st0, mem double */ -{"fcompl", 1, 0xd8d8, _, ShortForm, FloatReg, 0, 0}, -{"ficomps", 1, 0xde, 3, Modrm, Mem, 0, 0}, /* compare %st0, mem dword */ -{"fcompp", 0, 0xded9, _, NoModrm, 0, 0, 0}, /* compare %st0, %st1 & pop twice */ - -/* unordered comparison (with pop) */ -{"fucom", 1, 0xdde0, _, ShortForm, FloatReg, 0, 0}, -{"fucomp", 1, 0xdde8, _, ShortForm, FloatReg, 0, 0}, -{"fucompp", 0, 0xdae9, _, NoModrm, 0, 0, 0}, /* ucompare %st0, %st1 & pop twice */ - -{"ftst", 0, 0xd9e4, _, NoModrm, 0, 0, 0}, /* test %st0 */ -{"fxam", 0, 0xd9e5, _, NoModrm, 0, 0, 0}, /* examine %st0 */ - -/* load constants into %st0 */ -{"fld1", 0, 0xd9e8, _, NoModrm, 0, 0, 0}, /* %st0 <-- 1.0 */ -{"fldl2t", 0, 0xd9e9, _, NoModrm, 0, 0, 0}, /* %st0 <-- log2(10) */ -{"fldl2e", 0, 0xd9ea, _, NoModrm, 0, 0, 0}, /* %st0 <-- log2(e) */ -{"fldpi", 0, 0xd9eb, _, NoModrm, 0, 0, 0}, /* %st0 <-- pi */ -{"fldlg2", 0, 0xd9ec, _, NoModrm, 0, 0, 0}, /* %st0 <-- log10(2) */ -{"fldln2", 0, 0xd9ed, _, NoModrm, 0, 0, 0}, /* %st0 <-- ln(2) */ -{"fldz", 0, 0xd9ee, _, NoModrm, 0, 0, 0}, /* %st0 <-- 0.0 */ - -/* arithmetic */ - -/* add */ -{"fadd", 1, 0xd8c0, _, ShortForm, FloatReg, 0, 0}, -{"fadd", 2, 0xd8c0, _, ShortForm|FloatD, FloatReg, FloatAcc, 0}, -{"fadd", 0, 0xdcc1, _, NoModrm, 0, 0, 0}, /* alias for fadd %st, %st(1) */ -{"faddp", 1, 0xdac0, _, ShortForm, FloatReg, 0, 0}, -{"faddp", 2, 0xdac0, _, ShortForm|FloatD, FloatReg, FloatAcc, 0}, -{"faddp", 0, 0xdec1, _, NoModrm, 0, 0, 0}, /* alias for faddp %st, %st(1) */ -{"fadds", 1, 0xd8, 0, Modrm, Mem, 0, 0}, -{"fiaddl", 1, 0xda, 0, Modrm, Mem, 0, 0}, -{"faddl", 1, 0xdc, 0, Modrm, Mem, 0, 0}, -{"fiadds", 1, 0xde, 0, Modrm, Mem, 0, 0}, - -/* sub */ -/* Note: intel has decided that certain of these operations are reversed - in assembler syntax. */ -{"fsub", 1, 0xd8e0, _, ShortForm, FloatReg, 0, 0}, -{"fsub", 2, 0xd8e0, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fsub", 2, 0xdce8, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fsub", 2, 0xdce0, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fsub", 0, 0xdce1, _, NoModrm, 0, 0, 0}, -{"fsubp", 1, 0xdae0, _, ShortForm, FloatReg, 0, 0}, -{"fsubp", 2, 0xdae0, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fsubp", 2, 0xdee8, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fsubp", 2, 0xdee0, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fsubp", 0, 0xdee1, _, NoModrm, 0, 0, 0}, -{"fsubs", 1, 0xd8, 4, Modrm, Mem, 0, 0}, -{"fisubl", 1, 0xda, 4, Modrm, Mem, 0, 0}, -{"fsubl", 1, 0xdc, 4, Modrm, Mem, 0, 0}, -{"fisubs", 1, 0xde, 4, Modrm, Mem, 0, 0}, - -/* sub reverse */ -{"fsubr", 1, 0xd8e8, _, ShortForm, FloatReg, 0, 0}, -{"fsubr", 2, 0xd8e8, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fsubr", 2, 0xdce0, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fsubr", 2, 0xdce8, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fsubr", 0, 0xdce9, _, NoModrm, 0, 0, 0}, -{"fsubrp", 1, 0xdae8, _, ShortForm, FloatReg, 0, 0}, -{"fsubrp", 2, 0xdae8, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fsubrp", 2, 0xdee0, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fsubrp", 2, 0xdee8, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fsubrp", 0, 0xdee9, _, NoModrm, 0, 0, 0}, -{"fsubrs", 1, 0xd8, 5, Modrm, Mem, 0, 0}, -{"fisubrl", 1, 0xda, 5, Modrm, Mem, 0, 0}, -{"fsubrl", 1, 0xdc, 5, Modrm, Mem, 0, 0}, -{"fisubrs", 1, 0xde, 5, Modrm, Mem, 0, 0}, - -/* mul */ -{"fmul", 1, 0xd8c8, _, ShortForm, FloatReg, 0, 0}, -{"fmul", 2, 0xd8c8, _, ShortForm|FloatD, FloatReg, FloatAcc, 0}, -{"fmul", 0, 0xdcc9, _, NoModrm, 0, 0, 0}, -{"fmulp", 1, 0xdac8, _, ShortForm, FloatReg, 0, 0}, -{"fmulp", 2, 0xdac8, _, ShortForm|FloatD, FloatReg, FloatAcc, 0}, -{"fmulp", 0, 0xdec9, _, NoModrm, 0, 0, 0}, -{"fmuls", 1, 0xd8, 1, Modrm, Mem, 0, 0}, -{"fimull", 1, 0xda, 1, Modrm, Mem, 0, 0}, -{"fmull", 1, 0xdc, 1, Modrm, Mem, 0, 0}, -{"fimuls", 1, 0xde, 1, Modrm, Mem, 0, 0}, - -/* div */ -/* Note: intel has decided that certain of these operations are reversed - in assembler syntax. */ -{"fdiv", 1, 0xd8f0, _, ShortForm, FloatReg, 0, 0}, -{"fdiv", 2, 0xd8f0, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fdiv", 2, 0xdcf8, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fdiv", 2, 0xdcf0, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fdiv", 0, 0xdcf1, _, NoModrm, 0, 0, 0}, -{"fdivp", 1, 0xdaf0, _, ShortForm, FloatReg, 0, 0}, -{"fdivp", 2, 0xdaf0, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fdivp", 2, 0xdef8, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fdivp", 2, 0xdef0, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fdivp", 0, 0xdef1, _, NoModrm, 0, 0, 0}, -{"fdivs", 1, 0xd8, 6, Modrm, Mem, 0, 0}, -{"fidivl", 1, 0xda, 6, Modrm, Mem, 0, 0}, -{"fdivl", 1, 0xdc, 6, Modrm, Mem, 0, 0}, -{"fidivs", 1, 0xde, 6, Modrm, Mem, 0, 0}, - -/* div reverse */ -{"fdivr", 1, 0xd8f8, _, ShortForm, FloatReg, 0, 0}, -{"fdivr", 2, 0xd8f8, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fdivr", 2, 0xdcf0, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fdivr", 2, 0xdcf8, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fdivr", 0, 0xdcf9, _, NoModrm, 0, 0, 0}, -{"fdivrp", 1, 0xdaf8, _, ShortForm, FloatReg, 0, 0}, -{"fdivrp", 2, 0xdaf8, _, ShortForm, FloatReg, FloatAcc, 0}, -#ifdef NON_BROKEN_OPCODES -{"fdivrp", 2, 0xdef0, _, ShortForm, FloatAcc, FloatReg, 0}, -#else -{"fdivrp", 2, 0xdef8, _, ShortForm, FloatAcc, FloatReg, 0}, -#endif -{"fdivrp", 0, 0xdef9, _, NoModrm, 0, 0, 0}, -{"fdivrs", 1, 0xd8, 7, Modrm, Mem, 0, 0}, -{"fidivrl", 1, 0xda, 7, Modrm, Mem, 0, 0}, -{"fdivrl", 1, 0xdc, 7, Modrm, Mem, 0, 0}, -{"fidivrs", 1, 0xde, 7, Modrm, Mem, 0, 0}, - -{"f2xm1", 0, 0xd9f0, _, NoModrm, 0, 0, 0}, -{"fyl2x", 0, 0xd9f1, _, NoModrm, 0, 0, 0}, -{"fptan", 0, 0xd9f2, _, NoModrm, 0, 0, 0}, -{"fpatan", 0, 0xd9f3, _, NoModrm, 0, 0, 0}, -{"fxtract", 0, 0xd9f4, _, NoModrm, 0, 0, 0}, -{"fprem1", 0, 0xd9f5, _, NoModrm, 0, 0, 0}, -{"fdecstp", 0, 0xd9f6, _, NoModrm, 0, 0, 0}, -{"fincstp", 0, 0xd9f7, _, NoModrm, 0, 0, 0}, -{"fprem", 0, 0xd9f8, _, NoModrm, 0, 0, 0}, -{"fyl2xp1", 0, 0xd9f9, _, NoModrm, 0, 0, 0}, -{"fsqrt", 0, 0xd9fa, _, NoModrm, 0, 0, 0}, -{"fsincos", 0, 0xd9fb, _, NoModrm, 0, 0, 0}, -{"frndint", 0, 0xd9fc, _, NoModrm, 0, 0, 0}, -{"fscale", 0, 0xd9fd, _, NoModrm, 0, 0, 0}, -{"fsin", 0, 0xd9fe, _, NoModrm, 0, 0, 0}, -{"fcos", 0, 0xd9ff, _, NoModrm, 0, 0, 0}, - -{"fchs", 0, 0xd9e0, _, NoModrm, 0, 0, 0}, -{"fabs", 0, 0xd9e1, _, NoModrm, 0, 0, 0}, - -/* processor control */ -{"fninit", 0, 0xdbe3, _, NoModrm, 0, 0, 0}, -{"finit", 0, 0xdbe3, _, NoModrm, 0, 0, 0}, -{"fldcw", 1, 0xd9, 5, Modrm, Mem, 0, 0}, -{"fnstcw", 1, 0xd9, 7, Modrm, Mem, 0, 0}, -{"fstcw", 1, 0xd9, 7, Modrm, Mem, 0, 0}, -{"fnstsw", 1, 0xdfe0, _, NoModrm, Acc, 0, 0}, -{"fnstsw", 1, 0xdd, 7, Modrm, Mem, 0, 0}, -{"fnstsw", 0, 0xdfe0, _, NoModrm, 0, 0, 0}, -{"fstsw", 1, 0xdfe0, _, NoModrm, Acc, 0, 0}, -{"fstsw", 1, 0xdd, 7, Modrm, Mem, 0, 0}, -{"fstsw", 0, 0xdfe0, _, NoModrm, 0, 0, 0}, -{"fnclex", 0, 0xdbe2, _, NoModrm, 0, 0, 0}, -{"fclex", 0, 0xdbe2, _, NoModrm, 0, 0, 0}, -/* - We ignore the short format (287) versions of fstenv/fldenv & fsave/frstor - instructions; i'm not sure how to add them or how they are different. - My 386/387 book offers no details about this. -*/ -{"fnstenv", 1, 0xd9, 6, Modrm, Mem, 0, 0}, -{"fstenv", 1, 0xd9, 6, Modrm, Mem, 0, 0}, -{"fldenv", 1, 0xd9, 4, Modrm, Mem, 0, 0}, -{"fnsave", 1, 0xdd, 6, Modrm, Mem, 0, 0}, -{"fsave", 1, 0xdd, 6, Modrm, Mem, 0, 0}, -{"frstor", 1, 0xdd, 4, Modrm, Mem, 0, 0}, - -{"ffree", 1, 0xddc0, _, ShortForm, FloatReg, 0, 0}, -{"fnop", 0, 0xd9d0, _, NoModrm, 0, 0, 0}, -{"fwait", 0, 0x9b, _, NoModrm, 0, 0, 0}, - -/* - opcode prefixes; we allow them as seperate insns too - (see prefix table below) -*/ -{"aword", 0, 0x67, _, NoModrm, 0, 0, 0}, -{"word", 0, 0x66, _, NoModrm, 0, 0, 0}, -{"lock", 0, 0xf0, _, NoModrm, 0, 0, 0}, -{"cs", 0, 0x2e, _, NoModrm, 0, 0, 0}, -{"ds", 0, 0x3e, _, NoModrm, 0, 0, 0}, -{"es", 0, 0x26, _, NoModrm, 0, 0, 0}, -{"fs", 0, 0x64, _, NoModrm, 0, 0, 0}, -{"gs", 0, 0x65, _, NoModrm, 0, 0, 0}, -{"ss", 0, 0x36, _, NoModrm, 0, 0, 0}, -{"rep", 0, 0xf3, _, NoModrm, 0, 0, 0}, -{"repe", 0, 0xf3, _, NoModrm, 0, 0, 0}, -{ "repne", 0, 0xf2, _, NoModrm, 0, 0, 0}, - -{"", 0, 0, 0, 0, 0, 0, 0} /* sentinal */ -}; -#undef _ - -template *i386_optab_end - = i386_optab + sizeof (i386_optab)/sizeof(i386_optab[0]); - -/* 386 register table */ - -reg_entry i386_regtab[] = { - /* 8 bit regs */ - {"al", Reg8|Acc, 0}, {"cl", Reg8|ShiftCount, 1}, {"dl", Reg8, 2}, - {"bl", Reg8, 3}, - {"ah", Reg8, 4}, {"ch", Reg8, 5}, {"dh", Reg8, 6}, {"bh", Reg8, 7}, - /* 16 bit regs */ - {"ax", Reg16|Acc, 0}, {"cx", Reg16, 1}, {"dx", Reg16|InOutPortReg, 2}, {"bx", Reg16, 3}, - {"sp", Reg16, 4}, {"bp", Reg16, 5}, {"si", Reg16, 6}, {"di", Reg16, 7}, - /* 32 bit regs */ - {"eax", Reg32|Acc, 0}, {"ecx", Reg32, 1}, {"edx", Reg32, 2}, {"ebx", Reg32, 3}, - {"esp", Reg32, 4}, {"ebp", Reg32, 5}, {"esi", Reg32, 6}, {"edi", Reg32, 7}, - /* segment registers */ - {"es", SReg2, 0}, {"cs", SReg2, 1}, {"ss", SReg2, 2}, - {"ds", SReg2, 3}, {"fs", SReg3, 4}, {"gs", SReg3, 5}, - /* control registers */ - {"cr0", Control, 0}, {"cr2", Control, 2}, {"cr3", Control, 3}, - /* debug registers */ - {"db0", Debug, 0}, {"db1", Debug, 1}, {"db2", Debug, 2}, - {"db3", Debug, 3}, {"db6", Debug, 6}, {"db7", Debug, 7}, - /* test registers */ - {"tr6", Test, 6}, {"tr7", Test, 7}, - /* float registers */ - {"st(0)", FloatReg|FloatAcc, 0}, - {"st", FloatReg|FloatAcc, 0}, - {"st(1)", FloatReg, 1}, {"st(2)", FloatReg, 2}, - {"st(3)", FloatReg, 3}, {"st(4)", FloatReg, 4}, {"st(5)", FloatReg, 5}, - {"st(6)", FloatReg, 6}, {"st(7)", FloatReg, 7} -}; - -#define MAX_REG_NAME_SIZE 8 /* for parsing register names from input */ - -reg_entry *i386_regtab_end - = i386_regtab + sizeof(i386_regtab)/sizeof(i386_regtab[0]); - -/* segment stuff */ -seg_entry cs = { "cs", 0x2e }; -seg_entry ds = { "ds", 0x3e }; -seg_entry ss = { "ss", 0x36 }; -seg_entry es = { "es", 0x26 }; -seg_entry fs = { "fs", 0x64 }; -seg_entry gs = { "gs", 0x65 }; -seg_entry null = { "", 0x0 }; - -/* - This table is used to store the default segment register implied by all - possible memory addressing modes. - It is indexed by the mode & modrm entries of the modrm byte as follows: - index = (mode<<3) | modrm; -*/ -seg_entry *one_byte_segment_defaults[] = { - /* mode 0 */ - &ds, &ds, &ds, &ds, &null, &ds, &ds, &ds, - /* mode 1 */ - &ds, &ds, &ds, &ds, &null, &ss, &ds, &ds, - /* mode 2 */ - &ds, &ds, &ds, &ds, &null, &ss, &ds, &ds, - /* mode 3 --- not a memory reference; never referenced */ -}; - -seg_entry *two_byte_segment_defaults[] = { - /* mode 0 */ - &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds, - /* mode 1 */ - &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds, - /* mode 2 */ - &ds, &ds, &ds, &ds, &ss, &ds, &ds, &ds, - /* mode 3 --- not a memory reference; never referenced */ -}; - -prefix_entry i386_prefixtab[] = { - { "addr16", 0x67 }, /* address size prefix ==> 16bit addressing - * (How is this useful?) */ -#define WORD_PREFIX_OPCODE 0x66 - { "data16", 0x66 }, /* operand size prefix */ - { "lock", 0xf0 }, /* bus lock prefix */ - { "wait", 0x9b }, /* wait for coprocessor */ - { "cs", 0x2e }, { "ds", 0x3e }, /* segment overrides ... */ - { "es", 0x26 }, { "fs", 0x64 }, - { "gs", 0x65 }, { "ss", 0x36 }, -/* REPE & REPNE used to detect rep/repne with a non-string instruction */ -#define REPNE 0xf2 -#define REPE 0xf3 - { "rep", 0xf3 }, { "repe", 0xf3 }, /* repeat string instructions */ - { "repne", 0xf2 } -}; - -prefix_entry *i386_prefixtab_end - = i386_prefixtab + sizeof(i386_prefixtab)/sizeof(i386_prefixtab[0]); - diff --git a/gnu/gas/config/i386.c b/gnu/gas/config/i386.c deleted file mode 100644 index 2281acd06fb0..000000000000 --- a/gnu/gas/config/i386.c +++ /dev/null @@ -1,1946 +0,0 @@ -/*- - * This code is derived from software copyrighted by the Free Software - * Foundation. - * - * Modified 1991 by Donn Seeley at UUNET Technologies, Inc. - */ - -#ifndef lint -static char sccsid[] = "@(#)i386.c 6.4 (Berkeley) 5/8/91"; -#endif /* not lint */ - -/* i386.c -- Assemble code for the Intel 80386 - Copyright (C) 1989, Free Software Foundation. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - Intel 80386 machine specific gas. - Written by Eliot Dresselhaus (eliot@mgm.mit.edu). - Bugs & suggestions are completely welcome. This is free software. - Please help us make it better. -*/ - -#include <stdio.h> -#include <varargs.h> -#include <ctype.h> - -#ifdef __GNUC__ -#define alloca __builtin_alloca -#else -extern char *alloca(); -#endif -#ifdef USG -#define index strchr -#endif - -#include "as.h" -#include "read.h" -#include "flonum.h" -#include "obstack.h" -#include "frags.h" -#include "struc-symbol.h" -#include "expr.h" -#include "symbols.h" -#include "hash.h" -#include "md.h" -#include "i386.h" -#include "i386-opcode.h" - -long omagic = OMAGIC; -char FLT_CHARS[] = "fFdDxX"; -char EXP_CHARS[] = "eE"; -char line_comment_chars[] = "#"; -char comment_chars[] = "#"; - -/* tables for lexical analysis */ -static char opcode_chars[256]; -static char register_chars[256]; -static char operand_chars[256]; -static char space_chars[256]; -static char identifier_chars[256]; -static char digit_chars[256]; - -/* lexical macros */ -#define is_opcode_char(x) (opcode_chars[(unsigned char) x]) -#define is_operand_char(x) (operand_chars[(unsigned char) x]) -#define is_register_char(x) (register_chars[(unsigned char) x]) -#define is_space_char(x) (space_chars[(unsigned char) x]) -#define is_identifier_char(x) (identifier_chars[(unsigned char) x]) -#define is_digit_char(x) (digit_chars[(unsigned char) x]) - -/* put here all non-digit non-letter charcters that may occur in an operand */ -static char operand_special_chars[] = "%$-+(,)*._~/<>|&^!:"; - -static char *ordinal_names[] = { "first", "second", "third" }; /* for printfs */ - -/* md_assemble() always leaves the strings it's passed unaltered. To - effect this we maintain a stack of saved characters that we've smashed - with '\0's (indicating end of strings for various sub-fields of the - assembler instruction). */ -static char save_stack[32]; -static char *save_stack_p; /* stack pointer */ -#define END_STRING_AND_SAVE(s) *save_stack_p++ = *s; *s = '\0' -#define RESTORE_END_STRING(s) *s = *--save_stack_p - -/* The instruction we're assembling. */ -static i386_insn i; - -/* Per instruction expressionS buffers: 2 displacements & 2 immediate max. */ -static expressionS disp_expressions[2], im_expressions[2]; - -/* pointers to ebp & esp entries in reg_hash hash table */ -static reg_entry *ebp, *esp; - -static int this_operand; /* current operand we are working on */ - -/* -Interface to relax_segment. -There are 2 relax states for 386 jump insns: one for conditional & one -for unconditional jumps. This is because the these two types of jumps -add different sizes to frags when we're figuring out what sort of jump -to choose to reach a given label. */ - -/* types */ -#define COND_JUMP 1 /* conditional jump */ -#define UNCOND_JUMP 2 /* unconditional jump */ -/* sizes */ -#define BYTE 0 -#define WORD 1 -#define DWORD 2 -#define UNKNOWN_SIZE 3 - -#define ENCODE_RELAX_STATE(type,size) ((type<<2) | (size)) -#define SIZE_FROM_RELAX_STATE(s) \ - ( (((s) & 0x3) == BYTE ? 1 : (((s) & 0x3) == WORD ? 2 : 4)) ) - -const relax_typeS md_relax_table[] = { -/* - The fields are: - 1) most positive reach of this state, - 2) most negative reach of this state, - 3) how many bytes this mode will add to the size of the current frag - 4) which index into the table to try if we can't fit into this one. -*/ - {1, 1, 0, 0}, - {1, 1, 0, 0}, - {1, 1, 0, 0}, - {1, 1, 0, 0}, - - /* For now we don't use word displacement jumps: they may be - untrustworthy. */ - {127+1, -128+1, 0, ENCODE_RELAX_STATE(COND_JUMP,DWORD) }, - /* word conditionals add 3 bytes to frag: - 2 opcode prefix; 1 displacement bytes */ - {32767+2, -32768+2, 3, ENCODE_RELAX_STATE(COND_JUMP,DWORD) }, - /* dword conditionals adds 4 bytes to frag: - 1 opcode prefix; 3 displacement bytes */ - {0, 0, 4, 0}, - {1, 1, 0, 0}, - - {127+1, -128+1, 0, ENCODE_RELAX_STATE(UNCOND_JUMP,DWORD) }, - /* word jmp adds 2 bytes to frag: - 1 opcode prefix; 1 displacement bytes */ - {32767+2, -32768+2, 2, ENCODE_RELAX_STATE(UNCOND_JUMP,DWORD) }, - /* dword jmp adds 3 bytes to frag: - 0 opcode prefix; 3 displacement bytes */ - {0, 0, 3, 0}, - {1, 1, 0, 0}, - -}; - -void float_cons (), cons (); - -/* Ignore certain directives generated by gcc. This probably should - not be here. */ -void dummy () -{ - while (*input_line_pointer && *input_line_pointer != '\n') - input_line_pointer++; -} - -const pseudo_typeS md_pseudo_table[] = { - { "ffloat", float_cons, 'f' }, - { "dfloat", float_cons, 'd' }, - { "tfloat", float_cons, 'x' }, - { "value", cons, 2 }, - { "ident", dummy, 0 }, /* ignore these directives */ - { "def", dummy, 0 }, - { "optim", dummy, 0 }, /* For sun386i cc */ - { "version", dummy, 0 }, - { "ln", dummy, 0 }, - { 0, 0, 0 } -}; - -/* for interface with expression () */ -extern char * input_line_pointer; -char * index (); - -char * output_invalid (); -reg_entry * parse_register (); - -/* obstack for constructing various things in md_begin */ -struct obstack o; - -/* hash table for opcode lookup */ -static struct hash_control *op_hash = (struct hash_control *) 0; -/* hash table for register lookup */ -static struct hash_control *reg_hash = (struct hash_control *) 0; -/* hash table for prefix lookup */ -static struct hash_control *prefix_hash = (struct hash_control *) 0; - - -void md_begin () -{ - char * hash_err; - - obstack_begin (&o,4096); - - /* initialize op_hash hash table */ - op_hash = hash_new(); /* xmalloc handles error */ - - { - register template *optab; - register templates *core_optab; - char *prev_name; - - optab = i386_optab; /* setup for loop */ - prev_name = optab->name; - obstack_grow (&o, optab, sizeof(template)); - core_optab = (templates *) xmalloc (sizeof (templates)); - - for (optab++; optab < i386_optab_end; optab++) { - if (! strcmp (optab->name, prev_name)) { - /* same name as before --> append to current template list */ - obstack_grow (&o, optab, sizeof(template)); - } else { - /* different name --> ship out current template list; - add to hash table; & begin anew */ - /* Note: end must be set before start! since obstack_next_free changes - upon opstack_finish */ - core_optab->end = (template *) obstack_next_free(&o); - core_optab->start = (template *) obstack_finish(&o); - hash_err = hash_insert (op_hash, prev_name, (char *) core_optab); - if (hash_err && *hash_err) { - hash_error: - as_fatal("Internal Error: Can't hash %s: %s",prev_name, hash_err); - } - prev_name = optab->name; - core_optab = (templates *) xmalloc (sizeof(templates)); - obstack_grow (&o, optab, sizeof(template)); - } - } - } - - /* initialize reg_hash hash table */ - reg_hash = hash_new(); - { - register reg_entry *regtab; - - for (regtab = i386_regtab; regtab < i386_regtab_end; regtab++) { - hash_err = hash_insert (reg_hash, regtab->reg_name, regtab); - if (hash_err && *hash_err) goto hash_error; - } - } - - esp = (reg_entry *) hash_find (reg_hash, "esp"); - ebp = (reg_entry *) hash_find (reg_hash, "ebp"); - - /* initialize reg_hash hash table */ - prefix_hash = hash_new(); - { - register prefix_entry *prefixtab; - - for (prefixtab = i386_prefixtab; - prefixtab < i386_prefixtab_end; prefixtab++) { - hash_err = hash_insert (prefix_hash, prefixtab->prefix_name, prefixtab); - if (hash_err && *hash_err) goto hash_error; - } - } - - /* fill in lexical tables: opcode_chars, operand_chars, space_chars */ - { - register unsigned int c; - - bzero (opcode_chars, sizeof(opcode_chars)); - bzero (operand_chars, sizeof(operand_chars)); - bzero (space_chars, sizeof(space_chars)); - bzero (identifier_chars, sizeof(identifier_chars)); - bzero (digit_chars, sizeof(digit_chars)); - - for (c = 0; c < 256; c++) { - if (islower(c) || isdigit(c)) { - opcode_chars[c] = c; - register_chars[c] = c; - } else if (isupper(c)) { - opcode_chars[c] = tolower(c); - register_chars[c] = opcode_chars[c]; - } else if (c == PREFIX_SEPERATOR) { - opcode_chars[c] = c; - } else if (c == ')' || c == '(') { - register_chars[c] = c; - } - - if (isupper(c) || islower(c) || isdigit(c)) - operand_chars[c] = c; - else if (c && index(operand_special_chars, c)) - operand_chars[c] = c; - - if (isdigit(c) || c == '-') digit_chars[c] = c; - - if (isalpha(c) || c == '_' || c == '.' || isdigit(c)) - identifier_chars[c] = c; - - if (c == ' ' || c == '\t') space_chars[c] = c; - } - } -} - -void md_end() {} /* not much to do here. */ - - -#ifdef DEBUG386 - -/* debugging routines for md_assemble */ -static void pi (), pte (), pt (), pe (), ps (); - -static void pi (line, x) - char * line; - i386_insn *x; -{ - register template *p; - int i; - - fprintf (stdout, "%s: template ", line); - pte (&x->tm); - fprintf (stdout, " modrm: mode %x reg %x reg/mem %x", - x->rm.mode, x->rm.reg, x->rm.regmem); - fprintf (stdout, " base %x index %x scale %x\n", - x->bi.base, x->bi.index, x->bi.scale); - for (i = 0; i < x->operands; i++) { - fprintf (stdout, " #%d: ", i+1); - pt (x->types[i]); - fprintf (stdout, "\n"); - if (x->types[i] & Reg) fprintf (stdout, "%s\n", x->regs[i]->reg_name); - if (x->types[i] & Imm) pe (x->imms[i]); - if (x->types[i] & (Disp|Abs)) pe (x->disps[i]); - } -} - -static void pte (t) - template *t; -{ - int i; - fprintf (stdout, " %d operands ", t->operands); - fprintf (stdout, "opcode %x ", - t->base_opcode); - if (t->extension_opcode != None) - fprintf (stdout, "ext %x ", t->extension_opcode); - if (t->opcode_modifier&D) - fprintf (stdout, "D"); - if (t->opcode_modifier&W) - fprintf (stdout, "W"); - fprintf (stdout, "\n"); - for (i = 0; i < t->operands; i++) { - fprintf (stdout, " #%d type ", i+1); - pt (t->operand_types[i]); - fprintf (stdout, "\n"); - } -} - -char *seg_names[] = { -"SEG_ABSOLUTE", "SEG_TEXT", "SEG_DATA", "SEG_BSS", "SEG_UNKNOWN", -"SEG_NONE", "SEG_PASS1", "SEG_GOOF", "SEG_BIG", "SEG_DIFFERENCE" }; - -static void pe (e) - expressionS *e; -{ - fprintf (stdout, " segment %s\n", seg_names[(int) e->X_seg]); - fprintf (stdout, " add_number %d (%x)\n", - e->X_add_number, e->X_add_number); - if (e->X_add_symbol) { - fprintf (stdout, " add_symbol "); - ps (e->X_add_symbol); - fprintf (stdout, "\n"); - } - if (e->X_subtract_symbol) { - fprintf (stdout, " sub_symbol "); - ps (e->X_subtract_symbol); - fprintf (stdout, "\n"); - } -} - -#define SYMBOL_TYPE(t) \ - (((t&N_TYPE) == N_UNDF) ? "UNDEFINED" : \ - (((t&N_TYPE) == N_ABS) ? "ABSOLUTE" : \ - (((t&N_TYPE) == N_TEXT) ? "TEXT" : \ - (((t&N_TYPE) == N_DATA) ? "DATA" : \ - (((t&N_TYPE) == N_BSS) ? "BSS" : "Bad n_type!"))))) - -static void ps (s) - symbolS *s; -{ - fprintf (stdout, "%s type %s%s", - s->sy_nlist.n_un.n_name, - (s->sy_nlist.n_type&N_EXT) ? "EXTERNAL " : "", - SYMBOL_TYPE (s->sy_nlist.n_type)); -} - -struct type_name { - uint mask; - char *tname; -} type_names[] = { - { Reg8, "r8" }, { Reg16, "r16" }, { Reg32, "r32" }, { Imm8, "i8" }, - { Imm8S, "i8s" }, - { Imm16, "i16" }, { Imm32, "i32" }, { Mem8, "Mem8"}, { Mem16, "Mem16"}, - { Mem32, "Mem32"}, { BaseIndex, "BaseIndex" }, - { Abs8, "Abs8" }, { Abs16, "Abs16" }, { Abs32, "Abs32" }, - { Disp8, "d8" }, { Disp16, "d16" }, - { Disp32, "d32" }, { SReg2, "SReg2" }, { SReg3, "SReg3" }, { Acc, "Acc" }, - { InOutPortReg, "InOutPortReg" }, { ShiftCount, "ShiftCount" }, - { Imm1, "i1" }, { Control, "control reg" }, {Test, "test reg"}, - { FloatReg, "FReg"}, {FloatAcc, "FAcc"}, - { JumpAbsolute, "Jump Absolute"}, - { 0, "" } -}; - -static void pt (t) - uint t; -{ - register struct type_name *ty; - - if (t == Unknown) { - fprintf (stdout, "Unknown"); - } else { - for (ty = type_names; ty->mask; ty++) - if (t & ty->mask) fprintf (stdout, "%s, ", ty->tname); - } - fflush (stdout); -} - -#endif /* DEBUG386 */ - -/* - This is the guts of the machine-dependent assembler. LINE points to a - machine dependent instruction. This funciton is supposed to emit - the frags/bytes it assembles to. - */ -void md_assemble (line) - char *line; -{ - /* Holds temlate once we've found it. */ - register template * t; - - /* Possible templates for current insn */ - templates *current_templates = (templates *) 0; - - /* Initialize globals. */ - bzero (&i, sizeof(i)); - bzero (disp_expressions, sizeof(disp_expressions)); - bzero (im_expressions, sizeof(im_expressions)); - save_stack_p = save_stack; /* reset stack pointer */ - - /* Fist parse an opcode & call i386_operand for the operands. - We assume that the scrubber has arranged it so that line[0] is the valid - start of a (possibly prefixed) opcode. */ - { - register char *l = line; /* Fast place to put LINE. */ - - /* TRUE if operand is pending after ','. */ - uint expecting_operand = 0; - /* TRUE if we found a prefix only acceptable with string insns. */ - uint expecting_string_instruction = 0; - /* Non-zero if operand parens not balenced. */ - uint paren_not_balenced; - char * token_start = l; - - while (! is_space_char(*l) && *l != END_OF_INSN) { - if (! is_opcode_char(*l)) { - as_bad ("invalid character %s in opcode", output_invalid(*l)); - return; - } else if (*l != PREFIX_SEPERATOR) { - *l = opcode_chars[(unsigned char) *l]; /* fold case of opcodes */ - l++; - } else { /* this opcode's got a prefix */ - register int q; - register prefix_entry * prefix; - - if (l == token_start) { - as_bad ("expecting prefix; got nothing"); - return; - } - END_STRING_AND_SAVE (l); - prefix = (prefix_entry *) hash_find (prefix_hash, token_start); - if (! prefix) { - as_bad ("no such opcode prefix ('%s')", token_start); - return; - } - RESTORE_END_STRING (l); - /* check for repeated prefix */ - for (q = 0; q < i.prefixes; q++) - if (i.prefix[q] == prefix->prefix_code) { - as_bad ("same prefix used twice; you don't really want this!"); - return; - } - if (i.prefixes == MAX_PREFIXES) { - as_bad ("too many opcode prefixes"); - return; - } - i.prefix[i.prefixes++] = prefix->prefix_code; - if (prefix->prefix_code == REPE || prefix->prefix_code == REPNE) - expecting_string_instruction = TRUE; - /* skip past PREFIX_SEPERATOR and reset token_start */ - token_start = ++l; - } - } - END_STRING_AND_SAVE (l); - if (token_start == l) { - as_bad ("expecting opcode; got nothing"); - return; - } - - /* Lookup insn in hash; try intel & att naming conventions if appropriate; - that is: we only use the opcode suffix 'b' 'w' or 'l' if we need to. */ - current_templates = (templates *) hash_find (op_hash, token_start); - if (! current_templates) { - int last_index = strlen(token_start) - 1; - char last_char = token_start[last_index]; - switch (last_char) { - case DWORD_OPCODE_SUFFIX: - case WORD_OPCODE_SUFFIX: - case BYTE_OPCODE_SUFFIX: - token_start[last_index] = '\0'; - current_templates = (templates *) hash_find (op_hash, token_start); - token_start[last_index] = last_char; - i.suffix = last_char; - } - if (!current_templates) { - as_bad ("no such 386 instruction: `%s'", token_start); return; - } - } - RESTORE_END_STRING (l); - - /* check for rep/repne without a string instruction */ - if (expecting_string_instruction && - ! IS_STRING_INSTRUCTION (current_templates-> - start->base_opcode)) { - as_bad ("expecting string instruction after rep/repne"); - return; - } - - /* There may be operands to parse. */ - if (*l != END_OF_INSN && - /* For string instructions, we ignore any operands if given. This - kludges, for example, 'rep/movsb %ds:(%esi), %es:(%edi)' where - the operands are always going to be the same, and are not really - encoded in machine code. */ - ! IS_STRING_INSTRUCTION (current_templates-> - start->base_opcode)) { - /* parse operands */ - do { - /* skip optional white space before operand */ - while (! is_operand_char(*l) && *l != END_OF_INSN) { - if (! is_space_char(*l)) { - as_bad ("invalid character %s before %s operand", - output_invalid(*l), - ordinal_names[i.operands]); - return; - } - l++; - } - token_start = l; /* after white space */ - paren_not_balenced = 0; - while (paren_not_balenced || *l != ',') { - if (*l == END_OF_INSN) { - if (paren_not_balenced) { - as_bad ("unbalenced parenthesis in %s operand.", - ordinal_names[i.operands]); - return; - } else break; /* we are done */ - } else if (! is_operand_char(*l)) { - as_bad ("invalid character %s in %s operand", - output_invalid(*l), - ordinal_names[i.operands]); - return; - } - if (*l == '(') ++paren_not_balenced; - if (*l == ')') --paren_not_balenced; - l++; - } - if (l != token_start) { /* yes, we've read in another operand */ - uint operand_ok; - this_operand = i.operands++; - if (i.operands > MAX_OPERANDS) { - as_bad ("spurious operands; (%d operands/instruction max)", - MAX_OPERANDS); - return; - } - /* now parse operand adding info to 'i' as we go along */ - END_STRING_AND_SAVE (l); - operand_ok = i386_operand (token_start); - RESTORE_END_STRING (l); /* restore old contents */ - if (!operand_ok) return; - } else { - if (expecting_operand) { - expecting_operand_after_comma: - as_bad ("expecting operand after ','; got nothing"); - return; - } - if (*l == ',') { - as_bad ("expecting operand before ','; got nothing"); - return; - } - } - - /* now *l must be either ',' or END_OF_INSN */ - if (*l == ',') { - if (*++l == END_OF_INSN) { /* just skip it, if it's \n complain */ - goto expecting_operand_after_comma; - } - expecting_operand = TRUE; - } - } while (*l != END_OF_INSN); /* until we get end of insn */ - } - } - - /* Now we've parsed the opcode into a set of templates, and have the - operands at hand. - Next, we find a template that matches the given insn, - making sure the overlap of the given operands types is consistent - with the template operand types. */ - -#define MATCH(overlap,given_type) \ - (overlap && \ - (overlap & (JumpAbsolute|BaseIndex|Mem8)) \ - == (given_type & (JumpAbsolute|BaseIndex|Mem8))) - - /* If m0 and m1 are register matches they must be consistent - with the expected operand types t0 and t1. - That is, if both m0 & m1 are register matches - i.e. ( ((m0 & (Reg)) && (m1 & (Reg)) ) ? - then, either 1. or 2. must be true: - 1. the expected operand type register overlap is null: - (t0 & t1 & Reg) == 0 - AND - the given register overlap is null: - (m0 & m1 & Reg) == 0 - 2. the expected operand type register overlap == the given - operand type overlap: (t0 & t1 & m0 & m1 & Reg). - */ -#define CONSISTENT_REGISTER_MATCH(m0, m1, t0, t1) \ - ( ((m0 & (Reg)) && (m1 & (Reg))) ? \ - ( ((t0 & t1 & (Reg)) == 0 && (m0 & m1 & (Reg)) == 0) || \ - ((t0 & t1) & (m0 & m1) & (Reg)) \ - ) : 1) - { - register uint overlap0, overlap1; - expressionS * exp; - uint overlap2; - uint found_reverse_match; - - overlap0 = overlap1 = overlap2 = found_reverse_match = 0; - for (t = current_templates->start; - t < current_templates->end; - t++) { - - /* must have right number of operands */ - if (i.operands != t->operands) continue; - else if (!t->operands) break; /* 0 operands always matches */ - - overlap0 = i.types[0] & t->operand_types[0]; - switch (t->operands) { - case 1: - if (! MATCH (overlap0,i.types[0])) continue; - break; - case 2: case 3: - overlap1 = i.types[1] & t->operand_types[1]; - if (! MATCH (overlap0,i.types[0]) || - ! MATCH (overlap1,i.types[1]) || - ! CONSISTENT_REGISTER_MATCH(overlap0, overlap1, - t->operand_types[0], - t->operand_types[1])) { - - /* check if other direction is valid ... */ - if (! (t->opcode_modifier & COMES_IN_BOTH_DIRECTIONS)) - continue; - - /* try reversing direction of operands */ - overlap0 = i.types[0] & t->operand_types[1]; - overlap1 = i.types[1] & t->operand_types[0]; - if (! MATCH (overlap0,i.types[0]) || - ! MATCH (overlap1,i.types[1]) || - ! CONSISTENT_REGISTER_MATCH (overlap0, overlap1, - t->operand_types[0], - t->operand_types[1])) { - /* does not match either direction */ - continue; - } - /* found a reverse match here -- slip through */ - /* found_reverse_match holds which of D or FloatD we've found */ - found_reverse_match = t->opcode_modifier & COMES_IN_BOTH_DIRECTIONS; - } /* endif: not forward match */ - /* found either forward/reverse 2 operand match here */ - if (t->operands == 3) { - overlap2 = i.types[2] & t->operand_types[2]; - if (! MATCH (overlap2,i.types[2]) || - ! CONSISTENT_REGISTER_MATCH (overlap0, overlap2, - t->operand_types[0], - t->operand_types[2]) || - ! CONSISTENT_REGISTER_MATCH (overlap1, overlap2, - t->operand_types[1], - t->operand_types[2])) - continue; - } - /* found either forward/reverse 2 or 3 operand match here: - slip through to break */ - } - break; /* we've found a match; break out of loop */ - } /* for (t = ... */ - if (t == current_templates->end) { /* we found no match */ - as_bad ("operands given don't match any known 386 instruction"); - return; - } - - /* Copy the template we found (we may change it!). */ - bcopy (t, &i.tm, sizeof (template)); - t = &i.tm; /* alter new copy of template */ - - /* If there's no opcode suffix we try to invent one based on register - operands. */ - if (! i.suffix && i.reg_operands) { - /* We take i.suffix from the LAST register operand specified. This - assumes that the last register operands is the destination register - operand. */ - int o; - for (o = 0; o < MAX_OPERANDS; o++) - if (i.types[o] & Reg) { - i.suffix = (i.types[o] == Reg8) ? BYTE_OPCODE_SUFFIX : - (i.types[o] == Reg16) ? WORD_OPCODE_SUFFIX : - DWORD_OPCODE_SUFFIX; - } - } - - /* Make still unresolved immediate matches conform to size of immediate - given in i.suffix. Note: overlap2 cannot be an immediate! - We assume this. */ - if ((overlap0 & (Imm8|Imm8S|Imm16|Imm32)) - && overlap0 != Imm8 && overlap0 != Imm8S - && overlap0 != Imm16 && overlap0 != Imm32) { - if (! i.suffix) { - as_bad ("no opcode suffix given; can't determine immediate size"); - return; - } - overlap0 &= (i.suffix == BYTE_OPCODE_SUFFIX ? (Imm8|Imm8S) : - (i.suffix == WORD_OPCODE_SUFFIX ? Imm16 : Imm32)); - } - if ((overlap1 & (Imm8|Imm8S|Imm16|Imm32)) - && overlap1 != Imm8 && overlap1 != Imm8S - && overlap1 != Imm16 && overlap1 != Imm32) { - if (! i.suffix) { - as_bad ("no opcode suffix given; can't determine immediate size"); - return; - } - overlap1 &= (i.suffix == BYTE_OPCODE_SUFFIX ? (Imm8|Imm8S) : - (i.suffix == WORD_OPCODE_SUFFIX ? Imm16 : Imm32)); - } - - i.types[0] = overlap0; - i.types[1] = overlap1; - i.types[2] = overlap2; - - if (overlap0 & ImplicitRegister) i.reg_operands--; - if (overlap1 & ImplicitRegister) i.reg_operands--; - if (overlap2 & ImplicitRegister) i.reg_operands--; - if (overlap0 & Imm1) i.imm_operands = 0; /* kludge for shift insns */ - - if (found_reverse_match) { - uint save; - save = t->operand_types[0]; - t->operand_types[0] = t->operand_types[1]; - t->operand_types[1] = save; - } - - /* Finalize opcode. First, we change the opcode based on the operand - size given by i.suffix: we never have to change things for byte insns, - or when no opcode suffix is need to size the operands. */ - - if (! i.suffix && (t->opcode_modifier & W)) { - as_bad ("no opcode suffix given and no register operands; can't size instruction"); - return; - } - - if (i.suffix && i.suffix != BYTE_OPCODE_SUFFIX) { - /* Select between byte and word/dword operations. */ - if (t->opcode_modifier & W) - t->base_opcode |= W; - /* Now select between word & dword operations via the - operand size prefix. */ - if (i.suffix == WORD_OPCODE_SUFFIX) { - if (i.prefixes == MAX_PREFIXES) { - as_bad ("%d prefixes given and 'w' opcode suffix gives too many prefixes", - MAX_PREFIXES); - return; - } - i.prefix[i.prefixes++] = WORD_PREFIX_OPCODE; - } - } - - /* For insns with operands there are more diddles to do to the opcode. */ - if (i.operands) { - /* If we found a reverse match we must alter the opcode direction bit - found_reverse_match holds bit to set (different for int & - float insns). */ - - if (found_reverse_match) { - t->base_opcode |= found_reverse_match; - } - - /* - The imul $imm, %reg instruction is converted into - imul $imm, %reg, %reg. */ - if (t->opcode_modifier & imulKludge) { - i.regs[2] = i.regs[1]; /* Pretend we saw the 3 operand case. */ - i.reg_operands = 2; - } - - /* Certain instructions expect the destination to be in the i.rm.reg - field. This is by far the exceptional case. For these instructions, - if the source operand is a register, we must reverse the i.rm.reg - and i.rm.regmem fields. We accomplish this by faking that the - two register operands were given in the reverse order. */ - if ((t->opcode_modifier & ReverseRegRegmem) && i.reg_operands == 2) { - uint first_reg_operand = (i.types[0] & Reg) ? 0 : 1; - uint second_reg_operand = first_reg_operand + 1; - reg_entry *tmp = i.regs[first_reg_operand]; - i.regs[first_reg_operand] = i.regs[second_reg_operand]; - i.regs[second_reg_operand] = tmp; - } - - if (t->opcode_modifier & ShortForm) { - /* The register or float register operand is in operand 0 or 1. */ - uint o = (i.types[0] & (Reg|FloatReg)) ? 0 : 1; - /* Register goes in low 3 bits of opcode. */ - t->base_opcode |= i.regs[o]->reg_num; - } else if (t->opcode_modifier & ShortFormW) { - /* Short form with 0x8 width bit. Register is always dest. operand */ - t->base_opcode |= i.regs[1]->reg_num; - if (i.suffix == WORD_OPCODE_SUFFIX || - i.suffix == DWORD_OPCODE_SUFFIX) - t->base_opcode |= 0x8; - } else if (t->opcode_modifier & Seg2ShortForm) { - if (t->base_opcode == POP_SEG_SHORT && i.regs[0]->reg_num == 1) { - as_bad ("you can't 'pop cs' on the 386."); - return; - } - t->base_opcode |= (i.regs[0]->reg_num << 3); - } else if (t->opcode_modifier & Seg3ShortForm) { - /* 'push %fs' is 0x0fa0; 'pop %fs' is 0x0fa1. - 'push %gs' is 0x0fa8; 'pop %fs' is 0x0fa9. - So, only if i.regs[0]->reg_num == 5 (%gs) do we need - to change the opcode. */ - if (i.regs[0]->reg_num == 5) - t->base_opcode |= 0x08; - } else if (t->opcode_modifier & Modrm) { - /* The opcode is completed (modulo t->extension_opcode which must - be put into the modrm byte. - Now, we make the modrm & index base bytes based on all the info - we've collected. */ - - /* i.reg_operands MUST be the number of real register operands; - implicit registers do not count. */ - if (i.reg_operands == 2) { - uint source, dest; - source = (i.types[0] & (Reg|SReg2|SReg3|Control|Debug|Test)) ? 0 : 1; - dest = source + 1; - i.rm.mode = 3; - /* We must be careful to make sure that all segment/control/test/ - debug registers go into the i.rm.reg field (despite the whether - they are source or destination operands). */ - if (i.regs[dest]->reg_type & (SReg2|SReg3|Control|Debug|Test)) { - i.rm.reg = i.regs[dest]->reg_num; - i.rm.regmem = i.regs[source]->reg_num; - } else { - i.rm.reg = i.regs[source]->reg_num; - i.rm.regmem = i.regs[dest]->reg_num; - } - } else { /* if it's not 2 reg operands... */ - if (i.mem_operands) { - uint fake_zero_displacement = FALSE; - uint o = (i.types[0] & Mem) ? 0 : ((i.types[1] & Mem) ? 1 : 2); - - /* Encode memory operand into modrm byte and base index byte. */ - - if (i.base_reg == esp && ! i.index_reg) { - /* <disp>(%esp) becomes two byte modrm with no index register. */ - i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING; - i.rm.mode = MODE_FROM_DISP_SIZE (i.types[o]); - i.bi.base = ESP_REG_NUM; - i.bi.index = NO_INDEX_REGISTER; - i.bi.scale = 0; /* Must be zero! */ - } else if (i.base_reg == ebp && !i.index_reg) { - if (! (i.types[o] & Disp)) { - /* Must fake a zero byte displacement. - There is no direct way to code '(%ebp)' directly. */ - fake_zero_displacement = TRUE; - /* fake_zero_displacement code does not set this. */ - i.types[o] |= Disp8; - } - i.rm.mode = MODE_FROM_DISP_SIZE (i.types[o]); - i.rm.regmem = EBP_REG_NUM; - } else if (! i.base_reg && (i.types[o] & BaseIndex)) { - /* There are three cases here. - Case 1: '<32bit disp>(,1)' -- indirect absolute. - (Same as cases 2 & 3 with NO index register) - Case 2: <32bit disp> (,<index>) -- no base register with disp - Case 3: (, <index>) --- no base register; - no disp (must add 32bit 0 disp). */ - i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING; - i.rm.mode = 0; /* 32bit mode */ - i.bi.base = NO_BASE_REGISTER; - i.types[o] &= ~Disp; - i.types[o] |= Disp32; /* Must be 32bit! */ - if (i.index_reg) { /* case 2 or case 3 */ - i.bi.index = i.index_reg->reg_num; - i.bi.scale = i.log2_scale_factor; - if (i.disp_operands == 0) - fake_zero_displacement = TRUE; /* case 3 */ - } else { - i.bi.index = NO_INDEX_REGISTER; - i.bi.scale = 0; - } - } else if (i.disp_operands && !i.base_reg && !i.index_reg) { - /* Operand is just <32bit disp> */ - i.rm.regmem = EBP_REG_NUM; - i.rm.mode = 0; - i.types[o] &= ~Disp; - i.types[o] |= Disp32; - } else { - /* It's not a special case; rev'em up. */ - i.rm.regmem = i.base_reg->reg_num; - i.rm.mode = MODE_FROM_DISP_SIZE (i.types[o]); - if (i.index_reg) { - i.rm.regmem = ESCAPE_TO_TWO_BYTE_ADDRESSING; - i.bi.base = i.base_reg->reg_num; - i.bi.index = i.index_reg->reg_num; - i.bi.scale = i.log2_scale_factor; - if (i.base_reg == ebp && i.disp_operands == 0) { /* pace */ - fake_zero_displacement = TRUE; - i.types[o] |= Disp8; - i.rm.mode = MODE_FROM_DISP_SIZE (i.types[o]); - } - } - } - if (fake_zero_displacement) { - /* Fakes a zero displacement assuming that i.types[o] holds - the correct displacement size. */ - exp = &disp_expressions[i.disp_operands++]; - i.disps[o] = exp; - exp->X_seg = SEG_ABSOLUTE; - exp->X_add_number = 0; - exp->X_add_symbol = (symbolS *) 0; - exp->X_subtract_symbol = (symbolS *) 0; - } - - /* Select the correct segment for the memory operand. */ - if (i.seg) { - uint seg_index; - seg_entry * default_seg; - - if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING) { - seg_index = (i.rm.mode<<3) | i.bi.base; - default_seg = two_byte_segment_defaults [seg_index]; - } else { - seg_index = (i.rm.mode<<3) | i.rm.regmem; - default_seg = one_byte_segment_defaults [seg_index]; - } - /* If the specified segment is not the default, use an - opcode prefix to select it */ - if (i.seg != default_seg) { - if (i.prefixes == MAX_PREFIXES) { - as_bad ("%d prefixes given and %s segment override gives too many prefixes", - MAX_PREFIXES, i.seg->seg_name); - return; - } - i.prefix[i.prefixes++] = i.seg->seg_prefix; - } - } - } - - /* Fill in i.rm.reg or i.rm.regmem field with register operand - (if any) based on t->extension_opcode. Again, we must be careful - to make sure that segment/control/debug/test registers are coded - into the i.rm.reg field. */ - if (i.reg_operands) { - uint o = - (i.types[0] & (Reg|SReg2|SReg3|Control|Debug|Test)) ? 0 : - (i.types[1] & (Reg|SReg2|SReg3|Control|Debug|Test)) ? 1 : 2; - /* If there is an extension opcode to put here, the register number - must be put into the regmem field. */ - if (t->extension_opcode != None) - i.rm.regmem = i.regs[o]->reg_num; - else i.rm.reg = i.regs[o]->reg_num; - - /* Now, if no memory operand has set i.rm.mode = 0, 1, 2 - we must set it to 3 to indicate this is a register operand - int the regmem field */ - if (! i.mem_operands) i.rm.mode = 3; - } - - /* Fill in i.rm.reg field with extension opcode (if any). */ - if (t->extension_opcode != None) - i.rm.reg = t->extension_opcode; - } - } - } - } - - /* Handle conversion of 'int $3' --> special int3 insn. */ - if (t->base_opcode == INT_OPCODE && i.imms[0]->X_add_number == 3) { - t->base_opcode = INT3_OPCODE; - i.imm_operands = 0; - } - - /* We are ready to output the insn. */ - { - register char * p; - - /* Output jumps. */ - if (t->opcode_modifier & Jump) { - int n = i.disps[0]->X_add_number; - - switch (i.disps[0]->X_seg) { - case SEG_ABSOLUTE: - if (FITS_IN_SIGNED_BYTE (n)) { - p = frag_more (2); - p[0] = t->base_opcode; - p[1] = n; -#if 0 /* leave out 16 bit jumps - pace */ - } else if (FITS_IN_SIGNED_WORD (n)) { - p = frag_more (4); - p[0] = WORD_PREFIX_OPCODE; - p[1] = t->base_opcode; - md_number_to_chars (&p[2], n, 2); -#endif - } else { /* It's an absolute dword displacement. */ - if (t->base_opcode == JUMP_PC_RELATIVE) { /* pace */ - /* unconditional jump */ - p = frag_more (5); - p[0] = 0xe9; - md_number_to_chars (&p[1], n, 4); - } else { - /* conditional jump */ - p = frag_more (6); - p[0] = TWO_BYTE_OPCODE_ESCAPE; - p[1] = t->base_opcode + 0x10; - md_number_to_chars (&p[2], n, 4); - } - } - break; - default: - /* It's a symbol; end frag & setup for relax. - Make sure there are 6 chars left in the current frag; if not - we'll have to start a new one. */ - /* I caught it failing with obstack_room == 6, - so I changed to <= pace */ - if (obstack_room (&frags) <= 6) { - frag_wane(frag_now); - frag_new (0); - } - p = frag_more (1); - p[0] = t->base_opcode; - frag_var (rs_machine_dependent, - 6, /* 2 opcode/prefix + 4 displacement */ - 1, - ((uchar) *p == JUMP_PC_RELATIVE - ? ENCODE_RELAX_STATE (UNCOND_JUMP, BYTE) - : ENCODE_RELAX_STATE (COND_JUMP, BYTE)), - i.disps[0]->X_add_symbol, - n, p); - break; - } - } else if (t->opcode_modifier & (JumpByte|JumpDword)) { - int size = (t->opcode_modifier & JumpByte) ? 1 : 4; - int n = i.disps[0]->X_add_number; - - if (FITS_IN_UNSIGNED_BYTE(t->base_opcode)) { - FRAG_APPEND_1_CHAR (t->base_opcode); - } else { - p = frag_more (2); /* opcode can be at most two bytes */ - /* put out high byte first: can't use md_number_to_chars! */ - *p++ = (t->base_opcode >> 8) & 0xff; - *p = t->base_opcode & 0xff; - } - - p = frag_more (size); - switch (i.disps[0]->X_seg) { - case SEG_ABSOLUTE: - md_number_to_chars (p, n, size); - if (size == 1 && ! FITS_IN_SIGNED_BYTE (n)) { - as_bad ("loop/jecx only takes byte displacement; %d shortened to %d", - n, *p); - } - break; - default: - fix_new (frag_now, p - frag_now->fr_literal, size, - i.disps[0]->X_add_symbol, i.disps[0]->X_subtract_symbol, - i.disps[0]->X_add_number, 1); - break; - } - } else if (t->opcode_modifier & JumpInterSegment) { - p = frag_more (1 + 2 + 4); /* 1 opcode; 2 segment; 4 offset */ - p[0] = t->base_opcode; - if (i.imms[1]->X_seg == SEG_ABSOLUTE) - md_number_to_chars (p + 1, i.imms[1]->X_add_number, 4); - else - fix_new (frag_now, p + 1 - frag_now->fr_literal, 4, - i.imms[1]->X_add_symbol, - i.imms[1]->X_subtract_symbol, - i.imms[1]->X_add_number, 0); - if (i.imms[0]->X_seg != SEG_ABSOLUTE) - as_bad ("can't handle non absolute segment in long call/jmp"); - md_number_to_chars (p + 5, i.imms[0]->X_add_number, 2); - } else { - /* Output normal instructions here. */ - register char *q; - - /* First the prefix bytes. */ - for (q = i.prefix; q < i.prefix + i.prefixes; q++) { - p = frag_more (1); - md_number_to_chars (p, (uint) *q, 1); - } - - /* Now the opcode; be careful about word order here! */ - if (FITS_IN_UNSIGNED_BYTE(t->base_opcode)) { - FRAG_APPEND_1_CHAR (t->base_opcode); - } else if (FITS_IN_UNSIGNED_WORD(t->base_opcode)) { - p = frag_more (2); - /* put out high byte first: can't use md_number_to_chars! */ - *p++ = (t->base_opcode >> 8) & 0xff; - *p = t->base_opcode & 0xff; - } else { /* opcode is either 3 or 4 bytes */ - if (t->base_opcode & 0xff000000) { - p = frag_more (4); - *p++ = (t->base_opcode >> 24) & 0xff; - } else p = frag_more (3); - *p++ = (t->base_opcode >> 16) & 0xff; - *p++ = (t->base_opcode >> 8) & 0xff; - *p = (t->base_opcode ) & 0xff; - } - - /* Now the modrm byte and base index byte (if present). */ - if (t->opcode_modifier & Modrm) { - p = frag_more (1); - /* md_number_to_chars (p, i.rm, 1); */ - md_number_to_chars (p, (i.rm.regmem<<0 | i.rm.reg<<3 | i.rm.mode<<6), 1); - /* If i.rm.regmem == ESP (4) && i.rm.mode != Mode 3 (Register mode) - ==> need second modrm byte. */ - if (i.rm.regmem == ESCAPE_TO_TWO_BYTE_ADDRESSING && i.rm.mode != 3) { - p = frag_more (1); - /* md_number_to_chars (p, i.bi, 1); */ - md_number_to_chars (p,(i.bi.base<<0 | i.bi.index<<3 | i.bi.scale<<6), 1); - } - } - - if (i.disp_operands) { - register int n; - - for (n = 0; n < i.operands; n++) { - if (i.disps[n]) { - if (i.disps[n]->X_seg == SEG_ABSOLUTE) { - if (i.types[n] & (Disp8|Abs8)) { - p = frag_more (1); - md_number_to_chars (p, i.disps[n]->X_add_number, 1); - } else if (i.types[n] & (Disp16|Abs16)) { - p = frag_more (2); - md_number_to_chars (p, i.disps[n]->X_add_number, 2); - } else { /* Disp32|Abs32 */ - p = frag_more (4); - md_number_to_chars (p, i.disps[n]->X_add_number, 4); - } - } else { /* not SEG_ABSOLUTE */ - /* need a 32-bit fixup (don't support 8bit non-absolute disps) */ - p = frag_more (4); - fix_new (frag_now, p - frag_now->fr_literal, 4, - i.disps[n]->X_add_symbol, i.disps[n]->X_subtract_symbol, - i.disps[n]->X_add_number, 0); - } - } - } - } /* end displacement output */ - - /* output immediate */ - if (i.imm_operands) { - register int n; - - for (n = 0; n < i.operands; n++) { - if (i.imms[n]) { - if (i.imms[n]->X_seg == SEG_ABSOLUTE) { - if (i.types[n] & (Imm8|Imm8S)) { - p = frag_more (1); - md_number_to_chars (p, i.imms[n]->X_add_number, 1); - } else if (i.types[n] & Imm16) { - p = frag_more (2); - md_number_to_chars (p, i.imms[n]->X_add_number, 2); - } else { - p = frag_more (4); - md_number_to_chars (p, i.imms[n]->X_add_number, 4); - } - } else { /* not SEG_ABSOLUTE */ - /* need a 32-bit fixup (don't support 8bit non-absolute ims) */ - /* try to support other sizes ... */ - int size; - if (i.types[n] & (Imm8|Imm8S)) - size = 1; - else if (i.types[n] & Imm16) - size = 2; - else - size = 4; - p = frag_more (size); - fix_new (frag_now, p - frag_now->fr_literal, size, - i.imms[n]->X_add_symbol, i.imms[n]->X_subtract_symbol, - i.imms[n]->X_add_number, 0); - } - } - } - } /* end immediate output */ - } - -#ifdef DEBUG386 - if (flagseen ['D']) { - pi (line, &i); - } -#endif /* DEBUG386 */ - - } - return; -} - -/* Parse OPERAND_STRING into the i386_insn structure I. Returns non-zero - on error. */ - -int i386_operand (operand_string) - char *operand_string; -{ - register char *op_string = operand_string; - - /* Address of '\0' at end of operand_string. */ - char * end_of_operand_string = operand_string + strlen(operand_string); - - /* Start and end of displacement string expression (if found). */ - char * displacement_string_start = 0; - char * displacement_string_end; - - /* We check for an absolute prefix (differentiating, - for example, 'jmp pc_relative_label' from 'jmp *absolute_label'. */ - if (*op_string == ABSOLUTE_PREFIX) { - op_string++; - i.types[this_operand] |= JumpAbsolute; - } - - /* Check if operand is a register. */ - if (*op_string == REGISTER_PREFIX) { - register reg_entry * r; - if (! (r = parse_register (op_string))) { - as_bad ("bad register name ('%s')", op_string); - return 0; - } - /* Check for segment override, rather than segment register by - searching for ':' after %<x>s where <x> = s, c, d, e, f, g. */ - if ((r->reg_type & (SReg2|SReg3)) && op_string[3] == ':') { - switch (r->reg_num) { - case 0: - i.seg = &es; break; - case 1: - i.seg = &cs; break; - case 2: - i.seg = &ss; break; - case 3: - i.seg = &ds; break; - case 4: - i.seg = &fs; break; - case 5: - i.seg = &gs; break; - } - op_string += 4; /* skip % <x> s : */ - operand_string = op_string; /* Pretend given string starts here. */ - if (!is_digit_char(*op_string) && !is_identifier_char(*op_string) - && *op_string != '(' && *op_string != ABSOLUTE_PREFIX) { - as_bad ("bad memory operand after segment override"); - return 0; - } - /* Handle case of %es:*foo. */ - if (*op_string == ABSOLUTE_PREFIX) { - op_string++; - i.types[this_operand] |= JumpAbsolute; - } - goto do_memory_reference; - } - i.types[this_operand] |= r->reg_type; - i.regs[this_operand] = r; - i.reg_operands++; - } else if (*op_string == IMMEDIATE_PREFIX) { /* ... or an immediate */ - char * save_input_line_pointer; - register expressionS *exp; - segT exp_seg; - if (i.imm_operands == MAX_IMMEDIATE_OPERANDS) { - as_bad ("only 1 or 2 immediate operands are allowed"); - return 0; - } - exp = &im_expressions[i.imm_operands++]; - i.imms [this_operand] = exp; - save_input_line_pointer = input_line_pointer; - input_line_pointer = ++op_string; /* must advance op_string! */ - exp_seg = expression (exp); - input_line_pointer = save_input_line_pointer; - switch (exp_seg) { - case SEG_NONE: /* missing or bad expr becomes absolute 0 */ - as_bad ("missing or invalid immediate expression '%s' taken as 0", - operand_string); - exp->X_seg = SEG_ABSOLUTE; - exp->X_add_number = 0; - exp->X_add_symbol = (symbolS *) 0; - exp->X_subtract_symbol = (symbolS *) 0; - i.types[this_operand] |= Imm; - break; - case SEG_ABSOLUTE: - i.types[this_operand] |= SMALLEST_IMM_TYPE (exp->X_add_number); - break; - case SEG_TEXT: case SEG_DATA: case SEG_BSS: case SEG_UNKNOWN: - i.types[this_operand] |= Imm32; /* this is an address ==> 32bit */ - break; - default: -seg_unimplemented: - as_bad ("Unimplemented segment type %d in parse_operand", exp_seg); - return 0; - } - /* shorten this type of this operand if the instruction wants - * fewer bits than are present in the immediate. The bit field - * code can put out 'andb $0xffffff, %al', for example. pace - * also 'movw $foo,(%eax)' - */ - switch (i.suffix) { - case WORD_OPCODE_SUFFIX: - i.types[this_operand] |= Imm16; - break; - case BYTE_OPCODE_SUFFIX: - i.types[this_operand] |= Imm16 | Imm8 | Imm8S; - break; - } - } else if (is_digit_char(*op_string) || is_identifier_char(*op_string) - || *op_string == '(') { - /* This is a memory reference of some sort. */ - register char * base_string; - uint found_base_index_form; - - do_memory_reference: - if (i.mem_operands == MAX_MEMORY_OPERANDS) { - as_bad ("more than 1 memory reference in instruction"); - return 0; - } - i.mem_operands++; - - /* Determine type of memory operand from opcode_suffix; - no opcode suffix implies general memory references. */ - switch (i.suffix) { - case BYTE_OPCODE_SUFFIX: - i.types[this_operand] |= Mem8; - break; - case WORD_OPCODE_SUFFIX: - i.types[this_operand] |= Mem16; - break; - case DWORD_OPCODE_SUFFIX: - default: - i.types[this_operand] |= Mem32; - } - - /* Check for base index form. We detect the base index form by - looking for an ')' at the end of the operand, searching - for the '(' matching it, and finding a REGISTER_PREFIX or ',' - after it. */ - base_string = end_of_operand_string - 1; - found_base_index_form = FALSE; - if (*base_string == ')') { - uint parens_balenced = 1; - /* We've already checked that the number of left & right ()'s are equal, - so this loop will not be infinite. */ - do { - base_string--; - if (*base_string == ')') parens_balenced++; - if (*base_string == '(') parens_balenced--; - } while (parens_balenced); - base_string++; /* Skip past '('. */ - if (*base_string == REGISTER_PREFIX || *base_string == ',') - found_base_index_form = TRUE; - } - - /* If we can't parse a base index register expression, we've found - a pure displacement expression. We set up displacement_string_start - and displacement_string_end for the code below. */ - if (! found_base_index_form) { - displacement_string_start = op_string; - displacement_string_end = end_of_operand_string; - } else { - char *base_reg_name, *index_reg_name, *num_string; - int num; - - i.types[this_operand] |= BaseIndex; - - /* If there is a displacement set-up for it to be parsed later. */ - if (base_string != op_string + 1) { - displacement_string_start = op_string; - displacement_string_end = base_string - 1; - } - - /* Find base register (if any). */ - if (*base_string != ',') { - base_reg_name = base_string++; - /* skip past register name & parse it */ - while (isalpha(*base_string)) base_string++; - if (base_string == base_reg_name+1) { - as_bad ("can't find base register name after '(%c'", - REGISTER_PREFIX); - return 0; - } - END_STRING_AND_SAVE (base_string); - if (! (i.base_reg = parse_register (base_reg_name))) { - as_bad ("bad base register name ('%s')", base_reg_name); - return 0; - } - RESTORE_END_STRING (base_string); - } - - /* Now check seperator; must be ',' ==> index reg - OR num ==> no index reg. just scale factor - OR ')' ==> end. (scale factor = 1) */ - if (*base_string != ',' && *base_string != ')') { - as_bad ("expecting ',' or ')' after base register in `%s'", - operand_string); - return 0; - } - - /* There may index reg here; and there may be a scale factor. */ - if (*base_string == ',' && *(base_string+1) == REGISTER_PREFIX) { - index_reg_name = ++base_string; - while (isalpha(*++base_string)); - END_STRING_AND_SAVE (base_string); - if (! (i.index_reg = parse_register(index_reg_name))) { - as_bad ("bad index register name ('%s')", index_reg_name); - return 0; - } - RESTORE_END_STRING (base_string); - } - - /* Check for scale factor. */ - if (*base_string == ',' && isdigit(*(base_string+1))) { - num_string = ++base_string; - while (is_digit_char(*base_string)) base_string++; - if (base_string == num_string) { - as_bad ("can't find a scale factor after ','"); - return 0; - } - END_STRING_AND_SAVE (base_string); - /* We've got a scale factor. */ - if (! sscanf (num_string, "%d", &num)) { - as_bad ("can't parse scale factor from '%s'", num_string); - return 0; - } - RESTORE_END_STRING (base_string); - switch (num) { /* must be 1 digit scale */ - case 1: i.log2_scale_factor = 0; break; - case 2: i.log2_scale_factor = 1; break; - case 4: i.log2_scale_factor = 2; break; - case 8: i.log2_scale_factor = 3; break; - default: - as_bad ("expecting scale factor of 1, 2, 4, 8; got %d", num); - return 0; - } - } else { - if (! i.index_reg && *base_string == ',') { - as_bad ("expecting index register or scale factor after ','; got '%c'", - *(base_string+1)); - return 0; - } - } - } - - /* If there's an expression begining the operand, parse it, - assuming displacement_string_start and displacement_string_end - are meaningful. */ - if (displacement_string_start) { - register expressionS * exp; - segT exp_seg; - char * save_input_line_pointer; - exp = &disp_expressions[i.disp_operands]; - i.disps [this_operand] = exp; - i.disp_operands++; - save_input_line_pointer = input_line_pointer; - input_line_pointer = displacement_string_start; - END_STRING_AND_SAVE (displacement_string_end); - exp_seg = expression (exp); - if(*input_line_pointer) - as_bad("Ignoring junk '%s' after expression",input_line_pointer); - RESTORE_END_STRING (displacement_string_end); - input_line_pointer = save_input_line_pointer; - switch (exp_seg) { - case SEG_NONE: - /* missing expr becomes absolute 0 */ - as_bad ("missing or invalid displacement '%s' taken as 0", - operand_string); - i.types[this_operand] |= (Disp|Abs); - exp->X_seg = SEG_ABSOLUTE; - exp->X_add_number = 0; - exp->X_add_symbol = (symbolS *) 0; - exp->X_subtract_symbol = (symbolS *) 0; - break; - case SEG_ABSOLUTE: - i.types[this_operand] |= SMALLEST_DISP_TYPE (exp->X_add_number); - break; - case SEG_TEXT: case SEG_DATA: case SEG_BSS: - case SEG_UNKNOWN: /* must be 32 bit displacement (i.e. address) */ - i.types[this_operand] |= Disp32; - break; - default: - goto seg_unimplemented; - } - } - - /* Make sure the memory operand we've been dealt is valid. */ - if (i.base_reg && i.index_reg && - ! (i.base_reg->reg_type & i.index_reg->reg_type & Reg)) { - as_bad ("register size mismatch in (base,index,scale) expression"); - return 0; - } - if ((i.base_reg && (i.base_reg->reg_type & Reg32) == 0) || - (i.index_reg && (i.index_reg->reg_type & Reg32) == 0)) { - as_bad ("base/index register must be 32 bit register"); - return 0; - } - if (i.index_reg && i.index_reg == esp) { - as_bad ("%s may not be used as an index register", esp->reg_name); - return 0; - } - } else { /* it's not a memory operand; argh! */ - as_bad ("invalid char %s begining %s operand '%s'", - output_invalid(*op_string), ordinal_names[this_operand], - op_string); - return 0; - } - return 1; /* normal return */ -} - -/* - * md_estimate_size_before_relax() - * - * Called just before relax(). - * Any symbol that is now undefined will not become defined. - * Return the correct fr_subtype in the frag. - * Return the initial "guess for fr_var" to caller. - * The guess for fr_var is ACTUALLY the growth beyond fr_fix. - * Whatever we do to grow fr_fix or fr_var contributes to our returned value. - * Although it may not be explicit in the frag, pretend fr_var starts with a - * 0 value. - */ -int -md_estimate_size_before_relax (fragP, segment_type) - register fragS * fragP; - register int segment_type; /* N_DATA or N_TEXT. */ -{ - register uchar * opcode; - register int old_fr_fix; - - old_fr_fix = fragP -> fr_fix; - opcode = (uchar *) fragP -> fr_opcode; - /* We've already got fragP->fr_subtype right; all we have to do is check - for un-relaxable symbols. */ - if ((fragP -> fr_symbol -> sy_type & N_TYPE) != segment_type) { - /* symbol is undefined in this segment */ - switch (opcode[0]) { - case JUMP_PC_RELATIVE: /* make jmp (0xeb) a dword displacement jump */ - opcode[0] = 0xe9; /* dword disp jmp */ - fragP -> fr_fix += 4; - fix_new (fragP, old_fr_fix, 4, - fragP -> fr_symbol, - (symbolS *) 0, - fragP -> fr_offset, 1); - break; - - default: - /* This changes the byte-displacement jump 0x7N --> - the dword-displacement jump 0x0f8N */ - opcode[1] = opcode[0] + 0x10; - opcode[0] = TWO_BYTE_OPCODE_ESCAPE; /* two-byte escape */ - fragP -> fr_fix += 1 + 4; /* we've added an opcode byte */ - fix_new (fragP, old_fr_fix + 1, 4, - fragP -> fr_symbol, - (symbolS *) 0, - fragP -> fr_offset, 1); - break; - } - frag_wane (fragP); - } - return (fragP -> fr_var + fragP -> fr_fix - old_fr_fix); -} /* md_estimate_size_before_relax() */ - -/* - * md_convert_frag(); - * - * Called after relax() is finished. - * In: Address of frag. - * fr_type == rs_machine_dependent. - * fr_subtype is what the address relaxed to. - * - * Out: Any fixSs and constants are set up. - * Caller will turn frag into a ".space 0". - */ -void -md_convert_frag (fragP) - register fragS * fragP; -{ - register uchar * opcode; - uchar * where_to_put_displacement; - uint target_address, opcode_address; - uint extension; - int displacement_from_opcode_start; - - opcode = (uchar *) fragP -> fr_opcode; - - /* Address we want to reach in file space. */ - target_address = fragP->fr_symbol->sy_value + fragP->fr_offset; - - /* Address opcode resides at in file space. */ - opcode_address = fragP->fr_address + fragP->fr_fix; - - /* Displacement from opcode start to fill into instruction. */ - displacement_from_opcode_start = target_address - opcode_address; - - switch (fragP->fr_subtype) { - case ENCODE_RELAX_STATE (COND_JUMP, BYTE): - case ENCODE_RELAX_STATE (UNCOND_JUMP, BYTE): - /* don't have to change opcode */ - extension = 1; /* 1 opcode + 1 displacement */ - where_to_put_displacement = &opcode[1]; - break; - - case ENCODE_RELAX_STATE (COND_JUMP, WORD): - opcode[1] = TWO_BYTE_OPCODE_ESCAPE; - opcode[2] = opcode[0] + 0x10; - opcode[0] = WORD_PREFIX_OPCODE; - extension = 4; /* 3 opcode + 2 displacement */ - where_to_put_displacement = &opcode[3]; - break; - - case ENCODE_RELAX_STATE (UNCOND_JUMP, WORD): - opcode[1] = 0xe9; - opcode[0] = WORD_PREFIX_OPCODE; - extension = 3; /* 2 opcode + 2 displacement */ - where_to_put_displacement = &opcode[2]; - break; - - case ENCODE_RELAX_STATE (COND_JUMP, DWORD): - opcode[1] = opcode[0] + 0x10; - opcode[0] = TWO_BYTE_OPCODE_ESCAPE; - extension = 5; /* 2 opcode + 4 displacement */ - where_to_put_displacement = &opcode[2]; - break; - - case ENCODE_RELAX_STATE (UNCOND_JUMP, DWORD): - opcode[0] = 0xe9; - extension = 4; /* 1 opcode + 4 displacement */ - where_to_put_displacement = &opcode[1]; - break; - - default: - BAD_CASE(fragP -> fr_subtype); - break; - } - /* now put displacement after opcode */ - md_number_to_chars (where_to_put_displacement, - displacement_from_opcode_start - extension, - SIZE_FROM_RELAX_STATE (fragP->fr_subtype)); - fragP -> fr_fix += extension; -} - - -int md_short_jump_size = 2; /* size of byte displacement jmp */ -int md_long_jump_size = 5; /* size of dword displacement jmp */ - -void md_create_short_jump(ptr, from_addr, to_addr) - char *ptr; - long from_addr, to_addr; -{ - long offset; - - offset = to_addr - (from_addr + 2); - md_number_to_chars (ptr, (long) 0xeb, 1); /* opcode for byte-disp jump */ - md_number_to_chars (ptr + 1, offset, 1); -} - -void md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol) - char *ptr; - long from_addr, to_addr; - fragS *frag; - symbolS *to_symbol; -{ - long offset; - - if (flagseen['m']) { - offset = to_addr - to_symbol->sy_value; - md_number_to_chars (ptr, 0xe9, 1); /* opcode for long jmp */ - md_number_to_chars (ptr + 1, offset, 4); - fix_new (frag, (ptr+1) - frag->fr_literal, 4, - to_symbol, (symbolS *) 0, (long int) 0, 0); - } else { - offset = to_addr - (from_addr + 5); - md_number_to_chars(ptr, (long) 0xe9, 1); - md_number_to_chars(ptr + 1, offset, 4); - } -} - -int -md_parse_option(argP,cntP,vecP) -char **argP; -int *cntP; -char ***vecP; -{ - return 1; -} - -void /* Knows about order of bytes in address. */ -md_number_to_chars (con, value, nbytes) - char con []; /* Return 'nbytes' of chars here. */ - long int value; /* The value of the bits. */ - int nbytes; /* Number of bytes in the output. */ -{ - register char * p = con; - - switch (nbytes) { - case 1: - p[0] = value & 0xff; - break; - case 2: - p[0] = value & 0xff; - p[1] = (value >> 8) & 0xff; - break; - case 4: - p[0] = value & 0xff; - p[1] = (value>>8) & 0xff; - p[2] = (value>>16) & 0xff; - p[3] = (value>>24) & 0xff; - break; - default: - BAD_CASE (nbytes); - } -} - -void /* Knows about order of bytes in address. */ -md_number_to_disp (con, value, nbytes) - char con []; /* Return 'nbytes' of chars here. */ - long int value; /* The value of the bits. */ - int nbytes; /* Number of bytes in the output. */ -{ - char * answer = alloca (nbytes); - register char * p = answer; - - switch (nbytes) { - case 1: - *p = value; - break; - case 2: - *p++ = value; - *p = (value>>8); - break; - case 4: - *p++ = value; - *p++ = (value>>8); - *p++ = (value>>16); - *p = (value>>24); - break; - default: - BAD_CASE (nbytes); - } - bcopy (answer, con, nbytes); -} - -void /* Knows about order of bytes in address. */ -md_number_to_imm (con, value, nbytes) - char con []; /* Return 'nbytes' of chars here. */ - long int value; /* The value of the bits. */ - int nbytes; /* Number of bytes in the output. */ -{ - char * answer = alloca (nbytes); - register char * p = answer; - - switch (nbytes) { - case 1: - *p = value; - break; - case 2: - *p++ = value; - *p = (value>>8); - break; - case 4: - *p++ = value; - *p++ = (value>>8); - *p++ = (value>>16); - *p = (value>>24); - break; - default: - BAD_CASE (nbytes); - } - bcopy (answer, con, nbytes); -} - -void /* Knows about order of bytes in address. */ -md_number_to_field (con, value, nbytes) - char con []; /* Return 'nbytes' of chars here. */ - long int value; /* The value of the bits. */ - int nbytes; /* Number of bytes in the output. */ -{ - char * answer = alloca (nbytes); - register char * p = answer; - - switch (nbytes) { - case 1: - *p = value; - break; - case 2: - *p++ = value; - *p = (value>>8); - break; - case 4: - *p++ = value; - *p++ = (value>>8); - *p++ = (value>>16); - *p = (value>>24); - break; - default: - BAD_CASE (nbytes); - } - bcopy (answer, con, nbytes); -} - -long int /* Knows about the byte order in a word. */ -md_chars_to_number (con, nbytes) -unsigned char con[]; /* Low order byte 1st. */ - int nbytes; /* Number of bytes in the input. */ -{ - long int retval; - for (retval=0, con+=nbytes-1; nbytes--; con--) - { - retval <<= BITS_PER_CHAR; - retval |= *con; - } - return retval; -} - -void md_ri_to_chars(ri_p, ri) - struct relocation_info *ri_p, ri; -{ - unsigned char the_bytes[8]; - - /* this is easy */ - md_number_to_chars(the_bytes, ri.r_address, sizeof(ri.r_address)); - /* now the fun stuff */ - the_bytes[6] = (ri.r_symbolnum >> 16) & 0x0ff; - the_bytes[5] = (ri.r_symbolnum >> 8) & 0x0ff; - the_bytes[4] = ri.r_symbolnum & 0x0ff; - the_bytes[7] = (((ri.r_extern << 3) & 0x08) | ((ri.r_length << 1) & 0x06) | - ((ri.r_pcrel << 0) & 0x01)) & 0x0F; - /* now put it back where you found it */ - bcopy (the_bytes, (char *)ri_p, sizeof(struct relocation_info)); -} - - -#define MAX_LITTLENUMS 6 - -/* Turn the string pointed to by litP into a floating point constant of type - type, and emit the appropriate bytes. The number of LITTLENUMS emitted - is stored in *sizeP . An error message is returned, or NULL on OK. - */ -char * -md_atof(type,litP,sizeP) - char type; - char *litP; - int *sizeP; -{ - int prec; - LITTLENUM_TYPE words[MAX_LITTLENUMS]; - LITTLENUM_TYPE *wordP; - char *t; - char *atof_ieee(); - - switch(type) { - case 'f': - case 'F': - prec = 2; - break; - - case 'd': - case 'D': - prec = 4; - break; - - case 'x': - case 'X': - prec = 5; - break; - - default: - *sizeP=0; - return "Bad call to md_atof ()"; - } - t = atof_ieee (input_line_pointer,type,words); - if(t) - input_line_pointer=t; - - *sizeP = prec * sizeof(LITTLENUM_TYPE); - /* this loops outputs the LITTLENUMs in REVERSE order; in accord with - the bigendian 386 */ - for(wordP = words + prec - 1;prec--;) { - md_number_to_chars (litP, (long) (*wordP--), sizeof(LITTLENUM_TYPE)); - litP += sizeof(LITTLENUM_TYPE); - } - return ""; /* Someone should teach Dean about null pointers */ -} - -char output_invalid_buf[8]; - -char * output_invalid (c) - char c; -{ - if (isprint(c)) sprintf (output_invalid_buf, "'%c'", c); - else sprintf (output_invalid_buf, "(0x%x)", c); - return output_invalid_buf; -} - -reg_entry *parse_register (reg_string) - char *reg_string; /* reg_string starts *before* REGISTER_PREFIX */ -{ - register char *s = reg_string; - register char *p; - char reg_name_given[MAX_REG_NAME_SIZE]; - - s++; /* skip REGISTER_PREFIX */ - for (p = reg_name_given; is_register_char (*s); p++, s++) { - *p = register_chars [*s]; - if (p >= reg_name_given + MAX_REG_NAME_SIZE) - return (reg_entry *) 0; - } - *p = '\0'; - return (reg_entry *) hash_find (reg_hash, reg_name_given); -} - diff --git a/gnu/gas/config/i386.h b/gnu/gas/config/i386.h deleted file mode 100644 index c569c1cb8c34..000000000000 --- a/gnu/gas/config/i386.h +++ /dev/null @@ -1,296 +0,0 @@ -/* i386.h -- Header file for i386.c - Copyright (C) 1989, Free Software Foundation. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#define MAX_OPERANDS 3 /* max operands per insn */ -#define MAX_PREFIXES 4 /* max prefixes per opcode */ -#define MAX_IMMEDIATE_OPERANDS 2 /* max immediates per insn */ -#define MAX_MEMORY_OPERANDS 2 /* max memory ref per insn - * lcall uses 2 - */ -/* we define the syntax here (modulo base,index,scale syntax) */ -#define REGISTER_PREFIX '%' -#define IMMEDIATE_PREFIX '$' -#define ABSOLUTE_PREFIX '*' -#define PREFIX_SEPERATOR '/' - -#define TWO_BYTE_OPCODE_ESCAPE 0x0f - -/* register numbers */ -#define EBP_REG_NUM 5 -#define ESP_REG_NUM 4 - -/* modrm_byte.regmem for twobyte escape */ -#define ESCAPE_TO_TWO_BYTE_ADDRESSING ESP_REG_NUM -/* index_base_byte.index for no index register addressing */ -#define NO_INDEX_REGISTER ESP_REG_NUM -/* index_base_byte.base for no base register addressing */ -#define NO_BASE_REGISTER EBP_REG_NUM - -/* these are the att as opcode suffixes, making movl --> mov, for example */ -#define DWORD_OPCODE_SUFFIX 'l' -#define WORD_OPCODE_SUFFIX 'w' -#define BYTE_OPCODE_SUFFIX 'b' - -/* modrm.mode = REGMEM_FIELD_HAS_REG when a register is in there */ -#define REGMEM_FIELD_HAS_REG 0x3 /* always = 0x3 */ -#define REGMEM_FIELD_HAS_MEM (~REGMEM_FIELD_HAS_REG) - -#define END_OF_INSN '\0' - -/* -When an operand is read in it is classified by its type. This type includes -all the possible ways an operand can be used. Thus, '%eax' is both 'register -# 0' and 'The Accumulator'. In our language this is expressed by OR'ing -'Reg32' (any 32 bit register) and 'Acc' (the accumulator). -Operands are classified so that we can match given operand types with -the opcode table in i386-opcode.h. - */ -#define Unknown 0x0 -/* register */ -#define Reg8 0x1 /* 8 bit reg */ -#define Reg16 0x2 /* 16 bit reg */ -#define Reg32 0x4 /* 32 bit reg */ -#define Reg (Reg8|Reg16|Reg32) /* gen'l register */ -#define WordReg (Reg16|Reg32) /* for push/pop operands */ -/* immediate */ -#define Imm8 0x8 /* 8 bit immediate */ -#define Imm8S 0x10 /* 8 bit immediate sign extended */ -#define Imm16 0x20 /* 16 bit immediate */ -#define Imm32 0x40 /* 32 bit immediate */ -#define Imm1 0x80 /* 1 bit immediate */ -#define ImmUnknown Imm32 /* for unknown expressions */ -#define Imm (Imm8|Imm8S|Imm16|Imm32) /* gen'l immediate */ -/* memory */ -#define Disp8 0x200 /* 8 bit displacement (for jumps) */ -#define Disp16 0x400 /* 16 bit displacement */ -#define Disp32 0x800 /* 32 bit displacement */ -#define Disp (Disp8|Disp16|Disp32) /* General displacement */ -#define DispUnknown Disp32 /* for unknown size displacements */ -#define Mem8 0x1000 -#define Mem16 0x2000 -#define Mem32 0x4000 -#define BaseIndex 0x8000 -#define Mem (Disp|Mem8|Mem16|Mem32|BaseIndex) /* General memory */ -#define WordMem (Mem16|Mem32|Disp|BaseIndex) -#define ByteMem (Mem8|Disp|BaseIndex) -/* specials */ -#define InOutPortReg 0x10000 /* register to hold in/out port addr = dx */ -#define ShiftCount 0x20000 /* register to hold shift cound = cl */ -#define Control 0x40000 /* Control register */ -#define Debug 0x80000 /* Debug register */ -#define Test 0x100000 /* Test register */ -#define FloatReg 0x200000 /* Float register */ -#define FloatAcc 0x400000 /* Float stack top %st(0) */ -#define SReg2 0x800000 /* 2 bit segment register */ -#define SReg3 0x1000000 /* 3 bit segment register */ -#define Acc 0x2000000 /* Accumulator %al or %ax or %eax */ -#define ImplicitRegister (InOutPortReg|ShiftCount|Acc|FloatAcc) -#define JumpAbsolute 0x4000000 -#define Abs8 0x08000000 -#define Abs16 0x10000000 -#define Abs32 0x20000000 -#define Abs (Abs8|Abs16|Abs32) - -#define MODE_FROM_DISP_SIZE(t) \ - ((t&(Disp8)) ? 1 : \ - ((t&(Disp32)) ? 2 : 0)) - -#define Byte (Reg8|Imm8|Imm8S) -#define Word (Reg16|Imm16) -#define DWord (Reg32|Imm32) - -/* convert opcode suffix ('b' 'w' 'l' typically) into type specifyer */ -#define OPCODE_SUFFIX_TO_TYPE(s) \ - (s == BYTE_OPCODE_SUFFIX ? Byte : \ - (s == WORD_OPCODE_SUFFIX ? Word : DWord)) - -#define FITS_IN_SIGNED_BYTE(num) ((num) >= -128 && (num) <= 127) -#define FITS_IN_UNSIGNED_BYTE(num) ((num) >= 0 && (num) <= 255) -#define FITS_IN_UNSIGNED_WORD(num) ((num) >= 0 && (num) <= 65535) -#define FITS_IN_SIGNED_WORD(num) ((num) >= -32768 && (num) <= 32767) - -#define SMALLEST_DISP_TYPE(num) \ - FITS_IN_SIGNED_BYTE(num) ? (Disp8|Disp32|Abs8|Abs32) : (Disp32|Abs32) - -#define SMALLEST_IMM_TYPE(num) \ - (num == 1) ? (Imm1|Imm8|Imm8S|Imm16|Imm32): \ - FITS_IN_SIGNED_BYTE(num) ? (Imm8S|Imm8|Imm16|Imm32) : \ - FITS_IN_UNSIGNED_BYTE(num) ? (Imm8|Imm16|Imm32): \ - (FITS_IN_SIGNED_WORD(num)||FITS_IN_UNSIGNED_WORD(num)) ? (Imm16|Imm32) : \ - (Imm32) - -typedef unsigned char uchar; -typedef unsigned int uint; - -typedef struct { - /* instruction name sans width suffix ("mov" for movl insns) */ - char *name; - - /* how many operands */ - uint operands; - - /* base_opcode is the fundamental opcode byte with a optional prefix(es). */ - uint base_opcode; - - /* extension_opcode is the 3 bit extension for group <n> insns. - If this template has no extension opcode (the usual case) use None */ - uchar extension_opcode; -#define None 0xff /* If no extension_opcode is possible. */ - - /* the bits in opcode_modifier are used to generate the final opcode from - the base_opcode. These bits also are used to detect alternate forms of - the same instruction */ - uint opcode_modifier; - -/* opcode_modifier bits: */ -#define W 0x1 /* set if operands are words or dwords */ -#define D 0x2 /* D = 0 if Reg --> Regmem; D = 1 if Regmem --> Reg */ -/* direction flag for floating insns: MUST BE 0x400 */ -#define FloatD 0x400 -/* shorthand */ -#define DW (D|W) -#define ShortForm 0x10 /* register is in low 3 bits of opcode */ -#define ShortFormW 0x20 /* ShortForm and W bit is 0x8 */ -#define Seg2ShortForm 0x40 /* encoding of load segment reg insns */ -#define Seg3ShortForm 0x80 /* fs/gs segment register insns. */ -#define Jump 0x100 /* special case for jump insns. */ -#define JumpInterSegment 0x200 /* special case for intersegment leaps/calls */ -/* 0x400 CANNOT BE USED since it's already used by FloatD above */ -#define DONT_USE 0x400 -#define NoModrm 0x800 -#define Modrm 0x1000 -#define imulKludge 0x2000 -#define JumpByte 0x4000 -#define JumpDword 0x8000 -#define ReverseRegRegmem 0x10000 - - /* (opcode_modifier & COMES_IN_ALL_SIZES) is true if the - instuction comes in byte, word, and dword sizes and is encoded into - machine code in the canonical way. */ -#define COMES_IN_ALL_SIZES (W) - - /* (opcode_modifier & COMES_IN_BOTH_DIRECTIONS) indicates that the - source and destination operands can be reversed by setting either - the D (for integer insns) or the FloatD (for floating insns) bit - in base_opcode. */ -#define COMES_IN_BOTH_DIRECTIONS (D|FloatD) - - /* operand_types[i] describes the type of operand i. This is made - by OR'ing together all of the possible type masks. (e.g. - 'operand_types[i] = Reg|Imm' specifies that operand i can be - either a register or an immediate operand */ - uint operand_types[3]; -} template; - -/* - 'templates' is for grouping together 'template' structures for opcodes - of the same name. This is only used for storing the insns in the grand - ole hash table of insns. - The templates themselves start at START and range up to (but not including) - END. -*/ -typedef struct { - template *start; - template *end; -} templates; - -/* these are for register name --> number & type hash lookup */ -typedef struct { - char * reg_name; - uint reg_type; - uint reg_num; -} reg_entry; - -typedef struct { - char * seg_name; - uint seg_prefix; -} seg_entry; - -/* these are for prefix name --> prefix code hash lookup */ -typedef struct { - char * prefix_name; - uchar prefix_code; -} prefix_entry; - -/* 386 operand encoding bytes: see 386 book for details of this. */ -typedef struct { - unsigned regmem:3; /* codes register or memory operand */ - unsigned reg:3; /* codes register operand (or extended opcode) */ - unsigned mode:2; /* how to interpret regmem & reg */ -} modrm_byte; - -/* 386 opcode byte to code indirect addressing. */ -typedef struct { - unsigned base:3; - unsigned index:3; - unsigned scale:2; -} base_index_byte; - -/* 'md_assemble ()' gathers together information and puts it into a - i386_insn. */ - -typedef struct { - /* TM holds the template for the insn were currently assembling. */ - template tm; - /* SUFFIX holds the opcode suffix (e.g. 'l' for 'movl') if given. */ - char suffix; - /* Operands are coded with OPERANDS, TYPES, DISPS, IMMS, and REGS. */ - - /* OPERANDS gives the number of given operands. */ - uint operands; - - /* REG_OPERANDS, DISP_OPERANDS, MEM_OPERANDS, IMM_OPERANDS give the number of - given register, displacement, memory operands and immediate operands. */ - uint reg_operands, disp_operands, mem_operands, imm_operands; - - /* TYPES [i] is the type (see above #defines) which tells us how to - search through DISPS [i] & IMMS [i] & REGS [i] for the required - operand. */ - uint types [MAX_OPERANDS]; - - /* Displacements (if given) for each operand. */ - expressionS * disps [MAX_OPERANDS]; - - /* Immediate operands (if given) for each operand. */ - expressionS * imms [MAX_OPERANDS]; - - /* Register operands (if given) for each operand. */ - reg_entry * regs [MAX_OPERANDS]; - - /* BASE_REG, INDEX_REG, and LOG2_SCALE_FACTOR are used to encode - the base index byte below. */ - reg_entry * base_reg; - reg_entry * index_reg; - uint log2_scale_factor; - - /* SEG gives the seg_entry of this insn. It is equal to zero unless - an explicit segment override is given. */ - seg_entry * seg; /* segment for memory operands (if given) */ - - /* PREFIX holds all the given prefix opcodes (usually null). - PREFIXES is the size of PREFIX. */ - char prefix [MAX_PREFIXES]; - uint prefixes; - - /* RM and IB are the modrm byte and the base index byte where the addressing - modes of this insn are encoded. */ - - modrm_byte rm; - base_index_byte bi; -} i386_insn; diff --git a/gnu/gas/expr.c b/gnu/gas/expr.c deleted file mode 100644 index f3a377d350b7..000000000000 --- a/gnu/gas/expr.c +++ /dev/null @@ -1,980 +0,0 @@ -/* expr.c -operands, expressions- - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - * This is really a branch office of as-read.c. I split it out to clearly - * distinguish the world of expressions from the world of statements. - * (It also gives smaller files to re-compile.) - * Here, "operand"s are of expressions, not instructions. - */ - -#include <ctype.h> -#include "as.h" -#include "flonum.h" -#include "read.h" -#include "struc-symbol.h" -#include "expr.h" -#include "obstack.h" -#include "symbols.h" - -static void clean_up_expression(); /* Internal. */ -extern const char EXP_CHARS[]; /* JF hide MD floating pt stuff all the same place */ -extern const char FLT_CHARS[]; - -#ifdef SUN_ASM_SYNTAX -extern int local_label_defined[]; -#endif - -/* - * Build any floating-point literal here. - * Also build any bignum literal here. - */ - -/* LITTLENUM_TYPE generic_buffer [6]; /* JF this is a hack */ -/* Seems atof_machine can backscan through generic_bignum and hit whatever - happens to be loaded before it in memory. And its way too complicated - for me to fix right. Thus a hack. JF: Just make generic_bignum bigger, - and never write into the early words, thus they'll always be zero. - I hate Dean's floating-point code. Bleh. - */ -LITTLENUM_TYPE generic_bignum [SIZE_OF_LARGE_NUMBER+6]; -FLONUM_TYPE generic_floating_point_number = -{ - & generic_bignum [6], /* low (JF: Was 0) */ - & generic_bignum [SIZE_OF_LARGE_NUMBER+6 - 1], /* high JF: (added +6) */ - 0, /* leader */ - 0, /* exponent */ - 0 /* sign */ -}; -/* If nonzero, we've been asked to assemble nan, +inf or -inf */ -int generic_floating_point_magic; - -/* - * Summary of operand(). - * - * in: Input_line_pointer points to 1st char of operand, which may - * be a space. - * - * out: A expressionS. X_seg determines how to understand the rest of the - * expressionS. - * The operand may have been empty: in this case X_seg == SEG_NONE. - * Input_line_pointer -> (next non-blank) char after operand. - * - */ - -static segT -operand (expressionP) - register expressionS * expressionP; -{ - register char c; - register char *name; /* points to name of symbol */ - register struct symbol * symbolP; /* Points to symbol */ - - extern char hex_value[]; /* In hex_value.c */ - char *local_label_name(); - - SKIP_WHITESPACE(); /* Leading whitespace is part of operand. */ - c = * input_line_pointer ++; /* Input_line_pointer -> past char in c. */ - if (isdigit(c)) - { - register valueT number; /* offset or (absolute) value */ - register short int digit; /* value of next digit in current radix */ - /* invented for humans only, hope */ - /* optimising compiler flushes it! */ - register short int radix; /* 8, 10 or 16 */ - /* 0 means we saw start of a floating- */ - /* point constant. */ - register short int maxdig;/* Highest permitted digit value. */ - register int too_many_digits; /* If we see >= this number of */ - /* digits, assume it is a bignum. */ - register char * digit_2; /* -> 2nd digit of number. */ - int small; /* TRUE if fits in 32 bits. */ - - if (c=='0') - { /* non-decimal radix */ - if ((c = * input_line_pointer ++)=='x' || c=='X') - { - c = * input_line_pointer ++; /* read past "0x" or "0X" */ - maxdig = radix = 16; - too_many_digits = 9; - } - else - { - /* If it says '0f' and the line ends or it DOESN'T look like - a floating point #, its a local label ref. DTRT */ - if(c=='f' && (! *input_line_pointer || - (!index("+-.0123456789",*input_line_pointer) && - !index(EXP_CHARS,*input_line_pointer)))) - { - maxdig = radix = 10; - too_many_digits = 11; - c='0'; - input_line_pointer-=2; - } - else if (c && index (FLT_CHARS,c)) - { - radix = 0; /* Start of floating-point constant. */ - /* input_line_pointer -> 1st char of number. */ - expressionP -> X_add_number = - (isupper(c) ? tolower(c) : c); - } - else - { /* By elimination, assume octal radix. */ - radix = 8; - maxdig = 10; /* Un*x sux. Compatibility. */ - too_many_digits = 11; - } - } - /* c == char after "0" or "0x" or "0X" or "0e" etc.*/ - } - else - { - maxdig = radix = 10; - too_many_digits = 11; - } - if (radix) - { /* Fixed-point integer constant. */ - /* May be bignum, or may fit in 32 bits. */ -/* - * Most numbers fit into 32 bits, and we want this case to be fast. - * So we pretend it will fit into 32 bits. If, after making up a 32 - * bit number, we realise that we have scanned more digits than - * comfortably fit into 32 bits, we re-scan the digits coding - * them into a bignum. For decimal and octal numbers we are conservative: some - * numbers may be assumed bignums when in fact they do fit into 32 bits. - * Numbers of any radix can have excess leading zeros: we strive - * to recognise this and cast them back into 32 bits. - * We must check that the bignum really is more than 32 - * bits, and change it back to a 32-bit number if it fits. - * The number we are looking for is expected to be positive, but - * if it fits into 32 bits as an unsigned number, we let it be a 32-bit - * number. The cavalier approach is for speed in ordinary cases. - */ - digit_2 = input_line_pointer; - for (number=0; (digit=hex_value[c])<maxdig; c = * input_line_pointer ++) - { - number = number * radix + digit; - } - /* C contains character after number. */ - /* Input_line_pointer -> char after C. */ - small = input_line_pointer - digit_2 < too_many_digits; - if ( ! small) - { - /* - * We saw a lot of digits. Manufacture a bignum the hard way. - */ - LITTLENUM_TYPE * leader; /* -> high order littlenum of the bignum. */ - LITTLENUM_TYPE * pointer; /* -> littlenum we are frobbing now. */ - long int carry; - - leader = generic_bignum; - generic_bignum [0] = 0; - generic_bignum [1] = 0; - /* We could just use digit_2, but lets be mnemonic. */ - input_line_pointer = -- digit_2; /* -> 1st digit. */ - c = *input_line_pointer ++; - for (; (carry = hex_value [c]) < maxdig; c = * input_line_pointer ++) - { - for (pointer = generic_bignum; - pointer <= leader; - pointer ++) - { - long int work; - - work = carry + radix * * pointer; - * pointer = work & LITTLENUM_MASK; - carry = work >> LITTLENUM_NUMBER_OF_BITS; - } - if (carry) - { - if (leader < generic_bignum + SIZE_OF_LARGE_NUMBER - 1) - { /* Room to grow a longer bignum. */ - * ++ leader = carry; - } - } - } - /* Again, C is char after number, */ - /* input_line_pointer -> after C. */ - know( BITS_PER_INT == 32 ); - know( LITTLENUM_NUMBER_OF_BITS == 16 ); - /* Hence the constant "2" in the next line. */ - if (leader < generic_bignum + 2) - { /* Will fit into 32 bits. */ - number = - ( (generic_bignum [1] & LITTLENUM_MASK) << LITTLENUM_NUMBER_OF_BITS ) - | (generic_bignum [0] & LITTLENUM_MASK); - small = TRUE; - } - else - { - number = leader - generic_bignum + 1; /* Number of littlenums in the bignum. */ - } - } - if (small) - { - /* - * Here with number, in correct radix. c is the next char. - * Note that unlike Un*x, we allow "011f" "0x9f" to - * both mean the same as the (conventional) "9f". This is simply easier - * than checking for strict canonical form. Syntax sux! - */ - if (number<10) - { -#ifdef SUN_ASM_SYNTAX - if (c=='b' || (c=='$' && local_label_defined[number])) -#else - if (c=='b') -#endif - { - /* - * Backward ref to local label. - * Because it is backward, expect it to be DEFINED. - */ - /* - * Construct a local label. - */ - name = local_label_name ((int)number, 0); - if ( (symbolP = symbol_table_lookup(name)) /* seen before */ - && (symbolP -> sy_type & N_TYPE) != N_UNDF /* symbol is defined: OK */ - ) - { /* Expected path: symbol defined. */ - /* Local labels are never absolute. Don't waste time checking absoluteness. */ - know( (symbolP -> sy_type & N_TYPE) == N_DATA - || (symbolP -> sy_type & N_TYPE) == N_TEXT ); - expressionP -> X_add_symbol = symbolP; - expressionP -> X_add_number = 0; - expressionP -> X_seg = N_TYPE_seg [symbolP -> sy_type]; - } - else - { /* Either not seen or not defined. */ - as_warn( "Backw. ref to unknown label \"%d:\", 0 assumed.", - number - ); - expressionP -> X_add_number = 0; - expressionP -> X_seg = SEG_ABSOLUTE; - } - } - else - { -#ifdef SUN_ASM_SYNTAX - if (c=='f' || (c=='$' && !local_label_defined[number])) -#else - if (c=='f') -#endif - { - /* - * Forward reference. Expect symbol to be undefined or - * unknown. Undefined: seen it before. Unknown: never seen - * it in this pass. - * Construct a local label name, then an undefined symbol. - * Don't create a XSEG frag for it: caller may do that. - * Just return it as never seen before. - */ - name = local_label_name ((int)number, 1); - if ( symbolP = symbol_table_lookup( name )) - { - /* We have no need to check symbol properties. */ - know( (symbolP -> sy_type & N_TYPE) == N_UNDF - || (symbolP -> sy_type & N_TYPE) == N_DATA - || (symbolP -> sy_type & N_TYPE) == N_TEXT); - } - else - { - symbolP = symbol_new (name, N_UNDF, 0,0,0, & zero_address_frag); - symbol_table_insert (symbolP); - } - expressionP -> X_add_symbol = symbolP; - expressionP -> X_seg = SEG_UNKNOWN; - expressionP -> X_subtract_symbol = NULL; - expressionP -> X_add_number = 0; - } - else - { /* Really a number, not a local label. */ - expressionP -> X_add_number = number; - expressionP -> X_seg = SEG_ABSOLUTE; - input_line_pointer --; /* Restore following character. */ - } /* if (c=='f') */ - } /* if (c=='b') */ - } - else - { /* Really a number. */ - expressionP -> X_add_number = number; - expressionP -> X_seg = SEG_ABSOLUTE; - input_line_pointer --; /* Restore following character. */ - } /* if (number<10) */ - } - else - { - expressionP -> X_add_number = number; - expressionP -> X_seg = SEG_BIG; - input_line_pointer --; /* -> char following number. */ - } /* if (small) */ - } /* (If integer constant) */ - else - { /* input_line_pointer -> */ - /* floating-point constant. */ - int error_code; - - error_code = atof_generic - (& input_line_pointer, ".", EXP_CHARS, - & generic_floating_point_number); - - if (error_code) - { - if (error_code == ERROR_EXPONENT_OVERFLOW) - { - as_warn( "Bad floating-point constant: exponent overflow, probably assembling junk" ); - } - else - { - as_warn( "Bad floating-point constant: unknown error code=%d.", error_code); - } - } - expressionP -> X_seg = SEG_BIG; - /* input_line_pointer -> just after constant, */ - /* which may point to whitespace. */ - know( expressionP -> X_add_number < 0 ); /* < 0 means "floating point". */ - } /* if (not floating-point constant) */ - } - else if(c=='.' && !is_part_of_name(*input_line_pointer)) { - extern struct obstack frags; - - /* - JF: '.' is pseudo symbol with value of current location in current - segment. . . - */ - symbolP = symbol_new("L0\001", - (unsigned char)(seg_N_TYPE[(int)now_seg]), - 0, - 0, - (valueT)(obstack_next_free(&frags)-frag_now->fr_literal), - frag_now); - expressionP->X_add_number=0; - expressionP->X_add_symbol=symbolP; - expressionP->X_seg = now_seg; - - } else if ( is_name_beginner(c) ) /* here if did not begin with a digit */ - { - /* - * Identifier begins here. - * This is kludged for speed, so code is repeated. - */ - name = -- input_line_pointer; - c = get_symbol_end(); - symbolP = symbol_table_lookup(name); - if (symbolP) - { - /* - * If we have an absolute symbol, then we know it's value now. - */ - register segT seg; - - seg = N_TYPE_seg [(int) symbolP -> sy_type & N_TYPE]; - if ((expressionP -> X_seg = seg) == SEG_ABSOLUTE ) - { - expressionP -> X_add_number = symbolP -> sy_value; - } - else - { - expressionP -> X_add_number = 0; - expressionP -> X_add_symbol = symbolP; - } - } - else - { - expressionP -> X_add_symbol - = symbolP - = symbol_new (name, N_UNDF, 0,0,0, & zero_address_frag); - - expressionP -> X_add_number = 0; - expressionP -> X_seg = SEG_UNKNOWN; - symbol_table_insert (symbolP); - } - * input_line_pointer = c; - expressionP -> X_subtract_symbol = NULL; - } - else if (c=='(')/* didn't begin with digit & not a name */ - { - (void)expression( expressionP ); - /* Expression() will pass trailing whitespace */ - if ( * input_line_pointer ++ != ')' ) - { - as_warn( "Missing ')' assumed"); - input_line_pointer --; - } - /* here with input_line_pointer -> char after "(...)" */ - } - else if ( c=='~' || c=='-' ) - { /* unary operator: hope for SEG_ABSOLUTE */ - switch(operand (expressionP)) { - case SEG_ABSOLUTE: - /* input_line_pointer -> char after operand */ - if ( c=='-' ) - { - expressionP -> X_add_number = - expressionP -> X_add_number; -/* - * Notice: '-' may overflow: no warning is given. This is compatible - * with other people's assemblers. Sigh. - */ - } - else - { - expressionP -> X_add_number = ~ expressionP -> X_add_number; - } - break; - - case SEG_TEXT: - case SEG_DATA: - case SEG_BSS: - case SEG_PASS1: - case SEG_UNKNOWN: - if(c=='-') { /* JF I hope this hack works */ - expressionP->X_subtract_symbol=expressionP->X_add_symbol; - expressionP->X_add_symbol=0; - expressionP->X_seg=SEG_DIFFERENCE; - break; - } - default: /* unary on non-absolute is unsuported */ - as_warn("Unary operator %c ignored because bad operand follows", c); - break; - /* Expression undisturbed from operand(). */ - } - } - else if (c=='\'') - { -/* - * Warning: to conform to other people's assemblers NO ESCAPEMENT is permitted - * for a single quote. The next character, parity errors and all, is taken - * as the value of the operand. VERY KINKY. - */ - expressionP -> X_add_number = * input_line_pointer ++; - expressionP -> X_seg = SEG_ABSOLUTE; - } - else - { - /* can't imagine any other kind of operand */ - expressionP -> X_seg = SEG_NONE; - input_line_pointer --; - } -/* - * It is more 'efficient' to clean up the expressions when they are created. - * Doing it here saves lines of code. - */ - clean_up_expression (expressionP); - SKIP_WHITESPACE(); /* -> 1st char after operand. */ - know( * input_line_pointer != ' ' ); - return (expressionP -> X_seg); -} /* operand */ - -/* Internal. Simplify a struct expression for use by expr() */ - -/* - * In: address of a expressionS. - * The X_seg field of the expressionS may only take certain values. - * Now, we permit SEG_PASS1 to make code smaller & faster. - * Elsewise we waste time special-case testing. Sigh. Ditto SEG_NONE. - * Out: expressionS may have been modified: - * 'foo-foo' symbol references cancelled to 0, - * which changes X_seg from SEG_DIFFERENCE to SEG_ABSOLUTE; - * Unused fields zeroed to help expr(). - */ - -static void -clean_up_expression (expressionP) - register expressionS * expressionP; -{ - switch (expressionP -> X_seg) - { - case SEG_NONE: - case SEG_PASS1: - expressionP -> X_add_symbol = NULL; - expressionP -> X_subtract_symbol = NULL; - expressionP -> X_add_number = 0; - break; - - case SEG_BIG: - case SEG_ABSOLUTE: - expressionP -> X_subtract_symbol = NULL; - expressionP -> X_add_symbol = NULL; - break; - - case SEG_TEXT: - case SEG_DATA: - case SEG_BSS: - case SEG_UNKNOWN: - expressionP -> X_subtract_symbol = NULL; - break; - - case SEG_DIFFERENCE: - /* - * It does not hurt to 'cancel' NULL==NULL - * when comparing symbols for 'eq'ness. - * It is faster to re-cancel them to NULL - * than to check for this special case. - */ - if (expressionP -> X_subtract_symbol == expressionP -> X_add_symbol - || ( expressionP->X_subtract_symbol - && expressionP->X_add_symbol - && expressionP->X_subtract_symbol->sy_frag==expressionP->X_add_symbol->sy_frag - && expressionP->X_subtract_symbol->sy_value==expressionP->X_add_symbol->sy_value)) - { - expressionP -> X_subtract_symbol = NULL; - expressionP -> X_add_symbol = NULL; - expressionP -> X_seg = SEG_ABSOLUTE; - } - break; - - default: - BAD_CASE( expressionP -> X_seg); - break; - } -} - -/* - * expr_part () - * - * Internal. Made a function because this code is used in 2 places. - * Generate error or correct X_?????_symbol of expressionS. - */ - -/* - * symbol_1 += symbol_2 ... well ... sort of. - */ - -static segT -expr_part (symbol_1_PP, symbol_2_P) - struct symbol ** symbol_1_PP; - struct symbol * symbol_2_P; -{ - segT return_value; - - know( (* symbol_1_PP) == NULL - || ((* symbol_1_PP) -> sy_type & N_TYPE) == N_TEXT - || ((* symbol_1_PP) -> sy_type & N_TYPE) == N_DATA - || ((* symbol_1_PP) -> sy_type & N_TYPE) == N_BSS - || ((* symbol_1_PP) -> sy_type & N_TYPE) == N_UNDF - ); - know( symbol_2_P == NULL - || (symbol_2_P -> sy_type & N_TYPE) == N_TEXT - || (symbol_2_P -> sy_type & N_TYPE) == N_DATA - || (symbol_2_P -> sy_type & N_TYPE) == N_BSS - || (symbol_2_P -> sy_type & N_TYPE) == N_UNDF - ); - if (* symbol_1_PP) - { - if (((* symbol_1_PP) -> sy_type & N_TYPE) == N_UNDF) - { - if (symbol_2_P) - { - return_value = SEG_PASS1; - * symbol_1_PP = NULL; - } - else - { - know( ((* symbol_1_PP) -> sy_type & N_TYPE) == N_UNDF) - return_value = SEG_UNKNOWN; - } - } - else - { - if (symbol_2_P) - { - if ((symbol_2_P -> sy_type & N_TYPE) == N_UNDF) - { - * symbol_1_PP = NULL; - return_value = SEG_PASS1; - } - else - { - /* {seg1} - {seg2} */ - as_warn( "Expression too complex, 2 symbols forgotten: \"%s\" \"%s\"", - (* symbol_1_PP) -> sy_name, symbol_2_P -> sy_name ); - * symbol_1_PP = NULL; - return_value = SEG_ABSOLUTE; - } - } - else - { - return_value = N_TYPE_seg [(* symbol_1_PP) -> sy_type & N_TYPE]; - } - } - } - else - { /* (* symbol_1_PP) == NULL */ - if (symbol_2_P) - { - * symbol_1_PP = symbol_2_P; - return_value = N_TYPE_seg [(symbol_2_P) -> sy_type & N_TYPE]; - } - else - { - * symbol_1_PP = NULL; - return_value = SEG_ABSOLUTE; - } - } - know( return_value == SEG_ABSOLUTE - || return_value == SEG_TEXT - || return_value == SEG_DATA - || return_value == SEG_BSS - || return_value == SEG_UNKNOWN - || return_value == SEG_PASS1 - ); - know( (* symbol_1_PP) == NULL - || ((* symbol_1_PP) -> sy_type & N_TYPE) == seg_N_TYPE [(int) return_value] ); - return (return_value); -} /* expr_part() */ - -/* Expression parser. */ - -/* - * We allow an empty expression, and just assume (absolute,0) silently. - * Unary operators and parenthetical expressions are treated as operands. - * As usual, Q==quantity==operand, O==operator, X==expression mnemonics. - * - * We used to do a aho/ullman shift-reduce parser, but the logic got so - * warped that I flushed it and wrote a recursive-descent parser instead. - * Now things are stable, would anybody like to write a fast parser? - * Most expressions are either register (which does not even reach here) - * or 1 symbol. Then "symbol+constant" and "symbol-symbol" are common. - * So I guess it doesn't really matter how inefficient more complex expressions - * are parsed. - * - * After expr(RANK,resultP) input_line_pointer -> operator of rank <= RANK. - * Also, we have consumed any leading or trailing spaces (operand does that) - * and done all intervening operators. - */ - -typedef enum -{ -O_illegal, /* (0) what we get for illegal op */ - -O_multiply, /* (1) * */ -O_divide, /* (2) / */ -O_modulus, /* (3) % */ -O_left_shift, /* (4) < */ -O_right_shift, /* (5) > */ -O_bit_inclusive_or, /* (6) | */ -O_bit_or_not, /* (7) ! */ -O_bit_exclusive_or, /* (8) ^ */ -O_bit_and, /* (9) & */ -O_add, /* (10) + */ -O_subtract /* (11) - */ -} -operatorT; - -#define __ O_illegal - -static const operatorT op_encoding [256] = { /* maps ASCII -> operators */ - -__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - -__, O_bit_or_not, __, __, __, O_modulus, O_bit_and, __, -__, __, O_multiply, O_add, __, O_subtract, __, O_divide, -__, __, __, __, __, __, __, __, -__, __, __, __, O_left_shift, __, O_right_shift, __, -__, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, -__, __, __, __, __, __, O_bit_exclusive_or, __, -__, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, -__, __, __, __, O_bit_inclusive_or, __, __, __, - -__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, -__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __ -}; - - -/* - * Rank Examples - * 0 operand, (expression) - * 1 + - - * 2 & ^ ! | - * 3 * / % < > - */ -typedef char operator_rankT; -static const operator_rankT -op_rank [] = { 0, 3, 3, 3, 3, 3, 2, 2, 2, 2, 1, 1 }; - -segT /* Return resultP -> X_seg. */ -expr (rank, resultP) - register operator_rankT rank; /* Larger # is higher rank. */ - register expressionS * resultP; /* Deliver result here. */ -{ - expressionS right; - register operatorT op_left; - register char c_left; /* 1st operator character. */ - register operatorT op_right; - register char c_right; - - know( rank >= 0 ); - (void)operand (resultP); - know( * input_line_pointer != ' ' ); /* Operand() gobbles spaces. */ - c_left = * input_line_pointer; /* Potential operator character. */ - op_left = op_encoding [c_left]; - while (op_left != O_illegal && op_rank [(int) op_left] > rank) - { - input_line_pointer ++; /* -> after 1st character of operator. */ - /* Operators "<<" and ">>" have 2 characters. */ - if (* input_line_pointer == c_left && (c_left == '<' || c_left == '>') ) - { - input_line_pointer ++; - } /* -> after operator. */ - if (SEG_NONE == expr (op_rank[(int) op_left], &right)) - { - as_warn("Missing operand value assumed absolute 0."); - resultP -> X_add_number = 0; - resultP -> X_subtract_symbol = NULL; - resultP -> X_add_symbol = NULL; - resultP -> X_seg = SEG_ABSOLUTE; - } - know( * input_line_pointer != ' ' ); - c_right = * input_line_pointer; - op_right = op_encoding [c_right]; - if (* input_line_pointer == c_right && (c_right == '<' || c_right == '>') ) - { - input_line_pointer ++; - } /* -> after operator. */ - know( (int) op_right == 0 - || op_rank [(int) op_right] <= op_rank[(int) op_left] ); - /* input_line_pointer -> after right-hand quantity. */ - /* left-hand quantity in resultP */ - /* right-hand quantity in right. */ - /* operator in op_left. */ - if ( resultP -> X_seg == SEG_PASS1 || right . X_seg == SEG_PASS1 ) - { - resultP -> X_seg = SEG_PASS1; - } - else - { - if ( resultP -> X_seg == SEG_BIG ) - { - as_warn( "Left operand of %c is a %s. Integer 0 assumed.", - c_left, resultP -> X_add_number > 0 ? "bignum" : "float"); - resultP -> X_seg = SEG_ABSOLUTE; - resultP -> X_add_symbol = 0; - resultP -> X_subtract_symbol = 0; - resultP -> X_add_number = 0; - } - if ( right . X_seg == SEG_BIG ) - { - as_warn( "Right operand of %c is a %s. Integer 0 assumed.", - c_left, right . X_add_number > 0 ? "bignum" : "float"); - right . X_seg = SEG_ABSOLUTE; - right . X_add_symbol = 0; - right . X_subtract_symbol = 0; - right . X_add_number = 0; - } - if ( op_left == O_subtract ) - { - /* - * Convert - into + by exchanging symbols and negating number. - * I know -infinity can't be negated in 2's complement: - * but then it can't be subtracted either. This trick - * does not cause any further inaccuracy. - */ - - register struct symbol * symbolP; - - right . X_add_number = - right . X_add_number; - symbolP = right . X_add_symbol; - right . X_add_symbol = right . X_subtract_symbol; - right . X_subtract_symbol = symbolP; - if (symbolP) - { - right . X_seg = SEG_DIFFERENCE; - } - op_left = O_add; - } - - if ( op_left == O_add ) - { - segT seg1; - segT seg2; - - know( resultP -> X_seg == SEG_DATA - || resultP -> X_seg == SEG_TEXT - || resultP -> X_seg == SEG_BSS - || resultP -> X_seg == SEG_UNKNOWN - || resultP -> X_seg == SEG_DIFFERENCE - || resultP -> X_seg == SEG_ABSOLUTE - || resultP -> X_seg == SEG_PASS1 - ); - know( right . X_seg == SEG_DATA - || right . X_seg == SEG_TEXT - || right . X_seg == SEG_BSS - || right . X_seg == SEG_UNKNOWN - || right . X_seg == SEG_DIFFERENCE - || right . X_seg == SEG_ABSOLUTE - || right . X_seg == SEG_PASS1 - ); - - clean_up_expression (& right); - clean_up_expression (resultP); - - seg1 = expr_part (& resultP -> X_add_symbol, right . X_add_symbol); - seg2 = expr_part (& resultP -> X_subtract_symbol, right . X_subtract_symbol); - if (seg1 == SEG_PASS1 || seg2 == SEG_PASS1) { - need_pass_2 = TRUE; - resultP -> X_seg = SEG_PASS1; - } else if (seg2 == SEG_ABSOLUTE) - resultP -> X_seg = seg1; - else if ( seg1 != SEG_UNKNOWN - && seg1 != SEG_ABSOLUTE - && seg2 != SEG_UNKNOWN - && seg1 != seg2) { - know( seg2 != SEG_ABSOLUTE ); - know( resultP -> X_subtract_symbol ); - - know( seg1 == SEG_TEXT || seg1 == SEG_DATA || seg1== SEG_BSS ); - know( seg2 == SEG_TEXT || seg2 == SEG_DATA || seg2== SEG_BSS ); - know( resultP -> X_add_symbol ); - know( resultP -> X_subtract_symbol ); - as_warn("Expression too complex: forgetting %s - %s", - resultP -> X_add_symbol -> sy_name, - resultP -> X_subtract_symbol -> sy_name); - resultP -> X_seg = SEG_ABSOLUTE; - /* Clean_up_expression() will do the rest. */ - } else - resultP -> X_seg = SEG_DIFFERENCE; - - resultP -> X_add_number += right . X_add_number; - clean_up_expression (resultP); - } - else - { /* Not +. */ - if ( resultP -> X_seg == SEG_UNKNOWN || right . X_seg == SEG_UNKNOWN ) - { - resultP -> X_seg = SEG_PASS1; - need_pass_2 = TRUE; - } - else - { - resultP -> X_subtract_symbol = NULL; - resultP -> X_add_symbol = NULL; - /* Will be SEG_ABSOLUTE. */ - if ( resultP -> X_seg != SEG_ABSOLUTE || right . X_seg != SEG_ABSOLUTE ) - { - as_warn( "Relocation error. Absolute 0 assumed."); - resultP -> X_seg = SEG_ABSOLUTE; - resultP -> X_add_number = 0; - } - else - { - switch ( op_left ) - { - case O_bit_inclusive_or: - resultP -> X_add_number |= right . X_add_number; - break; - - case O_modulus: - if (right . X_add_number) - { - resultP -> X_add_number %= right . X_add_number; - } - else - { - as_warn( "Division by 0. 0 assumed." ); - resultP -> X_add_number = 0; - } - break; - - case O_bit_and: - resultP -> X_add_number &= right . X_add_number; - break; - - case O_multiply: - resultP -> X_add_number *= right . X_add_number; - break; - - case O_divide: - if (right . X_add_number) - { - resultP -> X_add_number /= right . X_add_number; - } - else - { - as_warn( "Division by 0. 0 assumed." ); - resultP -> X_add_number = 0; - } - break; - - case O_left_shift: - resultP -> X_add_number <<= right . X_add_number; - break; - - case O_right_shift: - resultP -> X_add_number >>= right . X_add_number; - break; - - case O_bit_exclusive_or: - resultP -> X_add_number ^= right . X_add_number; - break; - - case O_bit_or_not: - resultP -> X_add_number |= ~ right . X_add_number; - break; - - default: - BAD_CASE( op_left ); - break; - } /* switch(operator) */ - } - } /* If we have to force need_pass_2. */ - } /* If operator was +. */ - } /* If we didn't set need_pass_2. */ - op_left = op_right; - } /* While next operator is >= this rank. */ - return (resultP -> X_seg); -} - -/* - * get_symbol_end() - * - * This lives here because it belongs equally in expr.c & read.c. - * Expr.c is just a branch office read.c anyway, and putting it - * here lessens the crowd at read.c. - * - * Assume input_line_pointer is at start of symbol name. - * Advance input_line_pointer past symbol name. - * Turn that character into a '\0', returning its former value. - * This allows a string compare (RMS wants symbol names to be strings) - * of the symbol name. - * There will always be a char following symbol name, because all good - * lines end in end-of-line. - */ -char -get_symbol_end() -{ - register char c; - - while ( is_part_of_name( c = * input_line_pointer ++ ) ) - ; - * -- input_line_pointer = 0; - return (c); -} - -/* end: expr.c */ diff --git a/gnu/gas/expr.h b/gnu/gas/expr.h deleted file mode 100644 index 964d3b9a8478..000000000000 --- a/gnu/gas/expr.h +++ /dev/null @@ -1,69 +0,0 @@ -/* expr.h -> header file for expr.c - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - * Abbreviations (mnemonics). - * - * O operator - * Q quantity, operand - * X eXpression - */ - -/* - * By popular demand, we define a struct to represent an expression. - * This will no doubt mutate as expressions become baroque. - * - * Currently, we support expressions like "foo-bar+42". - * In other words we permit a (possibly undefined) minuend, a - * (possibly undefined) subtrahend and an (absolute) augend. - * RMS says this is so we can have 1-pass assembly for any compiler - * emmissions, and a 'case' statement might emit 'undefined1 - undefined2'. - * - * To simplify table-driven dispatch, we also have a "segment" for the - * entire expression. That way we don't require complex reasoning about - * whether particular components are defined; and we can change component - * semantics without re-working all the dispatch tables in the assembler. - * In other words the "type" of an expression is its segment. - */ - -typedef struct -{ - symbolS *X_add_symbol; /* foo */ - symbolS *X_subtract_symbol; /* bar */ - long int X_add_number; /* 42. Must be signed. */ - segT X_seg; /* What segment (expr type)? */ -} -expressionS; - - /* result should be type (expressionS *). */ -#define expression(result) expr(0,result) - - /* If an expression is SEG_BIG, look here */ - /* for its value. These common data may */ - /* be clobbered whenever expr() is called. */ -extern FLONUM_TYPE generic_floating_point_number; /* Flonums returned here. */ - /* Enough to hold most precise flonum. */ -extern LITTLENUM_TYPE generic_bignum []; /* Bignums returned here. */ -#define SIZE_OF_LARGE_NUMBER (20) /* Number of littlenums in above. */ - - -segT expr(); -char get_symbol_end(); - -/* end: expr.h */ diff --git a/gnu/gas/flonum-const.c b/gnu/gas/flonum-const.c deleted file mode 100644 index 617e58529181..000000000000 --- a/gnu/gas/flonum-const.c +++ /dev/null @@ -1,157 +0,0 @@ -/* flonum_const.c - Useful Flonum constants - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "flonum.h" -/* JF: I added the last entry to this table, and I'm not - sure if its right or not. Could go either way. I wish - I really understood this stuff. */ - - -const int table_size_of_flonum_powers_of_ten = 11; - -static const LITTLENUM_TYPE zero[] = { 1 }; - -/***********************************************************************\ -* * -* Warning: the low order bits may be WRONG here. * -* I took this from a suspect bc(1) script. * -* "minus_X"[] is supposed to be 10^(2^-X) expressed in base 2^16. * -* The radix point is just AFTER the highest element of the [] * -* * -* Because bc rounds DOWN for printing (I think), the lowest * -* significance littlenums should probably have 1 added to them. * -* * -\***********************************************************************/ - -/* JF: If this equals 6553/(2^16)+39321/(2^32)+... it approaches .1 */ -static const LITTLENUM_TYPE minus_1 [] = { - 39321, 39321, 39321, 39321, 39321, 39321, 39321, 39321, 39321, 39321, - 39321, 39321, 39321, 39321, 39321, 39321, 39321, 39321, 39321, 6553 }; -static const LITTLENUM_TYPE plus_1 [] = { 10 }; - -/* JF: If this equals 655/(2^16) + 23592/(2^32) + ... it approaches .01 */ -static const LITTLENUM_TYPE minus_2 [] = { - 10485, 36700, 62914, 23592, 49807, 10485, 36700, 62914, 23592, 49807, - 10485, 36700, 62914, 23592, 49807, 10485, 36700, 62914, 23592, 655 }; -static const LITTLENUM_TYPE plus_2 [] = { 100 }; - -/* This approaches .0001 */ -static const LITTLENUM_TYPE minus_3 [] = { - 52533, 20027, 37329, 65116, 64067, 60397, 14784, 18979, 33659, 19503, - 2726, 9542, 629, 2202, 40475, 10590, 4299, 47815, 36280, 6 }; -static const LITTLENUM_TYPE plus_3 [] = { 10000 }; - -/* JF: this approaches 1e-8 */ -static const LITTLENUM_TYPE minus_4 [] = { - 22516, 49501, 54293, 19424, 60699, 6716, 24348, 22618, 23904, 21327, - 3919, 44703, 19149, 28803, 48959, 6259, 50273, 62237, 42 }; -/* This equals 1525 * 2^16 + 57600 */ -static const LITTLENUM_TYPE plus_4 [] = { 57600, 1525 }; - -/* This approaches 1e-16 */ -static const LITTLENUM_TYPE minus_5 [] = { - 22199, 45957, 17005, 26266, 10526, 16260, 55017, 35680, 40443, 19789, - 17356, 30195, 55905, 28426, 63010, 44197, 1844 }; -static const LITTLENUM_TYPE plus_5 [] = { 28609, 34546, 35 }; - -static const LITTLENUM_TYPE minus_6 [] = { - 30926, 26518, 13110, 43018, 54982, 48258, 24658, 15209, 63366, 11929, - 20069, 43857, 60487, 51 }; -static const LITTLENUM_TYPE plus_6 [] = { 61313, 34220, 16731, 11629, 1262 }; - -static const LITTLENUM_TYPE minus_7 [] = { - 29819, 14733, 21490, 40602, 31315, 65186, 2695 }; -static const LITTLENUM_TYPE plus_7 [] = { - 7937, 49002, 60772, 28216, 38893, 55975, 63988, 59711, 20227, 24 }; - -static const LITTLENUM_TYPE minus_8 [] = { - 45849, 19069, 18068, 36324, 37948, 48745, 10873, 64360, 15961, 20566, - 24178, 15922, 59427, 110 }; -static const LITTLENUM_TYPE plus_8 [] = { - 15873, 11925, 39177, 991, 14589, 19735, 25347, 65086, 53853, 938, - 37209, 47086, 33626, 23253, 32586, 42547, 9731, 59679, 590 }; - -static const LITTLENUM_TYPE minus_9 [] = { - 63601, 55221, 43562, 33661, 29067, 28203, 65417, 64352, 22462, 41110, - 12570, 28635, 23199, 50572, 28471, 27074, 46375, 64028, 13106, 63700, - 32698, 17493, 32420, 34382, 22750, 20681, 12300 }; -static const LITTLENUM_TYPE plus_9 [] = { - 63564, 61556, 29377, 54467, 18621, 28141, 36415, 61241, 47119, 30026, - 19740, 46002, 13541, 61413, 30480, 38664, 32205, 50593, 51112, 48904, - 48263, 43814, 286, 30826, 52813, 62575, 61390, 24540, 21495, 5 }; - -static const LITTLENUM_TYPE minus_10 [] = { - 50313, 34681, 1464, 25889, 19575, 41125, 17635, 4598, 49708, 13427, - 17287, 56115, 53783, 38255, 32415, 17778, 31596, 7557, 20951, 18477, - 40353, 1178, 44405, 11837, 11571, 50963, 15649, 11698, 40675, 2308, }; -static const LITTLENUM_TYPE plus_10[] = { -18520, 53764, 54535, 61910, 61962, 59843, 46270, 58053, 12473, 63785, - 2449, 43230, 50044, 47595, 10403, 35766, 32607, 1124, 24966, 35044, -25524, 23631, 18826, 14518, 58448, 14562, 49618, 5588, 25396, 28 }; - -static const LITTLENUM_TYPE minus_11 [] = { - 6223, 59909, 62437, 59960, 14652, 45336, 48800, 7647, 51962, 37982, - 60436, 58176, 26767, 8440, 9831, 48556, 20994, 14148, 6757, 17221, - 60624, 46129, 53210, 44085, 54016, 24259, 11232, 21229, 21313, 81, }; -static const LITTLENUM_TYPE plus_11 [] = { - 36159, 2055, 33615, 61362, 23581, 62454, 9748, 15275, 39284, 58636, - 16269, 42793, 47240, 45774, 50861, 48400, 9413, 40281, 4030, 9572, - 7984, 33038, 59522, 19450, 40593, 24486, 54320, 6661, 55766, 805, }; - -/* Shut up complaints about differing pointer types. They only differ - in the const attribute, but there isn't any easy way to do this - */ -#define X (LITTLENUM_TYPE *) - -const FLONUM_TYPE flonum_negative_powers_of_ten [] = { - {X zero, X zero, X zero, 0, '+'}, - {X minus_1, X minus_1 +19, X minus_1 + 19, -20, '+'}, - {X minus_2, X minus_2 +19, X minus_2 + 19, -20, '+'}, - {X minus_3, X minus_3 +19, X minus_3 + 19, -20, '+'}, - {X minus_4, X minus_4 +18, X minus_4 + 18, -20, '+'}, - {X minus_5, X minus_5 +16, X minus_5 + 16, -20, '+'}, - {X minus_6, X minus_6 +13, X minus_6 + 13, -20, '+'}, - {X minus_7, X minus_7 + 6, X minus_7 + 6, -20, '+'}, - {X minus_8, X minus_8 +13, X minus_8 + 13, -40, '+'}, - {X minus_9, X minus_9 +26, X minus_9 + 26, -80, '+'}, - {X minus_10, X minus_10+29, X minus_10 + 29,-136, '+'}, - {X minus_11, X minus_11+29, X minus_11 + 29,-242, '+'}, -}; - -const FLONUM_TYPE flonum_positive_powers_of_ten [] = { - {X zero, X zero, X zero, 0, '+'}, - {X plus_1, X plus_1 + 0, X plus_1 + 0, 0, '+'}, - {X plus_2, X plus_2 + 0, X plus_2 + 0, 0, '+'}, - {X plus_3, X plus_3 + 0, X plus_3 + 0, 0, '+'}, - {X plus_4, X plus_4 + 1, X plus_4 + 1, 0, '+'}, - {X plus_5, X plus_5 + 2, X plus_5 + 2, 1, '+'}, - {X plus_6, X plus_6 + 4, X plus_6 + 4, 2, '+'}, - {X plus_7, X plus_7 + 9, X plus_7 + 9, 4, '+'}, - {X plus_8, X plus_8 + 18, X plus_8 + 18, 8, '+'}, - {X plus_9, X plus_9 + 29, X plus_9 + 29, 24, '+'}, - {X plus_10, X plus_10 + 29, X plus_10 + 29, 77, '+'}, - {X plus_11, X plus_11 + 29, X plus_11 + 29, 183, '+'}, -}; - -#ifdef VMS -dummy1() -{ -} -#endif -/* end: flonum_const.c */ diff --git a/gnu/gas/flonum-copy.c b/gnu/gas/flonum-copy.c deleted file mode 100644 index 3a51f06d7efb..000000000000 --- a/gnu/gas/flonum-copy.c +++ /dev/null @@ -1,76 +0,0 @@ -/* flonum_copy.c - copy a flonum - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "flonum.h" -#ifdef USG -#define bzero(s,n) memset(s,0,n) -#define bcopy(from,to,n) memcpy(to,from,n) -#endif - -void -flonum_copy (in, out) - FLONUM_TYPE * in; - FLONUM_TYPE * out; -{ - int in_length; /* 0 origin */ - int out_length; /* 0 origin */ - - out -> sign = in -> sign; - in_length = in -> leader - in -> low; - if (in_length < 0) - { - out -> leader = out -> low - 1; /* 0.0 case */ - } - else - { - out_length = out -> high - out -> low; - /* - * Assume no GAPS in packing of littlenums. - * I.e. sizeof(array) == sizeof(element) * number_of_elements. - */ - if (in_length <= out_length) - { - { - /* - * For defensive programming, zero any high-order littlenums we don't need. - * This is destroying evidence and wasting time, so why bother??? - */ - if (in_length < out_length) - { - bzero ((char *)(out->low + in_length + 1), out_length - in_length); - } - } - bcopy ((char *)(in->low), (char *)(out->low), (int)((in_length + 1) * sizeof(LITTLENUM_TYPE))); - out -> exponent = in -> exponent; - out -> leader = in -> leader - in -> low + out -> low; - } - else - { - int shorten; /* 1-origin. Number of littlenums we drop. */ - - shorten = in_length - out_length; - /* Assume out_length >= 0 ! */ - bcopy ((char *)(in->low + shorten),(char *)( out->low), (int)((out_length + 1) * sizeof(LITTLENUM_TYPE))); - out -> leader = out -> high; - out -> exponent = in -> exponent + shorten; - } - } /* if any significant bits */ -} - -/* end: flonum_copy.c */ diff --git a/gnu/gas/flonum-mult.c b/gnu/gas/flonum-mult.c deleted file mode 100644 index 1b7b5eadd31f..000000000000 --- a/gnu/gas/flonum-mult.c +++ /dev/null @@ -1,200 +0,0 @@ -/* flonum_multip.c - multiply two flonums - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of Gas, the GNU Assembler. - -The GNU assembler is distributed in the hope that it will be -useful, but WITHOUT ANY WARRANTY. No author or distributor -accepts responsibility to anyone for the consequences of using it -or for whether it serves any particular purpose or works at all, -unless he says so in writing. Refer to the GNU Assembler General -Public License for full details. - -Everyone is granted permission to copy, modify and redistribute -the GNU Assembler, but only under the conditions described in the -GNU Assembler General Public License. A copy of this license is -supposed to have been given to you along with the GNU Assembler -so you can know your rights and responsibilities. It should be -in a file named COPYING. Among other things, the copyright -notice and this notice must be preserved on all copies. */ - -#include "flonum.h" - -/* plan for a . b => p(roduct) - - - +-------+-------+-/ /-+-------+-------+ - | a | a | ... | a | a | - | A | A-1 | | 1 | 0 | - +-------+-------+-/ /-+-------+-------+ - - - +-------+-------+-/ /-+-------+-------+ - | b | b | ... | b | b | - | B | B-1 | | 1 | 0 | - +-------+-------+-/ /-+-------+-------+ - - - +-------+-------+-/ /-+-------+-/ /-+-------+-------+ - | p | p | ... | p | ... | p | p | - | A+B+1| A+B | | N | | 1 | 0 | - +-------+-------+-/ /-+-------+-/ /-+-------+-------+ - - /^\ - (carry) a .b ... | ... a .b a .b - A B | 0 1 0 0 - | - ... | ... a .b - | 1 0 - | - | ... - | - | - | - | ___ - | \ - +----- P = > a .b - N /__ i j - - N = 0 ... A+B - - for all i,j where i+j=N - [i,j integers > 0] - -a[], b[], p[] may not intersect. -Zero length factors signify 0 significant bits: treat as 0.0. -0.0 factors do the right thing. -Zero length product OK. - -I chose the ForTran accent "foo[bar]" instead of the C accent "*garply" -because I felt the ForTran way was more intuitive. The C way would -probably yield better code on most C compilers. Dean Elsner. -(C style also gives deeper insight [to me] ... oh well ...) -*/ - -void -flonum_multip (a, b, product) - FLONUM_TYPE * a, - * b, - * product; -{ - int size_of_a; /* 0 origin */ - int size_of_b; /* 0 origin */ - int size_of_product; /* 0 origin */ - int size_of_sum; /* 0 origin */ - int extra_product_positions;/* 1 origin */ - unsigned long int work; - unsigned long int carry; - long int exponent; - LITTLENUM_TYPE * q; - long int significant; /* TRUE when we emit a non-0 littlenum */ - /* ForTran accent follows. */ - int P; /* Scan product low-order -> high. */ - int N; /* As in sum above. */ - int A; /* Which [] of a? */ - int B; /* Which [] of b? */ - - if((a->sign!='-' && a->sign!='+') || (b->sign!='-' && b->sign!='+')) { - /* ... - Got to fail somehow. Any suggestions? */ - product->sign=0; - return; - } - product -> sign = (a->sign == b->sign) ? '+' : '-'; - size_of_a = a -> leader - a -> low; - size_of_b = b -> leader - b -> low; - exponent = a -> exponent + b -> exponent; - size_of_product = product -> high - product -> low; - size_of_sum = size_of_a + size_of_b; - extra_product_positions = size_of_product - size_of_sum; - if (extra_product_positions < 0) - { - P = extra_product_positions; /* P < 0 */ - exponent -= extra_product_positions; /* Increases exponent. */ - } - else - { - P = 0; - } - carry = 0; - significant = 0; - for (N = 0; - N <= size_of_sum; - N++) - { - work = carry; - carry = 0; - for (A = 0; - A <= N; - A ++) - { - B = N - A; - if (A <= size_of_a && B <= size_of_b && B >= 0) - { -#ifdef TRACE -printf("a:low[%d.]=%04x b:low[%d.]=%04x work_before=%08x\n", A, a->low[A], B, b->low[B], work); -#endif - work += a -> low [A] * b -> low [B]; - carry += work >> LITTLENUM_NUMBER_OF_BITS; - work &= LITTLENUM_MASK; -#ifdef TRACE -printf("work=%08x carry=%04x\n", work, carry); -#endif - } - } - significant |= work; - if (significant || P<0) - { - if (P >= 0) - { - product -> low [P] = work; -#ifdef TRACE -printf("P=%d. work[p]:=%04x\n", P, work); -#endif - } - P ++; - } - else - { - extra_product_positions ++; - exponent ++; - } - } - /* - * [P]-> position # size_of_sum + 1. - * This is where 'carry' should go. - */ -#ifdef TRACE -printf("final carry =%04x\n", carry); -#endif - if (carry) - { - if (extra_product_positions > 0) - { - product -> low [P] = carry; - } - else - { - /* No room at high order for carry littlenum. */ - /* Shift right 1 to make room for most significant littlenum. */ - exponent ++; - P --; - for (q = product -> low + P; - q >= product -> low; - q --) - { - work = * q; - * q = carry; - carry = work; - } - } - } - else - { - P --; - } - product -> leader = product -> low + P; - product -> exponent = exponent; -} - -/* end: flonum_multip.c */ diff --git a/gnu/gas/flonum.h b/gnu/gas/flonum.h deleted file mode 100644 index b2e841abce22..000000000000 --- a/gnu/gas/flonum.h +++ /dev/null @@ -1,111 +0,0 @@ -/* flonum.h - Floating point package - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/***********************************************************************\ -* * -* Arbitrary-precision floating point arithmetic. * -* * -* * -* Notation: a floating point number is expressed as * -* MANTISSA * (2 ** EXPONENT). * -* * -* If this offends more traditional mathematicians, then * -* please tell me your nomenclature for flonums! * -* * -\***********************************************************************/ -#if !defined(__STDC__) && !defined(const) -#define const /* empty */ -#endif - -#include "bignum.h" - -/***********************************************************************\ -* * -* Variable precision floating point numbers. * -* * -* Exponent is the place value of the low littlenum. E.g.: * -* If 0: low points to the units littlenum. * -* If 1: low points to the LITTLENUM_RADIX littlenum. * -* If -1: low points to the 1/LITTLENUM_RADIX littlenum. * -* * -\***********************************************************************/ - -/* JF: A sign value of 0 means we have been asked to assemble NaN - A sign value of 'P' means we've been asked to assemble +Inf - A sign value of 'N' means we've been asked to assemble -Inf - */ -struct FLONUM_STRUCT -{ - LITTLENUM_TYPE * low; /* low order littlenum of a bignum */ - LITTLENUM_TYPE * high; /* high order littlenum of a bignum */ - LITTLENUM_TYPE * leader; /* -> 1st non-zero littlenum */ - /* If flonum is 0.0, leader==low-1 */ - long int exponent; /* base LITTLENUM_RADIX */ - char sign; /* '+' or '-' */ -}; - -typedef struct FLONUM_STRUCT FLONUM_TYPE; - - -/***********************************************************************\ -* * -* Since we can (& do) meet with exponents like 10^5000, it * -* is silly to make a table of ~ 10,000 entries, one for each * -* power of 10. We keep a table where item [n] is a struct * -* FLONUM_FLOATING_POINT representing 10^(2^n). We then * -* multiply appropriate entries from this table to get any * -* particular power of 10. For the example of 10^5000, a table * -* of just 25 entries suffices: 10^(2^-12)...10^(2^+12). * -* * -\***********************************************************************/ - - -extern const FLONUM_TYPE flonum_positive_powers_of_ten[]; -extern const FLONUM_TYPE flonum_negative_powers_of_ten[]; -extern const int table_size_of_flonum_powers_of_ten; - /* Flonum_XXX_powers_of_ten[] table has */ - /* legal indices from 0 to */ - /* + this number inclusive. */ - - - -/***********************************************************************\ -* * -* Declare worker functions. * -* * -\***********************************************************************/ - -void flonum_multip(); -void flonum_copy(); -void flonum_print(); -char * flonum_get(); /* Returns "" or error string. */ -void flonum_normal(); - -int atof_generic(); - - -/***********************************************************************\ -* * -* Declare error codes. * -* * -\***********************************************************************/ - -#define ERROR_EXPONENT_OVERFLOW (2) - -/* end: flonum.h */ diff --git a/gnu/gas/frags.c b/gnu/gas/frags.c deleted file mode 100644 index ee10321ad1e3..000000000000 --- a/gnu/gas/frags.c +++ /dev/null @@ -1,292 +0,0 @@ -/* frags.c - manage frags - - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "as.h" -#include "subsegs.h" -#include "obstack.h" -#include "frags.h" -#include "struc-symbol.h" - -struct obstack frags; /* All, and only, frags live here. */ - -fragS zero_address_frag = { - 0, /* fr_address */ - NULL, /* fr_next */ - 0, /* fr_fix */ - 0, /* fr_var */ - 0, /* fr_symbol */ - 0, /* fr_offset */ - NULL, /* fr_opcode */ - rs_fill, /* fr_type */ - 0, /* fr_subtype */ - 0, /* fr_pcrel_adjust */ - 0, /* fr_bsr */ - 0 /* fr_literal [0] */ -}; - -fragS bss_address_frag = { - 0, /* fr_address. Gets filled in to make up - sy_value-s. */ - NULL, /* fr_next */ - 0, /* fr_fix */ - 0, /* fr_var */ - 0, /* fr_symbol */ - 0, /* fr_offset */ - NULL, /* fr_opcode */ - rs_fill, /* fr_type */ - 0, /* fr_subtype */ - 0, /* fr_pcrel_adjust */ - 0, /* fr_bsr */ - 0 /* fr_literal [0] */ -}; - -/* - * frag_grow() - * - * Internal. - * Try to augment current frag by nchars chars. - * If there is no room, close of the current frag with a ".fill 0" - * and begin a new frag. Unless the new frag has nchars chars available - * do not return. Do not set up any fields of *now_frag. - */ -static void -frag_grow (nchars) -int nchars; -{ - if (obstack_room (&frags) < nchars) { - unsigned int n,oldn; - long oldc; - - frag_wane (frag_now); - frag_new (0); - oldn=(unsigned)-1; - oldc=frags.chunk_size; - frags.chunk_size=2*nchars; - while((n=obstack_room(&frags))<nchars && n<oldn) { - frag_wane(frag_now); - frag_new(0); - oldn=n; - } - frags.chunk_size=oldc; - } - if (obstack_room (&frags) < nchars) - as_fatal ("Can't extend frag %d. chars", nchars); -} - -/* - * frag_new() - * - * Call this to close off a completed frag, and start up a new (empty) - * frag, in the same subsegment as the old frag. - * [frchain_now remains the same but frag_now is updated.] - * Because this calculates the correct value of fr_fix by - * looking at the obstack 'frags', it needs to know how many - * characters at the end of the old frag belong to (the maximal) - * fr_var: the rest must belong to fr_fix. - * It doesn't actually set up the old frag's fr_var: you may have - * set fr_var == 1, but allocated 10 chars to the end of the frag: - * in this case you pass old_frags_var_max_size == 10. - * - * Make a new frag, initialising some components. Link new frag at end - * of frchain_now. - */ -void -frag_new (old_frags_var_max_size) -int old_frags_var_max_size; /* Number of chars (already allocated on - obstack frags) */ - /* in variable_length part of frag. */ -{ - register fragS * former_last_fragP; -/* char *throw_away_pointer; JF unused */ - register frchainS * frchP; - long tmp; /* JF */ - - frag_now->fr_fix = (char *) (obstack_next_free (&frags)) - - (frag_now->fr_literal) - old_frags_var_max_size; - /* Fix up old frag's fr_fix. */ - - obstack_finish (&frags); - /* This will align the obstack so the */ - /* next struct we allocate on it will */ - /* begin at a correct boundary. */ - frchP = frchain_now; - know (frchP); - former_last_fragP = frchP->frch_last; - know (former_last_fragP); - know (former_last_fragP == frag_now); - obstack_blank (&frags, SIZEOF_STRUCT_FRAG); - /* We expect this will begin at a correct */ - /* boundary for a struct. */ - tmp=obstack_alignment_mask(&frags); - obstack_alignment_mask(&frags)=0; /* Turn off alignment */ - /* If we ever hit a machine - where strings must be - aligned, we Lose Big */ - frag_now=(fragS *)obstack_finish(&frags); - obstack_alignment_mask(&frags)=tmp; /* Restore alignment */ - - /* Just in case we don't get zero'd bytes */ - bzero(frag_now, SIZEOF_STRUCT_FRAG); - -/* obstack_unaligned_done (&frags, &frag_now); */ -/* know (frags.obstack_c_next_free == frag_now->fr_literal); */ - /* Generally, frag_now->points to an */ - /* address rounded up to next alignment. */ - /* However, characters will add to obstack */ - /* frags IMMEDIATELY after the struct frag, */ - /* even if they are not starting at an */ - /* alignment address. */ - former_last_fragP->fr_next = frag_now; - frchP->frch_last = frag_now; - frag_now->fr_next = NULL; -} /* frag_new() */ - -/* - * frag_more() - * - * Start a new frag unless we have n more chars of room in the current frag. - * Close off the old frag with a .fill 0. - * - * Return the address of the 1st char to write into. Advance - * frag_now_growth past the new chars. - */ - -char * -frag_more (nchars) -int nchars; -{ - register char *retval; - - frag_grow (nchars); - retval = obstack_next_free (&frags); - obstack_blank_fast (&frags, nchars); - return (retval); -} /* frag_more() */ - -/* - * frag_var() - * - * Start a new frag unless we have max_chars more chars of room in the current frag. - * Close off the old frag with a .fill 0. - * - * Set up a machine_dependent relaxable frag, then start a new frag. - * Return the address of the 1st char of the var part of the old frag - * to write into. - */ - -char * -frag_var (type, max_chars, var, subtype, symbol, offset, opcode) -relax_stateT type; -int max_chars; -int var; -relax_substateT subtype; -symbolS * symbol; -long int offset; -char * opcode; -{ - register char *retval; - - frag_grow (max_chars); - retval = obstack_next_free (&frags); - obstack_blank_fast (&frags, max_chars); - frag_now->fr_var = var; - frag_now->fr_type = type; - frag_now->fr_subtype = subtype; - frag_now->fr_symbol = symbol; - frag_now->fr_offset = offset; - frag_now->fr_opcode = opcode; - /* default these to zero. */ - frag_now->fr_pcrel_adjust = 0; - frag_now->fr_bsr = 0; - frag_new (max_chars); - return (retval); -} /* frag_var() */ - -/* - * frag_variant() - * - * OVE: This variant of frag_var assumes that space for the tail has been - * allocated by caller. - * No call to frag_grow is done. - * Two new arguments have been added. - */ - -char * -frag_variant (type, max_chars, var, subtype, symbol, offset, opcode, pcrel_adjust,bsr) - relax_stateT type; - int max_chars; - int var; - relax_substateT subtype; - symbolS *symbol; - long int offset; - char *opcode; - char pcrel_adjust; - char bsr; -{ - register char *retval; - -/* frag_grow (max_chars); */ - retval = obstack_next_free (&frags); -/* obstack_blank_fast (&frags, max_chars); */ /* OVE: so far the only diff */ - frag_now->fr_var = var; - frag_now->fr_type = type; - frag_now->fr_subtype = subtype; - frag_now->fr_symbol = symbol; - frag_now->fr_offset = offset; - frag_now->fr_opcode = opcode; - frag_now->fr_pcrel_adjust = pcrel_adjust; - frag_now->fr_bsr = bsr; - frag_new (max_chars); - return (retval); -} /* frag_variant() */ - -/* - * frag_wane() - * - * Reduce the variable end of a frag to a harmless state. - */ -void -frag_wane (fragP) -register fragS * fragP; -{ - fragP->fr_type = rs_fill; - fragP->fr_offset = 0; - fragP->fr_var = 0; -} - -/* - * frag_align() - * - * Make a frag for ".align foo,bar". Call is "frag_align (foo,bar);". - * Foo & bar are absolute integers. - * - * Call to close off the current frag with a ".align", then start a new - * (so far empty) frag, in the same subsegment as the last frag. - */ - -void -frag_align (alignment, fill_character) -int alignment; -int fill_character; -{ - *(frag_var (rs_align, 1, 1, (relax_substateT)0, (symbolS *)0, - (long)alignment, (char *)0)) = fill_character; -} - -/* end: frags.c */ diff --git a/gnu/gas/frags.h b/gnu/gas/frags.h deleted file mode 100644 index 6d7310b35b30..000000000000 --- a/gnu/gas/frags.h +++ /dev/null @@ -1,41 +0,0 @@ -/* frags.h - Header file for the frag concept. - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -extern struct obstack frags; - /* Frags ONLY live in this obstack. */ - /* We use obstack_next_free() macro */ - /* so please don't put any other objects */ - /* on this stack! */ - -/* - * A macro to speed up appending exactly 1 char - * to current frag. - */ -/* JF changed < 1 to <= 1 to avoid a race conditon */ -#define FRAG_APPEND_1_CHAR(datum) \ -{ \ - if (obstack_room( &frags ) <= 1) {\ - frag_wane (frag_now); \ - frag_new (0); \ - } \ - obstack_1grow( &frags, datum ); \ -} - - -/* end: frags.h */ diff --git a/gnu/gas/hash.c b/gnu/gas/hash.c deleted file mode 100644 index 21f0cc028aaf..000000000000 --- a/gnu/gas/hash.c +++ /dev/null @@ -1,981 +0,0 @@ -/* hash.c - hash table lookup strings - - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - * BUGS, GRIPES, APOLOGIA etc. - * - * A typical user doesn't need ALL this: I intend to make a library out - * of it one day - Dean Elsner. - * Also, I want to change the definition of a symbol to (address,length) - * so I can put arbitrary binary in the names stored. [see hsh.c for that] - * - * This slime is common coupled inside the module. Com-coupling (and other - * vandalism) was done to speed running time. The interfaces at the - * module's edges are adequately clean. - * - * There is no way to (a) run a test script through this heap and (b) - * compare results with previous scripts, to see if we have broken any - * code. Use GNU (f)utilities to do this. A few commands assist test. - * The testing is awkward: it tries to be both batch & interactive. - * For now, interactive rules! - */ - -/* - * The idea is to implement a symbol table. A test jig is here. - * Symbols are arbitrary strings; they can't contain '\0'. - * [See hsh.c for a more general symbol flavour.] - * Each symbol is associated with a char*, which can point to anything - * you want, allowing an arbitrary property list for each symbol. - * - * The basic operations are: - * - * new creates symbol table, returns handle - * find (symbol) returns char* - * insert (symbol,char*) error if symbol already in table - * delete (symbol) returns char* if symbol was in table - * apply so you can delete all symbols before die() - * die destroy symbol table (free up memory) - * - * Supplementary functions include: - * - * say how big? what % full? - * replace (symbol,newval) report previous value - * jam (symbol,value) assert symbol:=value - * - * You, the caller, have control over errors: this just reports them. - * - * This package requires malloc(), free(). - * Malloc(size) returns NULL or address of char[size]. - * Free(address) frees same. - */ - -/* - * The code and its structures are re-enterent. - * Before you do anything else, you must call hash_new() which will - * return the address of a hash-table-control-block (or NULL if there - * is not enough memory). You then use this address as a handle of the - * symbol table by passing it to all the other hash_...() functions. - * The only approved way to recover the memory used by the symbol table - * is to call hash_die() with the handle of the symbol table. - * - * Before you call hash_die() you normally delete anything pointed to - * by individual symbols. After hash_die() you can't use that symbol - * table again. - * - * The char* you associate with a symbol may not be NULL (0) because - * NULL is returned whenever a symbol is not in the table. Any other - * value is OK, except DELETED, #defined below. - * - * When you supply a symbol string for insertion, YOU MUST PRESERVE THE - * STRING until that symbol is deleted from the table. The reason is that - * only the address you supply, NOT the symbol string itself, is stored - * in the symbol table. - * - * You may delete and add symbols arbitrarily. - * Any or all symbols may have the same 'value' (char *). In fact, these - * routines don't do anything with your symbol values. - * - * You have no right to know where the symbol:char* mapping is stored, - * because it moves around in memory; also because we may change how it - * works and we don't want to break your code do we? However the handle - * (address of struct hash_control) is never changed in - * the life of the symbol table. - * - * What you CAN find out about a symbol table is: - * how many slots are in the hash table? - * how many slots are filled with symbols? - * (total hashes,collisions) for (reads,writes) (*) - * All of the above values vary in time. - * (*) some of these numbers will not be meaningful if we change the - * internals. - */ - -/* - * I N T E R N A L - * - * Hash table is an array of hash_entries; each entry is a pointer to a - * a string and a user-supplied value 1 char* wide. - * - * The array always has 2 ** n elements, n>0, n integer. - * There is also a 'wall' entry after the array, which is always empty - * and acts as a sentinel to stop running off the end of the array. - * When the array gets too full, we create a new array twice as large - * and re-hash the symbols into the new array, then forget the old array. - * (Of course, we copy the values into the new array before we junk the - * old array!) - * - */ - -#include <stdio.h> -#define TRUE (1) -#define FALSE (0) -#include <ctype.h> -#define min(a, b) ((a) < (b) ? (a) : (b)) - -#include "hash.h" -char *xmalloc(); - -#define DELETED ((char *)1) /* guarenteed invalid address */ -#define START_POWER (11) /* power of two: size of new hash table *//* JF was 6 */ -/* JF These next two aren't used any more. */ -/* #define START_SIZE (64) / * 2 ** START_POWER */ -/* #define START_FULL (32) / * number of entries before table expands */ -#define islive(ptr) (ptr->hash_string && ptr->hash_string!=DELETED) - /* above TRUE if a symbol is in entry @ ptr */ - -#define STAT_SIZE (0) /* number of slots in hash table */ - /* the wall does not count here */ - /* we expect this is always a power of 2 */ -#define STAT_ACCESS (1) /* number of hash_ask()s */ -#define STAT__READ (0) /* reading */ -#define STAT__WRITE (1) /* writing */ -#define STAT_COLLIDE (3) /* number of collisions (total) */ - /* this may exceed STAT_ACCESS if we have */ - /* lots of collisions/access */ -#define STAT_USED (5) /* slots used right now */ -#define STATLENGTH (6) /* size of statistics block */ -#if STATLENGTH != HASH_STATLENGTH -Panic! Please make #include "stat.h" agree with previous definitions! -#endif - -/* #define SUSPECT to do runtime checks */ -/* #define TEST to be a test jig for hash...() */ - -#ifdef TEST /* TEST: use smaller hash table */ -#undef START_POWER -#define START_POWER (3) -#undef START_SIZE -#define START_SIZE (8) -#undef START_FULL -#define START_FULL (4) -#endif - -/*------------------ plan ---------------------------------- i = internal - -struct hash_control * c; -struct hash_entry * e; i -int b[z]; buffer for statistics - z size of b -char * s; symbol string (address) [ key ] -char * v; value string (address) [datum] -boolean f; TRUE if we found s in hash table i -char * t; error string; "" means OK -int a; access type [0...n) i - -c=hash_new () create new hash_control - -hash_die (c) destroy hash_control (and hash table) - table should be empty. - doesn't check if table is empty. - c has no meaning after this. - -hash_say (c,b,z) report statistics of hash_control. - also report number of available statistics. - -v=hash_delete (c,s) delete symbol, return old value if any. - ask() NULL means no old value. - f - -v=hash_replace (c,s,v) replace old value of s with v. - ask() NULL means no old value: no table change. - f - -t=hash_insert (c,s,v) insert (s,v) in c. - ask() return error string. - f it is an error to insert if s is already - in table. - if any error, c is unchanged. - -t=hash_jam (c,s,v) assert that new value of s will be v. i - ask() it may decide to GROW the table. i - f i - grow() i -t=hash_grow (c) grow the hash table. i - jam() will invoke JAM. i - -?=hash_apply (c,y) apply y() to every symbol in c. - y evtries visited in 'unspecified' order. - -v=hash_find (c,s) return value of s, or NULL if s not in c. - ask() - f - -f,e=hash_ask() (c,s,a) return slot where s SHOULD live. i - code() maintain collision stats in c. i - -.=hash_code (c,s) compute hash-code for s, i - from parameters of c. i - -*/ - -static char hash_found; /* returned by hash_ask() to stop extra */ - /* testing. hash_ask() wants to return both */ - /* a slot and a status. This is the status. */ - /* TRUE: found symbol */ - /* FALSE: absent: empty or deleted slot */ - /* Also returned by hash_jam(). */ - /* TRUE: we replaced a value */ - /* FALSE: we inserted a value */ - -static struct hash_entry * hash_ask(); -static int hash_code (); -static char * hash_grow(); - -/* - * h a s h _ n e w ( ) - * - */ -struct hash_control * -hash_new() /* create a new hash table */ - /* return NULL if failed */ - /* return handle (address of struct hash) */ -{ - register struct hash_control * retval; - register struct hash_entry * room; /* points to hash table */ - register struct hash_entry * wall; - register struct hash_entry * entry; - char * malloc(); - register int * ip; /* scan stats block of struct hash_control */ - register int * nd; /* limit of stats block */ - - if ( room = (struct hash_entry *) malloc( sizeof(struct hash_entry)*((1<<START_POWER) + 1) ) ) - /* +1 for the wall entry */ - { - if ( retval = (struct hash_control *) malloc(sizeof(struct hash_control)) ) - { - nd = retval->hash_stat + STATLENGTH; - for (ip=retval->hash_stat; ip<nd; ip++) - { - *ip = 0; - } - - retval -> hash_stat[STAT_SIZE] = 1<<START_POWER; - retval -> hash_mask = (1<<START_POWER) - 1; - retval -> hash_sizelog = START_POWER; - /* works for 1's compl ok */ - retval -> hash_where = room; - retval -> hash_wall = - wall = room + (1<<START_POWER); - retval -> hash_full = (1<<START_POWER)/2; - for (entry=room; entry<=wall; entry++) - { - entry->hash_string = NULL; - } - } - } - else - { - retval = NULL; /* no room for table: fake a failure */ - } - return(retval); /* return NULL or set-up structs */ -} - -/* - * h a s h _ d i e ( ) - * - * Table should be empty, but this is not checked. - * To empty the table, try hash_apply()ing a symbol deleter. - * Return to free memory both the hash table and it's control - * block. - * 'handle' has no meaning after this function. - * No errors are recoverable. - */ -void -hash_die(handle) - struct hash_control * handle; -{ - free((char *)handle->hash_where); - free((char *)handle); -} - -/* - * h a s h _ s a y ( ) - * - * Return the size of the statistics table, and as many statistics as - * we can until either (a) we have run out of statistics or (b) caller - * has run out of buffer. - * NOTE: hash_say treats all statistics alike. - * These numbers may change with time, due to insertions, deletions - * and expansions of the table. - * The first "statistic" returned is the length of hash_stat[]. - * Then contents of hash_stat[] are read out (in ascending order) - * until your buffer or hash_stat[] is exausted. - */ -void -hash_say(handle,buffer,bufsiz) - register struct hash_control * handle; - register int buffer[/*bufsiz*/]; - register int bufsiz; -{ - register int * nd; /* limit of statistics block */ - register int * ip; /* scan statistics */ - - ip = handle -> hash_stat; - nd = ip + min(bufsiz-1,STATLENGTH); - if (bufsiz>0) /* trust nothing! bufsiz<=0 is dangerous */ - { - *buffer++ = STATLENGTH; - for (; ip<nd; ip++,buffer++) - { - *buffer = *ip; - } - } -} - -/* - * h a s h _ d e l e t e ( ) - * - * Try to delete a symbol from the table. - * If it was there, return its value (and adjust STAT_USED). - * Otherwise, return NULL. - * Anyway, the symbol is not present after this function. - * - */ -char * /* NULL if string not in table, else */ - /* returns value of deleted symbol */ -hash_delete(handle,string) - register struct hash_control * handle; - register char * string; -{ - register char * retval; /* NULL if string not in table */ - register struct hash_entry * entry; /* NULL or entry of this symbol */ - - entry = hash_ask(handle,string,STAT__WRITE); - if (hash_found) - { - retval = entry -> hash_value; - entry -> hash_string = DELETED; /* mark as deleted */ - handle -> hash_stat[STAT_USED] -= 1; /* slots-in-use count */ -#ifdef SUSPECT - if (handle->hash_stat[STAT_USED]<0) - { - error("hash_delete"); - } -#endif /* def SUSPECT */ - } - else - { - retval = NULL; - } - return(retval); -} - -/* - * h a s h _ r e p l a c e ( ) - * - * Try to replace the old value of a symbol with a new value. - * Normally return the old value. - * Return NULL and don't change the table if the symbol is not already - * in the table. - */ -char * -hash_replace(handle,string,value) - register struct hash_control * handle; - register char * string; - register char * value; -{ - register struct hash_entry * entry; - register char * retval; - - entry = hash_ask(handle,string,STAT__WRITE); - if (hash_found) - { - retval = entry -> hash_value; - entry -> hash_value = value; - } - else - { - retval = NULL; - } - ; - return (retval); -} - -/* - * h a s h _ i n s e r t ( ) - * - * Insert a (symbol-string, value) into the hash table. - * Return an error string, "" means OK. - * It is an 'error' to insert an existing symbol. - */ - -char * /* return error string */ -hash_insert(handle,string,value) - register struct hash_control * handle; - register char * string; - register char * value; -{ - register struct hash_entry * entry; - register char * retval; - - retval = ""; - if (handle->hash_stat[STAT_USED] > handle->hash_full) - { - retval = hash_grow(handle); - } - if ( ! * retval) - { - entry = hash_ask(handle,string,STAT__WRITE); - if (hash_found) - { - retval = "exists"; - } - else - { - entry -> hash_value = value; - entry -> hash_string = string; - handle-> hash_stat[STAT_USED] += 1; - } - } - return(retval); -} - -/* - * h a s h _ j a m ( ) - * - * Regardless of what was in the symbol table before, after hash_jam() - * the named symbol has the given value. The symbol is either inserted or - * (its value is) relpaced. - * An error message string is returned, "" means OK. - * - * WARNING: this may decide to grow the hashed symbol table. - * To do this, we call hash_grow(), WHICH WILL recursively CALL US. - * - * We report status internally: hash_found is TRUE if we replaced, but - * false if we inserted. - */ -char * -hash_jam(handle,string,value) - register struct hash_control * handle; - register char * string; - register char * value; -{ - register char * retval; - register struct hash_entry * entry; - - retval = ""; - if (handle->hash_stat[STAT_USED] > handle->hash_full) - { - retval = hash_grow(handle); - } - if (! * retval) - { - entry = hash_ask(handle,string,STAT__WRITE); - if ( ! hash_found) - { - entry -> hash_string = string; - handle->hash_stat[STAT_USED] += 1; - } - entry -> hash_value = value; - } - return(retval); -} - -/* - * h a s h _ g r o w ( ) - * - * Grow a new (bigger) hash table from the old one. - * We choose to double the hash table's size. - * Return a human-scrutible error string: "" if OK. - * Warning! This uses hash_jam(), which had better not recurse - * back here! Hash_jam() conditionally calls us, but we ALWAYS - * call hash_jam()! - * Internal. - */ -static char * -hash_grow(handle) /* make a hash table grow */ - struct hash_control * handle; -{ - register struct hash_entry * newwall; - register struct hash_entry * newwhere; - struct hash_entry * newtrack; - register struct hash_entry * oldtrack; - register struct hash_entry * oldwhere; - register struct hash_entry * oldwall; - register int temp; - int newsize; - char * string; - char * retval; -#ifdef SUSPECT - int oldused; -#endif - - /* - * capture info about old hash table - */ - oldwhere = handle -> hash_where; - oldwall = handle -> hash_wall; -#ifdef SUSPECT - oldused = handle -> hash_stat[STAT_USED]; -#endif - /* - * attempt to get enough room for a hash table twice as big - */ - temp = handle->hash_stat[STAT_SIZE]; - if ( newwhere = (struct hash_entry *) xmalloc((long)((temp+temp+1)*sizeof(struct hash_entry)))) - /* +1 for wall slot */ - { - retval = ""; /* assume success until proven otherwise */ - /* - * have enough room: now we do all the work. - * double the size of everything in handle, - * note: hash_mask frob works for 1's & for 2's complement machines - */ - handle->hash_mask = handle->hash_mask + handle->hash_mask + 1; - handle->hash_stat[STAT_SIZE] <<= 1; - newsize = handle->hash_stat[STAT_SIZE]; - handle->hash_where = newwhere; - handle->hash_full <<= 1; - handle->hash_sizelog += 1; - handle->hash_stat[STAT_USED] = 0; - handle->hash_wall = - newwall = newwhere + newsize; - /* - * set all those pesky new slots to vacant. - */ - for (newtrack=newwhere; newtrack <= newwall; newtrack++) - { - newtrack -> hash_string = NULL; - } - /* - * we will do a scan of the old table, the hard way, using the - * new control block to re-insert the data into new hash table. - */ - handle -> hash_stat[STAT_USED] = 0; /* inserts will bump it up to correct */ - for (oldtrack=oldwhere; oldtrack < oldwall; oldtrack++) - { - if ( (string=oldtrack->hash_string) && string!=DELETED ) - { - if ( * (retval = hash_jam(handle,string,oldtrack->hash_value) ) ) - { - break; - } - } - } -#ifdef SUSPECT - if ( !*retval && handle->hash_stat[STAT_USED] != oldused) - { - retval = "hash_used"; - } -#endif - if (!*retval) - { - /* - * we have a completely faked up control block. - * return the old hash table. - */ - free((char *)oldwhere); - /* - * Here with success. retval is already "". - */ - } - } - else - { - retval = "no room"; - } - return(retval); -} - -/* - * h a s h _ a p p l y ( ) - * - * Use this to scan each entry in symbol table. - * For each symbol, this calls (applys) a nominated function supplying the - * symbol's value (and the symbol's name). - * The idea is you use this to destroy whatever is associted with - * any values in the table BEFORE you destroy the table with hash_die. - * Of course, you can use it for other jobs; whenever you need to - * visit all extant symbols in the table. - * - * We choose to have a call-you-back idea for two reasons: - * asthetic: it is a neater idea to use apply than an explicit loop - * sensible: if we ever had to grow the symbol table (due to insertions) - * then we would lose our place in the table when we re-hashed - * symbols into the new table in a different order. - * - * The order symbols are visited depends entirely on the hashing function. - * Whenever you insert a (symbol, value) you risk expanding the table. If - * you do expand the table, then the hashing function WILL change, so you - * MIGHT get a different order of symbols visited. In other words, if you - * want the same order of visiting symbols as the last time you used - * hash_apply() then you better not have done any hash_insert()s or - * hash_jam()s since the last time you used hash_apply(). - * - * In future we may use the value returned by your nominated function. - * One idea is to abort the scan if, after applying the function to a - * certain node, the function returns a certain code. - * To be safe, please make your functions of type char *. If you always - * return NULL, then the scan will complete, visiting every symbol in - * the table exactly once. ALL OTHER RETURNED VALUES have no meaning yet! - * Caveat Actor! - * - * The function you supply should be of the form: - * char * myfunct(string,value) - * char * string; |* the symbol's name *| - * char * value; |* the symbol's value *| - * { - * |* ... *| - * return(NULL); - * } - * - * The returned value of hash_apply() is (char*)NULL. In future it may return - * other values. NULL means "completed scan OK". Other values have no meaning - * yet. (The function has no graceful failures.) - */ -char * -hash_apply(handle,function) - struct hash_control * handle; - char* (*function)(); -{ - register struct hash_entry * entry; - register struct hash_entry * wall; - - wall = handle->hash_wall; - for (entry = handle->hash_where; entry < wall; entry++) - { - if (islive(entry)) /* silly code: tests entry->string twice! */ - { - (*function)(entry->hash_string,entry->hash_value); - } - } - return (NULL); -} - -/* - * h a s h _ f i n d ( ) - * - * Given symbol string, find value (if any). - * Return found value or NULL. - */ -char * -hash_find(handle,string) /* return char* or NULL */ - struct hash_control * handle; - char * string; -{ - register struct hash_entry * entry; - register char * retval; - - entry = hash_ask(handle,string,STAT__READ); - if (hash_found) - { - retval = entry->hash_value; - } - else - { - retval = NULL; - } - return(retval); -} - -/* - * h a s h _ a s k ( ) - * - * Searches for given symbol string. - * Return the slot where it OUGHT to live. It may be there. - * Return hash_found: TRUE only if symbol is in that slot. - * Access argument is to help keep statistics in control block. - * Internal. - */ -static struct hash_entry * /* string slot, may be empty or deleted */ -hash_ask(handle,string,access) - struct hash_control * handle; - char * string; - int access; /* access type */ -{ - register char *string1; /* JF avoid strcmp calls */ - register char * s; - register int c; - register struct hash_entry * slot; - register int collision; /* count collisions */ - - slot = handle->hash_where + hash_code(handle,string); /* start looking here */ - handle->hash_stat[STAT_ACCESS+access] += 1; - collision = 0; - hash_found = FALSE; - while ( (s = slot->hash_string) && s!=DELETED ) - { - for(string1=string;;) { - if(!(c= *s++)) { - if(!*string1) - hash_found = TRUE; - break; - } - if(*string1++!=c) - break; - } - if(hash_found) - break; - collision++; - slot++; - } - /* - * slot: return: - * in use: we found string slot - * at empty: - * at wall: we fell off: wrap round ???? - * in table: dig here slot - * at DELETED: dig here slot - */ - if (slot==handle->hash_wall) - { - slot = handle->hash_where; /* now look again */ - while( (s = slot->hash_string) && s!=DELETED ) - { - for(string1=string;*s;string1++,s++) { - if(*string1!=*s) - break; - } - if(*s==*string1) { - hash_found = TRUE; - break; - } - collision++; - slot++; - } - /* - * slot: return: - * in use: we found it slot - * empty: wall: ERROR IMPOSSIBLE !!!! - * in table: dig here slot - * DELETED:dig here slot - */ - } -/* fprintf(stderr,"hash_ask(%s)->%d(%d)\n",string,hash_code(handle,string),collision); */ - handle -> hash_stat[STAT_COLLIDE+access] += collision; - return(slot); /* also return hash_found */ -} - -/* - * h a s h _ c o d e - * - * Does hashing of symbol string to hash number. - * Internal. - */ -static int -hash_code(handle,string) - struct hash_control * handle; - register char * string; -{ - register long int h; /* hash code built here */ - register long int c; /* each character lands here */ - register int n; /* Amount to shift h by */ - - n = (handle->hash_sizelog - 3); - h = 0; - while (c = *string++) - { - h += c; - h = (h<<3) + (h>>n) + c; - } - return (h & handle->hash_mask); -} - -/* - * Here is a test program to exercise above. - */ -#ifdef TEST - -#define TABLES (6) /* number of hash tables to maintain */ - /* (at once) in any testing */ -#define STATBUFSIZE (12) /* we can have 12 statistics */ - -int statbuf[STATBUFSIZE]; /* display statistics here */ -char answer[100]; /* human farts here */ -char * hashtable[TABLES]; /* we test many hash tables at once */ -char * h; /* points to curent hash_control */ -char ** pp; -char * p; -char * name; -char * value; -int size; -int used; -char command; -int number; /* number 0:TABLES-1 of current hashed */ - /* symbol table */ - -main() -{ - char (*applicatee()); - char * hash_find(); - char * destroy(); - char * what(); - struct hash_control * hash_new(); - char * hash_replace(); - int * ip; - - number = 0; - h = 0; - printf("type h <RETURN> for help\n"); - for(;;) - { - printf("hash_test command: "); - gets(answer); - command = answer[0]; - if (isupper(command)) command = tolower(command); /* ecch! */ - switch (command) - { - case '#': - printf("old hash table #=%d.\n",number); - whattable(); - break; - case '?': - for (pp=hashtable; pp<hashtable+TABLES; pp++) - { - printf("address of hash table #%d control block is %xx\n" - ,pp-hashtable,*pp); - } - break; - case 'a': - hash_apply(h,applicatee); - break; - case 'd': - hash_apply(h,destroy); - hash_die(h); - break; - case 'f': - p = hash_find(h,name=what("symbol")); - printf("value of \"%s\" is \"%s\"\n",name,p?p:"NOT-PRESENT"); - break; - case 'h': - printf("# show old, select new default hash table number\n"); - printf("? display all hashtable control block addresses\n"); - printf("a apply a simple display-er to each symbol in table\n"); - printf("d die: destroy hashtable\n"); - printf("f find value of nominated symbol\n"); - printf("h this help\n"); - printf("i insert value into symbol\n"); - printf("j jam value into symbol\n"); - printf("n new hashtable\n"); - printf("r replace a value with another\n"); - printf("s say what %% of table is used\n"); - printf("q exit this program\n"); - printf("x delete a symbol from table, report its value\n"); - break; - case 'i': - p = hash_insert(h,name=what("symbol"),value=what("value")); - if (*p) - { - printf("symbol=\"%s\" value=\"%s\" error=%s\n",name,value,p); - } - break; - case 'j': - p = hash_jam(h,name=what("symbol"),value=what("value")); - if (*p) - { - printf("symbol=\"%s\" value=\"%s\" error=%s\n",name,value,p); - } - break; - case 'n': - h = hashtable[number] = (char *) hash_new(); - break; - case 'q': - exit(); - case 'r': - p = hash_replace(h,name=what("symbol"),value=what("value")); - printf("old value was \"%s\"\n",p?p:"{}"); - break; - case 's': - hash_say(h,statbuf,STATBUFSIZE); - for (ip=statbuf; ip<statbuf+STATBUFSIZE; ip++) - { - printf("%d ",*ip); - } - printf("\n"); - break; - case 'x': - p = hash_delete(h,name=what("symbol")); - printf("old value was \"%s\"\n",p?p:"{}"); - break; - default: - printf("I can't understand command \"%c\"\n",command); - break; - } - } -} - -char * -what(description) - char * description; -{ - char * retval; - char * malloc(); - - printf(" %s : ",description); - gets(answer); - /* will one day clean up answer here */ - retval = malloc(strlen(answer)+1); - if (!retval) - { - error("room"); - } - (void)strcpy(retval,answer); - return(retval); -} - -char * -destroy(string,value) - char * string; - char * value; -{ - free(string); - free(value); - return(NULL); -} - - -char * -applicatee(string,value) - char * string; - char * value; -{ - printf("%.20s-%.20s\n",string,value); - return(NULL); -} - -whattable() /* determine number: what hash table to use */ - /* also determine h: points to hash_control */ -{ - - for (;;) - { - printf(" what hash table (%d:%d) ? ",0,TABLES-1); - gets(answer); - sscanf(answer,"%d",&number); - if (number>=0 && number<TABLES) - { - h = hashtable[number]; - if (!h) - { - printf("warning: current hash-table-#%d. has no hash-control\n",number); - } - return; - } - else - { - printf("invalid hash table number: %d\n",number); - } - } -} - - - -#endif /* #ifdef TEST */ - -/* end: hash.c */ diff --git a/gnu/gas/hash.h b/gnu/gas/hash.h deleted file mode 100644 index fb68fd3f1786..000000000000 --- a/gnu/gas/hash.h +++ /dev/null @@ -1,59 +0,0 @@ -/* hash.h - for hash.c - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifndef hashH -#define hashH - -struct hash_entry -{ - char * hash_string; /* points to where the symbol string is */ - /* NULL means slot is not used */ - /* DELETED means slot was deleted */ - char * hash_value; /* user's datum, associated with symbol */ -}; - - -#define HASH_STATLENGTH (6) -struct hash_control -{ - struct hash_entry * hash_where; /* address of hash table */ - int hash_sizelog; /* Log of ( hash_mask + 1 ) */ - int hash_mask; /* masks a hash into index into table */ - int hash_full; /* when hash_stat[STAT_USED] exceeds this, */ - /* grow table */ - struct hash_entry * hash_wall; /* point just after last (usable) entry */ - /* here we have some statistics */ - int hash_stat[HASH_STATLENGTH]; /* lies & statistics */ - /* we need STAT_USED & STAT_SIZE */ -}; - - -/* returns */ -struct hash_control * hash_new(); /* [control block] */ -void hash_die(); -void hash_say(); -char * hash_delete(); /* previous value */ -char * hash_relpace(); /* previous value */ -char * hash_insert(); /* error string */ -char * hash_apply(); /* 0 means OK */ -char * hash_find(); /* value */ -char * hash_jam(); /* error text (internal) */ -#endif /* #ifdef hashH */ - -/* end: hash.c */ diff --git a/gnu/gas/hex-value.c b/gnu/gas/hex-value.c deleted file mode 100644 index f97c2ab31ecc..000000000000 --- a/gnu/gas/hex-value.c +++ /dev/null @@ -1,55 +0,0 @@ -/* hex_value.c - char=>radix-value - - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - * Export: Hex_value[]. Converts digits to their radix-values. - * As distributed assumes 8 bits per char (256 entries) and ASCII. - */ - -#define __ (42) /* blatently illegal digit value */ - /* exceeds any normal radix */ -#if !defined(__STDC__) && !defined(const) -#define const /* empty */ -#endif -const char -hex_value [256] = { /* for fast ASCII -> binary */ - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, __, __, __, __, __, __, - __, 10, 11, 12, 13, 14, 15, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, 10, 11, 12, 13, 14, 15, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, - __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __ - }; - -#ifdef VMS -dummy2() -{ -} -#endif -/* end:hex_value.c */ diff --git a/gnu/gas/input-file.c b/gnu/gas/input-file.c deleted file mode 100644 index 8de1dcf15342..000000000000 --- a/gnu/gas/input-file.c +++ /dev/null @@ -1,306 +0,0 @@ -/*- - * This code is derived from software copyrighted by the Free Software - * Foundation. - * - * Modified 1991 by Donn Seeley at UUNET Technologies, Inc. - */ - -#ifndef lint -static char sccsid[] = "@(#)input-file.c 6.2 (Berkeley) 5/8/91"; -#endif /* not lint */ - -/* input_file.c - Deal with Input Files - - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - * Confines all details of reading source bytes to this module. - * All O/S specific crocks should live here. - * What we lose in "efficiency" we gain in modularity. - * Note we don't need to #include the "as.h" file. No common coupling! - */ - -#define NDEBUG /* JF remove asserts */ - -#ifdef USG -#define index strchr -/* JF: What's the difference between _IOLBF and _IOFBF ? */ -#define setbuffer(stream, buf, size) setvbuf((stream), (buf), _IOFBF, (size)) -#endif - -#include <stdio.h> -#include <assert.h> -/* #include <sys/types.h> -#include <sys/stat.h> -#include <sys/file.h> -#include <sys/wait.h> */ - -/* #include "style.h" */ -#include "input-file.h" - -/* This variable is non-zero if the file currently being read should be - preprocessed by app. It is zero if the file can be read straight in. - */ -int preprocess = 0; - -void as_perror(); - -/* - * This code opens a file, then delivers BUFFER_SIZE character - * chunks of the file on demand. - * BUFFER_SIZE is supposed to be a number chosen for speed. - * The caller only asks once what BUFFER_SIZE is, and asks before - * the nature of the input files (if any) is known. - */ - -#define BUFFER_SIZE (32 * 1024) - -static char in_buf[BUFFER_SIZE]; - -/* - * We use static data: the data area is not sharable. - */ - -FILE *f_in; /* JF do things the RIGHT way */ -/* static JF remove static so app.c can use file_name */ -char * file_name; - -/* These hooks accomodate most operating systems. */ - -void -input_file_begin () -{ - /* file_handle = -1; */ - f_in = (FILE *)0; -} - -void -input_file_end () -{ -} - -int /* Return BUFFER_SIZE. */ -input_file_buffer_size () -{ - return (BUFFER_SIZE); -} - -int -input_file_is_open () -{ - /* return (file_handle >= 0); */ - return f_in!=(FILE *)0; -} - -#ifdef DONTDEF /* JF save old version in case we need it */ -void -input_file_open (filename, preprocess, debugging) - char * filename; /* "" means use stdin. Must not be 0. */ - int preprocess; /* TRUE if needs app. */ - int debugging; /* TRUE if we are debugging assembler. */ -{ - assert( filename != 0 ); /* Filename may not be NULL. */ - if (filename [0]) - { /* We have a file name. Suck it and see. */ - file_handle = open (filename, O_RDONLY, 0); - file_name = filename; - } - else - { /* use stdin for the input file. */ - file_handle = fileno (stdin); - file_name = "{standard input}"; /* For error messages. */ - } - if (file_handle < 0) - as_perror ("Can't open %s for reading", file_name); - if ( preprocess ) - { -/* - * This code was written in haste for a frobbed BSD 4.2. - * I have a flight to catch: will someone please do proper - * error checks? - Dean. - */ - int pid; - char temporary_file_name [12]; - int fd; - union wait status; - char *mktemp(); - - (void)strcpy (temporary_file_name, "#appXXXXXX"); - (void)mktemp (temporary_file_name); - pid = vfork (); - if (pid == -1) - { - as_perror ("Vfork failed", file_name); - _exit (144); - } - if (pid == 0) - { - (void)dup2 (file_handle, fileno(stdin)); - fd = open (temporary_file_name, O_WRONLY + O_TRUNC + O_CREAT, 0666); - if (fd == -1) - { - (void)write(2,"Can't open temporary\n",21); - _exit (99); - } - (void)dup2 (fd, fileno(stdout)); -/* JF for testing #define PREPROCESSOR "/lib/app" */ -#define PREPROCESSOR "./app" - execl (PREPROCESSOR, PREPROCESSOR, 0); - execl ("app","app",0); - (void)write(2,"Exec of app failed. Get help.\n",31); - (void)unlink(temporary_file_name); - _exit (11); - } - (void)wait (& status); - if (status.w_status & 0xFF00) /* JF was 0xF000, was wrong */ - { - file_handle = -1; - as_warn( "Can't preprocess file \"%s\", status = %xx", file_name, status.w_status ); - } - else - { - file_handle = open (temporary_file_name, O_RDONLY, 0); - if ( ! debugging && unlink(temporary_file_name)) - as_perror ("Can't delete temp file %s", temporary_file_name); - } - if (file_handle == -1) - as_perror ("Can't retrieve temp file %s", temporary_file_name); - } -} -#else - -void -input_file_open (filename,pre) - char * filename; /* "" means use stdin. Must not be 0. */ - int pre; -{ - int c; - char buf[80]; - - preprocess = pre; - - assert( filename != 0 ); /* Filename may not be NULL. */ - if (filename [0]) { /* We have a file name. Suck it and see. */ - f_in=fopen(filename,"r"); - file_name=filename; - } else { /* use stdin for the input file. */ - f_in = stdin; - file_name = "{standard input}"; /* For error messages. */ - } - if (f_in==(FILE *)0) { - as_perror ("Can't open %s for reading", file_name); - return; - } -#ifndef VMS - setbuffer(f_in,in_buf,BUFFER_SIZE); -#endif /* VMS */ - c=getc(f_in); - if(c=='#') { /* Begins with comment, may not want to preprocess */ - c=getc(f_in); - if(c=='N') { - fgets(buf,80,f_in); - if(!strcmp(buf,"O_APP\n")) - preprocess=0; - if(!index(buf,'\n')) - ungetc('#',f_in); /* It was longer */ - else - ungetc('\n',f_in); - } else if(c=='\n') - ungetc('\n',f_in); - else - ungetc('#',f_in); - } else - ungetc(c,f_in); - -#ifdef DONTDEF - if ( preprocess ) { - char temporary_file_name [17]; - char *mktemp(); - FILE *f_out; - - (void)strcpy (temporary_file_name, "/tmp/#appXXXXXX"); - (void)mktemp (temporary_file_name); - f_out=fopen(temporary_file_name,"w+"); - if(f_out==(FILE *)0) - as_perror("Can't open temp file %s",temporary_file_name); - - /* JF this will have to be moved on any system that - does not support removal of open files. */ - (void)unlink(temporary_file_name);/* JF do it NOW */ - do_scrub(f_in,f_out); - (void)fclose(f_in); /* All done with it */ - (void)rewind(f_out); - f_in=f_out; - } -#endif -} -#endif - -char * -input_file_give_next_buffer (where) - char * where; /* Where to place 1st character of new buffer. */ -{ - char * return_value; /* -> Last char of what we read, + 1. */ - register int size; - - if (f_in == (FILE *)0) - return 0; - /* - * fflush (stdin); could be done here if you want to synchronise - * stdin and stdout, for the case where our input file is stdin. - * Since the assembler shouldn't do any output to stdout, we - * don't bother to synch output and input. - */ - /* size = read (file_handle, where, BUFFER_SIZE); */ - if(preprocess) { - char *p; - int n; - int ch; - extern FILE *scrub_file; - int scrub_from_file(); - void scrub_to_file(); - int do_scrub_next_char(); - - scrub_file=f_in; - for(p=where,n=BUFFER_SIZE;n;--n) { - ch=do_scrub_next_char(scrub_from_file,scrub_to_file); - if(ch==EOF) - break; - *p++=ch; - } - size=BUFFER_SIZE-n; - } else - size= fread(where,sizeof(char),BUFFER_SIZE,f_in); - if (size < 0) - { - as_perror ("Can't read from %s", file_name); - size = 0; - } - if (size) - return_value = where + size; - else - { - if (fclose (f_in)) - as_perror ("Can't close %s", file_name); - f_in = (FILE *)0; - return_value = 0; - } - return (return_value); -} - -/* end: input_file.c */ diff --git a/gnu/gas/input-file.h b/gnu/gas/input-file.h deleted file mode 100644 index 42f490aba4f5..000000000000 --- a/gnu/gas/input-file.h +++ /dev/null @@ -1,57 +0,0 @@ -/* input_file.h header for input-file.c - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/*"input_file.c":Operating-system dependant functions to read source files.*/ - - -/* - * No matter what the operating system, this module must provide the - * following services to its callers. - * - * input_file_begin() Call once before anything else. - * - * input_file_end() Call once after everything else. - * - * input_file_buffer_size() Call anytime. Returns largest possible - * delivery from - * input_file_give_next_buffer(). - * - * input_file_open(name) Call once for each input file. - * - * input_file_give_next_buffer(where) Call once to get each new buffer. - * Return 0: no more chars left in file, - * the file has already been closed. - * Otherwise: return a pointer to just - * after the last character we read - * into the buffer. - * If we can only read 0 characters, then - * end-of-file is faked. - * - * All errors are reported (using as_perror) so caller doesn't have to think - * about I/O errors. No I/O errors are fatal: an end-of-file may be faked. - */ - -void input_file_begin(); -void input_file_end(); -int input_file_buffer_size(); -int input_file_is_open(); -void input_file_open(); -char * input_file_give_next_buffer(); - -/* end: input_file.h */ diff --git a/gnu/gas/input-scrub.c b/gnu/gas/input-scrub.c deleted file mode 100644 index 71af8a0bf809..000000000000 --- a/gnu/gas/input-scrub.c +++ /dev/null @@ -1,427 +0,0 @@ -/*- - * This code is derived from software copyrighted by the Free Software - * Foundation. - * - * Modified 1991 by Donn Seeley at UUNET Technologies, Inc. - */ - -#ifndef lint -static char sccsid[] = "@(#)input-scrub.c 6.4 (Berkeley) 5/8/91"; -#endif /* not lint */ - -/* input_scrub.c - layer between app and the rest of the world - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "as.h" -#include "read.h" -#include "input-file.h" - -/* - * O/S independent module to supply buffers of sanitised source code - * to rest of assembler. We get raw input data of some length. - * Also looks after line numbers, for e.g. error messages. - * This module used to do the sanitising, but now a pre-processor program - * (app) does that job so this module is degenerate. - * Now input is pre-sanitised, so we only worry about finding the - * last partial line. A buffer of full lines is returned to caller. - * The last partial line begins the next buffer we build and return to caller. - * The buffer returned to caller is preceeded by BEFORE_STRING and followed - * by AFTER_STRING. The last character before AFTER_STRING is a newline. - */ - -/* - * We expect the following sanitation has already been done. - * - * No comments, reduce a comment to a space. - * Reduce a tab to a space unless it is 1st char of line. - * All multiple tabs and spaces collapsed into 1 char. Tab only - * legal if 1st char of line. - * # line file statements converted to .line x;.file y; statements. - * Escaped newlines at end of line: remove them but add as many newlines - * to end of statement as you removed in the middle, to synch line numbers. - */ - -#define BEFORE_STRING ("\n") -#define AFTER_STRING ("\0") /* bcopy of 0 chars might choke. */ -#define BEFORE_SIZE (1) -#define AFTER_SIZE (1) - -static char * buffer_start; /* -> 1st char of full buffer area. */ -static char * partial_where; /* -> after last full line in buffer. */ -static int partial_size; /* >=0. Number of chars in partial line in buffer. */ -static char save_source [AFTER_SIZE]; - /* Because we need AFTER_STRING just after last */ - /* full line, it clobbers 1st part of partial */ - /* line. So we preserve 1st part of partial */ - /* line here. */ -static int buffer_length; /* What is the largest size buffer that */ - /* input_file_give_next_buffer() could */ - /* return to us? */ - -static void as_1_char (); - -/* -We never have more than one source file open at once. -We may, however, read more than 1 source file in an assembly. -NULL means we have no file open right now. -*/ - - -/* -We must track the physical file and line number for error messages. -We also track a "logical" file and line number corresponding to (C?) -compiler source line numbers. -Whenever we open a file we must fill in physical_input_file. So if it is NULL -we have not opened any files yet. -*/ - -static -char * physical_input_file, - * logical_input_file; - - - -typedef unsigned int line_numberT; /* 1-origin line number in a source file. */ - /* A line ends in '\n' or eof. */ - -static -line_numberT physical_input_line, - logical_input_line; - -void -input_scrub_begin () -{ - know( strlen(BEFORE_STRING) == BEFORE_SIZE ); - know( strlen( AFTER_STRING) == AFTER_SIZE ); - - input_file_begin (); - - buffer_length = input_file_buffer_size (); - - buffer_start = xmalloc ((long)(BEFORE_SIZE + buffer_length + buffer_length + AFTER_SIZE)); - bcopy (BEFORE_STRING, buffer_start, (int)BEFORE_SIZE); - - /* Line number things. */ - logical_input_line = 0; - logical_input_file = (char *)NULL; - physical_input_file = NULL; /* No file read yet. */ - do_scrub_begin(); -} - -void -input_scrub_end () -{ - input_file_end (); -} - -char * /* Return start of caller's part of buffer. */ -input_scrub_new_file (filename) - char * filename; -{ - input_file_open (filename, !flagseen['f']); - physical_input_file = filename[0] ? filename : "{standard input}"; - physical_input_line = 0; - - partial_size = 0; - return (buffer_start + BEFORE_SIZE); -} - -char * -input_scrub_next_buffer (bufp) -char **bufp; -{ - register char * limit; /* -> just after last char of buffer. */ - -#ifdef DONTDEF - if(preprocess) { - if(save_buffer) { - *bufp = save_buffer; - save_buffer = 0; - } - limit = input_file_give_next_buffer(buffer_start+BEFORE_SIZE); - if (!limit) { - partial_where = 0; - if(partial_size) - as_warn("Partial line at end of file ignored"); - return partial_where; - } - - if(partial_size) - bcopy(save_source, partial_where,(int)AFTER_SIZE); - do_scrub(partial_where,partial_size,buffer_start+BEFORE_SIZE,limit-(buffer_start+BEFORE_SIZE),&out_string,&out_length); - limit=out_string + out_length; - for(p=limit;*--p!='\n';) - ; - p++; - if(p<=buffer_start+BEFORE_SIZE) - as_fatal("Source line too long. Please change file '%s' and re-make the assembler.",__FILE__); - - partial_where = p; - partial_size = limit-p; - bcopy(partial_where, save_source,(int)AFTER_SIZE); - bcopy(AFTER_STRING, partial_where, (int)AFTER_SIZE); - - save_buffer = *bufp; - *bufp = out_string; - - return partial_where; - } - - /* We're not preprocessing. Do the right thing */ -#endif - if (partial_size) - { - bcopy (partial_where, buffer_start + BEFORE_SIZE, (int)partial_size); - bcopy (save_source, buffer_start + BEFORE_SIZE, (int)AFTER_SIZE); - } - limit = input_file_give_next_buffer (buffer_start + BEFORE_SIZE + partial_size); - if (limit) - { - register char * p; /* Find last newline. */ - - for (p = limit; * -- p != '\n'; ) - { - } - ++ p; - if (p <= buffer_start + BEFORE_SIZE) - { - as_fatal ("Source line too long. Please change file %s then rebuild assembler.", __FILE__); - } - partial_where = p; - partial_size = limit - p; - bcopy (partial_where, save_source, (int)AFTER_SIZE); - bcopy (AFTER_STRING, partial_where, (int)AFTER_SIZE); - } - else - { - partial_where = 0; - if (partial_size > 0) - { - as_warn( "Partial line at end of file ignored" ); - } - } - return (partial_where); -} - -/* - * The remaining part of this file deals with line numbers, error - * messages and so on. - */ - - -int -seen_at_least_1_file () /* TRUE if we opened any file. */ -{ - return (physical_input_file != NULL); -} - -void -bump_line_counters () -{ - ++ physical_input_line; - ++ logical_input_line; -} - -/* - * new_logical_line() - * - * Tells us what the new logical line number and file are. - * If the line_number is <0, we don't change the current logical line number. - * If the fname is NULL, we don't change the current logical file name. - */ -void -new_logical_line (fname, line_number) - char * fname; /* DON'T destroy it! We point to it! */ - int line_number; -{ - if ( fname ) - { - logical_input_file = fname; - } - if ( line_number >= 0 ) - { - logical_input_line = line_number; - } -} - -/* - * a s _ w h e r e ( ) - * - * Write a line to stderr locating where we are in reading - * input source files. - * As a sop to the debugger of AS, pretty-print the offending line. - */ -void -as_where() -{ - char *p; - line_numberT line; - - if (physical_input_file) - { /* we tried to read SOME source */ - if (input_file_is_open()) - { /* we can still read lines from source */ -#ifdef DONTDEF - fprintf (stderr," @ physical line %ld., file \"%s\"", - (long) physical_input_line, physical_input_file); - fprintf (stderr," @ logical line %ld., file \"%s\"\n", - (long) logical_input_line, logical_input_file); - (void)putc(' ', stderr); - as_howmuch (stderr); - (void)putc('\n', stderr); -#else - p = logical_input_file ? logical_input_file : physical_input_file; - line = logical_input_line ? logical_input_line : physical_input_line; - fprintf(stderr,"%s:%u:", p, line); -#endif - } - else - { -#ifdef DONTDEF - fprintf (stderr," After reading source.\n"); -#else - p = logical_input_file ? logical_input_file : physical_input_file; - line = logical_input_line ? logical_input_line : physical_input_line; - fprintf (stderr,"%s:unknown:", p); -#endif - } - } - else - { -#ifdef DONTDEF - fprintf (stderr," Before reading source.\n"); -#else -#endif - } -} - -/* - * Support for source file debugging. These functions handle - * logical lines and logical files. - */ -static char *saved_file; -static int saved_len; -static line_numberT saved_line; - -void -filestab() -{ - char *file; - int len; - - if (!physical_input_file || - !input_file_is_open()) - return; - - file = logical_input_file ? logical_input_file : physical_input_file; - - if (saved_file == 0 || strcmp(file, saved_file) != 0) - { - stabs(file); - len = strlen(file) + 1; - if (len > saved_len) - { - if (saved_file == 0) - saved_file = xmalloc(len); - else - saved_file = xrealloc(saved_file, len); - memcpy(saved_file, file, len); - saved_len = len; - } - else - strcpy(saved_file, file); - saved_line = 0; - } -} - -void -funcstab(func) - char *func; -{ - if (now_seg != SEG_TEXT) - return; - - filestab(); - stabf(func); -} - -void -linestab() -{ - line_numberT line; - - if (now_seg != SEG_TEXT) - return; - - filestab(); - - line = logical_input_line ? logical_input_line : physical_input_line; - - if (saved_line == 0 || line != saved_line) - { - stabd(line); - saved_line = line; - } -} - -/* - * a s _ h o w m u c h ( ) - * - * Output to given stream how much of line we have scanned so far. - * Assumes we have scanned up to and including input_line_pointer. - * No free '\n' at end of line. - */ -void -as_howmuch (stream) - FILE * stream; /* Opened for write please. */ -{ - register char * p; /* Scan input line. */ - /* register char c; JF unused */ - - for (p = input_line_pointer - 1; * p != '\n'; --p) - { - } - ++ p; /* p -> 1st char of line. */ - for (; p <= input_line_pointer; p++) - { - /* Assume ASCII. EBCDIC & other micro-computer char sets ignored. */ - /* c = *p & 0xFF; JF unused */ - as_1_char (*p, stream); - } -} - -static void -as_1_char (c,stream) - unsigned char c; - FILE * stream; -{ - if ( c > 127 ) - { - (void)putc( '%', stream); - c -= 128; - } - if ( c < 32 ) - { - (void)putc( '^', stream); - c += '@'; - } - (void)putc( c, stream); -} - -/* end: input_scrub.c */ diff --git a/gnu/gas/md.h b/gnu/gas/md.h deleted file mode 100644 index 681d027e52bc..000000000000 --- a/gnu/gas/md.h +++ /dev/null @@ -1,57 +0,0 @@ -/* md.h -machine dependent- */ - -/* Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of Gas, the GNU Assembler. - -The GNU assembler is distributed in the hope that it will be -useful, but WITHOUT ANY WARRANTY. No author or distributor -accepts responsibility to anyone for the consequences of using it -or for whether it serves any particular purpose or works at all, -unless he says so in writing. Refer to the GNU Assembler General -Public License for full details. - -Everyone is granted permission to copy, modify and redistribute -the GNU Assembler, but only under the conditions described in the -GNU Assembler General Public License. A copy of this license is -supposed to have been given to you along with the GNU Assembler -so you can know your rights and responsibilities. It should be -in a file named COPYING. Among other things, the copyright -notice and this notice must be preserved on all copies. */ - -/* In theory (mine, at least!) the machine dependent part of the assembler - should only have to include one file. This one. -- JF */ - -/* JF added this here */ -typedef struct { - char * poc_name; /* assembler mnemonic, lower case, no '.' */ - void (*poc_handler)(); /* Do the work */ - int poc_val; /* Value to pass to handler */ -} -pseudo_typeS; -extern const pseudo_typeS md_pseudo_table[]; - -/* JF moved this here from as.h under the theory that nobody except MACHINE.c - and write.c care about it anyway. */ - -typedef struct -{ - long rlx_forward; /* Forward reach. Signed number. > 0. */ - long rlx_backward; /* Backward reach. Signed number. < 0. */ - unsigned char rlx_length; /* Bytes length of this address. */ - relax_substateT rlx_more; /* Next longer relax-state. */ - /* 0 means there is no 'next' relax-state. */ -} -relax_typeS; - -extern const relax_typeS md_relax_table[]; /* Define it in MACHINE.c */ - -char * md_atof(); -void md_assemble(); -void md_begin(); -void md_convert_frag(); -void md_end(); -int md_estimate_size_before_relax(); -void md_number_to_chars(); - -/* end: md.h */ diff --git a/gnu/gas/messages.c b/gnu/gas/messages.c deleted file mode 100644 index a7b1205287cb..000000000000 --- a/gnu/gas/messages.c +++ /dev/null @@ -1,238 +0,0 @@ -/* messages.c - error reporter - - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include <stdio.h> /* define stderr */ -#ifdef VMS -#include <errno.h> /* Need this to make errno declaration right */ -#include <perror.h> /* Need this to make sys_errlist/sys_nerr right */ -#endif /* VMS */ - -#include "as.h" - -#ifndef NO_VARARGS -#include <varargs.h> -#endif - -/* - ERRORS - - JF: this is now bogus. We now print more standard error messages - that try to look like everyone else's. - - We print the error message 1st, beginning in column 1. - All ancillary info starts in column 2 on lines after the - key error text. - We try to print a location in logical and physical file - just after the main error text. - Caller then prints any appendices after that, begining all - lines with at least 1 space. - - Optionally, we may die. - There is no need for a trailing '\n' in your error text format - because we supply one. - -as_warn(fmt,args) Like fprintf(stderr,fmt,args) but also call errwhere(). - -as_fatal(fmt,args) Like as_warn() but exit with a fatal status. - -*/ - - -/* Nonzero if we've hit a 'bad error', and should not write an obj file, - and exit with a nonzero error code */ - -int bad_error = 0; - - -/* - * a s _ p e r r o r - * - * Like perror(3), but with more info. - */ -/* JF moved from input-scrub.c to here. */ -void -as_perror(gripe, filename) - char * gripe; /* Unpunctuated error theme. */ - char * filename; -{ - extern int errno; /* See perror(3) for details. */ - extern int sys_nerr; - extern char * sys_errlist[]; - - as_where(); - fprintf (stderr,gripe,filename); - if (errno > sys_nerr) - fprintf (stderr, "Unknown error #%d.\n", errno); - else - fprintf (stderr, "%s.\n", sys_errlist [errno]); - errno = 0; /* After reporting, clear it. */ -} - -/* - * a s _ w a r n ( ) - * - * Send to stderr a string (with bell) (JF: Bell is obnoxious!) as a warning, and locate warning - * in input file(s). - * Please only use this for when we have some recovery action. - * Please explain in string (which may have '\n's) what recovery was done. - */ - -#ifdef NO_VARARGS -/*VARARGS1*/ -as_warn(Format,args) -char *Format; -{ - if ( ! flagseen ['W']) /* -W supresses warning messages. */ - { - as_where(); - _doprnt (Format, &args, stderr); - (void)putc ('\n', stderr); - /* as_where(); */ - } -} -#else -void -as_warn(Format,va_alist) -char *Format; -va_dcl -{ - va_list args; - - if( ! flagseen['W']) - { - as_where(); - va_start(args); - vfprintf(stderr, Format, args); - va_end(args); - (void) putc('\n', stderr); - } -} -#endif -#ifdef DONTDEF -void -as_warn(Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an) -char *format; -{ - if(!flagseen['W']) { - as_where(); - fprintf(stderr,Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an); - (void)putc('\n',stderr); - } -} -#endif -/* - * a s _ b a d ( ) - * - * Send to stderr a string (with bell) (JF: Bell is obnoxious!) as a warning, - * and locate warning in input file(s). - * Please us when there is no recovery, but we want to continue processing - * but not produce an object file. - * Please explain in string (which may have '\n's) what recovery was done. - */ - -#ifdef NO_VARARGS -/*VARARGS1*/ -as_bad(Format,args) -char *Format; -{ - bad_error=1; - as_where(); - _doprnt (Format, &args, stderr); - (void)putc ('\n', stderr); - /* as_where(); */ -} -#else -void -as_bad(Format,va_alist) -char *Format; -va_dcl -{ - va_list args; - - bad_error=1; - as_where(); - va_start(args); - vfprintf(stderr, Format, args); - va_end(args); - (void) putc('\n', stderr); -} -#endif -#ifdef DONTDEF -void -as_bad(Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an) -char *format; -{ - as_where(); - bad_error=1; - fprintf(stderr,Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an); - (void)putc('\n',stderr); -} -#endif -/* - * a s _ f a t a l ( ) - * - * Send to stderr a string (with bell) (JF: Bell is obnoxious!) as a fatal - * message, and locate stdsource in input file(s). - * Please only use this for when we DON'T have some recovery action. - * It exit()s with a warning status. - */ - -#ifdef NO_VARARGS -/*VARARGS1*/ -as_fatal (Format, args) -char *Format; -{ - as_where(); - fprintf(stderr,"FATAL:"); - _doprnt (Format, &args, stderr); - (void)putc ('\n', stderr); - /* as_where(); */ - exit(42); /* What is a good exit status? */ -} -#else -void -as_fatal(Format,va_alist) -char *Format; -va_dcl -{ - va_list args; - - as_where(); - va_start(args); - fprintf (stderr, "FATAL:"); - vfprintf(stderr, Format, args); - (void) putc('\n', stderr); - va_end(args); - exit(42); -} -#endif -#ifdef DONTDEF -void -as_fatal(Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an) -char *Format; -{ - as_where(); - fprintf (stderr, "FATAL:"); - fprintf(stderr, Format,aa,ab,ac,ad,ae,af,ag,ah,ai,aj,ak,al,am,an); - (void) putc('\n', stderr); - exit(42); -} -#endif - -/* end: messages.c */ diff --git a/gnu/gas/objrecdef.h b/gnu/gas/objrecdef.h deleted file mode 100644 index fca8af40f567..000000000000 --- a/gnu/gas/objrecdef.h +++ /dev/null @@ -1,255 +0,0 @@ -/* - * - * $OBJRECDEF - * Generated automatically by "vms_struct Version 1.00" - * Created from VMS definition file "objrecdef.mar" - * Mon Oct 14 14:01:29 1985 - * - */ -struct OBJREC { - unsigned char obj$b_rectyp; - unsigned char obj$b_subtyp; - unsigned char obj$b_mhd_strlv; - unsigned char obj$b_mhd_recsz[2]; - unsigned char obj$t_mhd_name[1]; - }; - -#define OBJ$C_HDR 0 -#define OBJ$C_HDR_MHD 0 -#define OBJ$C_HDR_LNM 1 -#define OBJ$C_HDR_SRC 2 -#define OBJ$C_HDR_TTL 3 -#define OBJ$C_HDR_CPR 4 -#define OBJ$C_HDR_MTC 5 -#define OBJ$C_HDR_GTX 6 -#define OBJ$C_GSD 1 -#define OBJ$C_GSD_PSC 0 -#define OBJ$C_GSD_SYM 1 -#define OBJ$C_GSD_EPM 2 -#define OBJ$C_GSD_PRO 3 -#define OBJ$C_GSD_SYMW 4 -#define OBJ$C_GSD_EPMW 5 -#define OBJ$C_GSD_PROW 6 -#define OBJ$C_GSD_IDC 7 -#define OBJ$C_GSD_ENV 8 -#define OBJ$C_GSD_LSY 9 -#define OBJ$C_GSD_LEPM 10 -#define OBJ$C_GSD_LPRO 11 -#define OBJ$C_GSD_SPSC 12 -#define OBJ$C_TIR 2 -#define OBJ$C_EOM 3 -#define OBJ$C_DBG 4 -#define OBJ$C_TBT 5 -#define OBJ$C_LNK 6 -#define OBJ$C_EOMW 7 -#define OBJ$C_MAXRECTYP 7 -#define OBJ$K_SUBTYP 1 -#define OBJ$C_SUBTYP 1 -#define OBJ$C_MAXRECSIZ 2048 -#define OBJ$C_STRLVL 0 -#define OBJ$C_SYMSIZ 31 -#define OBJ$C_STOREPLIM -1 -#define OBJ$C_PSCALILIM 9 - -#define MHD$C_MHD 0 -#define MHD$C_LNM 1 -#define MHD$C_SRC 2 -#define MHD$C_TTL 3 -#define MHD$C_CPR 4 -#define MHD$C_MTC 5 -#define MHD$C_GTX 6 -#define MHD$C_MAXHDRTYP 6 - -#define GSD$K_ENTRIES 1 -#define GSD$C_ENTRIES 1 -#define GSD$C_PSC 0 -#define GSD$C_SYM 1 -#define GSD$C_EPM 2 -#define GSD$C_PRO 3 -#define GSD$C_SYMW 4 -#define GSD$C_EPMW 5 -#define GSD$C_PROW 6 -#define GSD$C_IDC 7 -#define GSD$C_ENV 8 -#define GSD$C_LSY 9 -#define GSD$C_LEPM 10 -#define GSD$C_LPRO 11 -#define GSD$C_SPSC 12 -#define GSD$C_SYMV 13 -#define GSD$C_EPMV 14 -#define GSD$C_PROV 15 -#define GSD$C_MAXRECTYP 15 - -#define GSY$M_WEAK 1 -#define GSY$M_DEF 2 -#define GSY$M_UNI 4 -#define GSY$M_REL 8 - -#define GPS$M_PIC 1 -#define GPS$M_LIB 2 -#define GPS$M_OVR 4 -#define GPS$M_REL 8 -#define GPS$M_GBL 16 -#define GPS$M_SHR 32 -#define GPS$M_EXE 64 -#define GPS$M_RD 128 -#define GPS$M_WRT 256 -#define GPS$M_VEC 512 -#define GPS$K_NAME 9 -#define GPS$C_NAME 9 - -#define TIR$C_STA_GBL 0 -#define TIR$C_STA_SB 1 -#define TIR$C_STA_SW 2 -#define TIR$C_STA_LW 3 -#define TIR$C_STA_PB 4 -#define TIR$C_STA_PW 5 -#define TIR$C_STA_PL 6 -#define TIR$C_STA_UB 7 -#define TIR$C_STA_UW 8 -#define TIR$C_STA_BFI 9 -#define TIR$C_STA_WFI 10 -#define TIR$C_STA_LFI 11 -#define TIR$C_STA_EPM 12 -#define TIR$C_STA_CKARG 13 -#define TIR$C_STA_WPB 14 -#define TIR$C_STA_WPW 15 -#define TIR$C_STA_WPL 16 -#define TIR$C_STA_LSY 17 -#define TIR$C_STA_LIT 18 -#define TIR$C_STA_LEPM 19 -#define TIR$C_MAXSTACOD 19 -#define TIR$C_MINSTOCOD 20 -#define TIR$C_STO_SB 20 -#define TIR$C_STO_SW 21 -#define TIR$C_STO_L 22 -#define TIR$C_STO_BD 23 -#define TIR$C_STO_WD 24 -#define TIR$C_STO_LD 25 -#define TIR$C_STO_LI 26 -#define TIR$C_STO_PIDR 27 -#define TIR$C_STO_PICR 28 -#define TIR$C_STO_RSB 29 -#define TIR$C_STO_RSW 30 -#define TIR$C_STO_RL 31 -#define TIR$C_STO_VPS 32 -#define TIR$C_STO_USB 33 -#define TIR$C_STO_USW 34 -#define TIR$C_STO_RUB 35 -#define TIR$C_STO_RUW 36 -#define TIR$C_STO_B 37 -#define TIR$C_STO_W 38 -#define TIR$C_STO_RB 39 -#define TIR$C_STO_RW 40 -#define TIR$C_STO_RIVB 41 -#define TIR$C_STO_PIRR 42 -#define TIR$C_MAXSTOCOD 42 -#define TIR$C_MINOPRCOD 50 -#define TIR$C_OPR_NOP 50 -#define TIR$C_OPR_ADD 51 -#define TIR$C_OPR_SUB 52 -#define TIR$C_OPR_MUL 53 -#define TIR$C_OPR_DIV 54 -#define TIR$C_OPR_AND 55 -#define TIR$C_OPR_IOR 56 -#define TIR$C_OPR_EOR 57 -#define TIR$C_OPR_NEG 58 -#define TIR$C_OPR_COM 59 -#define TIR$C_OPR_INSV 60 -#define TIR$C_OPR_ASH 61 -#define TIR$C_OPR_USH 62 -#define TIR$C_OPR_ROT 63 -#define TIR$C_OPR_SEL 64 -#define TIR$C_OPR_REDEF 65 -#define TIR$C_OPR_DFLIT 66 -#define TIR$C_MAXOPRCOD 66 -#define TIR$C_MINCTLCOD 80 -#define TIR$C_CTL_SETRB 80 -#define TIR$C_CTL_AUGRB 81 -#define TIR$C_CTL_DFLOC 82 -#define TIR$C_CTL_STLOC 83 -#define TIR$C_CTL_STKDL 84 -#define TIR$C_MAXCTLCOD 84 - -/* - * Debugger symbol definitions: These are done by hand, as no - * machine-readable version seems - * to be available. - */ -#define DST$C_C 7 /* Language == "C" */ -#define DST$C_VERSION 153 -#define DST$C_SOURCE 155 /* Source file */ -#define DST$C_PROLOG 162 -#define DST$C_BLKBEG 176 /* Beginning of block */ -#define DST$C_BLKEND 177 /* End of block */ -#define DST$C_ENTRY 181 -#define DST$C_PSECT 184 -#define DST$C_LINE_NUM 185 /* Line Number */ -#define DST$C_LBLORLIT 186 -#define DST$C_LABEL 187 -#define DST$C_MODBEG 188 /* Beginning of module */ -#define DST$C_MODEND 189 /* End of module */ -#define DST$C_RTNBEG 190 /* Beginning of routine */ -#define DST$C_RTNEND 191 /* End of routine */ -#define DST$C_DELTA_PC_W 1 /* Incr PC */ -#define DST$C_INCR_LINUM 2 /* Incr Line # */ -#define DST$C_INCR_LINUM_W 3 /* Incr Line # */ -#define DST$C_SET_LINUM_INCR 4 -#define DST$C_SET_LINUM_INCR_W 5 -#define DST$C_RESET_LINUM_INCR 6 -#define DST$C_BEG_STMT_MODE 7 -#define DST$C_END_STMT_MODE 8 -#define DST$C_SET_LINE_NUM 9 /* Set Line # */ -#define DST$C_SET_PC 10 -#define DST$C_SET_PC_W 11 -#define DST$C_SET_PC_L 12 -#define DST$C_SET_STMTNUM 13 -#define DST$C_TERM 14 /* End of lines */ -#define DST$C_TERM_W 15 /* End of lines */ -#define DST$C_SET_ABS_PC 16 /* Set PC */ -#define DST$C_DELTA_PC_L 17 /* Incr PC */ -#define DST$C_INCR_LINUM_L 18 /* Incr Line # */ -#define DST$C_SET_LINUM_B 19 /* Set Line # */ -#define DST$C_SET_LINUM_L 20 /* Set Line # */ -#define DST$C_TERM_L 21 /* End of lines */ -/* these are used with DST$C_SOURCE */ -#define DST$C_SRC_FORMFEED 16 /* ^L counts */ -#define DST$C_SRC_DECLFILE 1 /* Declare file */ -#define DST$C_SRC_SETFILE 2 /* Set file */ -#define DST$C_SRC_SETREC_L 3 /* Set record */ -#define DST$C_SRC_DEFLINES_W 10 /* # of line */ -/* the following are the codes for the various data types. Anything not on - * the list is included under 'advanced_type' - */ -#define DBG$C_UCHAR 0x02 -#define DBG$C_USINT 0x03 -#define DBG$C_ULINT 0x04 -#define DBG$C_SCHAR 0x06 -#define DBG$C_SSINT 0x07 -#define DBG$C_SLINT 0x08 -#define DBG$C_REAL4 0x0a -#define DBG$C_REAL8 0x0b -#define DBG$C_FUNCTION_ADDR 0x17 -#define DBG$C_ADVANCED_TYPE 0xa3 -/* These are the codes that are used to generate the definitions of struct - * union and enum records - */ -#define DBG$C_ENUM_ITEM 0xa4 -#define DBG$C_ENUM_START 0xa5 -#define DBG$C_ENUM_END 0xa6 -#define DBG$C_STRUCT_START 0xab -#define DBG$C_STRUCT_ITEM 0xff -#define DBG$C_STRUCT_END 0xac -/* These are the codes that are used in the suffix records to determine the - * actual data type - */ -#define DBG$C_BASIC 0x01 -#define DBG$C_BASIC_ARRAY 0x02 -#define DBG$C_STRUCT 0x03 -#define DBG$C_POINTER 0x04 -#define DBG$C_VOID 0x05 -#define DBG$C_COMPLEX_ARRAY 0x07 -/* These codes are used in the generation of the symbol definition records - */ -#define DBG$C_FUNCTION_PARAMETER 0xc9 -#define DBG$C_LOCAL_SYM 0xd9 diff --git a/gnu/gas/obstack.c b/gnu/gas/obstack.c deleted file mode 100644 index c9cf561f05f7..000000000000 --- a/gnu/gas/obstack.c +++ /dev/null @@ -1,337 +0,0 @@ -/* obstack.c - subroutines used implicitly by object stack macros - Copyright (C) 1988 Free Software Foundation, Inc. - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 1, or (at your option) any -later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "obstack.h" - -#ifdef __STDC__ -#define POINTER void * -#else -#define POINTER char * -#endif - -/* Determine default alignment. */ -struct fooalign {char x; double d;}; -#define DEFAULT_ALIGNMENT ((char *)&((struct fooalign *) 0)->d - (char *)0) -/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT. - But in fact it might be less smart and round addresses to as much as - DEFAULT_ROUNDING. So we prepare for it to do that. */ -union fooround {long x; double d;}; -#define DEFAULT_ROUNDING (sizeof (union fooround)) - -/* When we copy a long block of data, this is the unit to do it with. - On some machines, copying successive ints does not work; - in such a case, redefine COPYING_UNIT to `long' (if that works) - or `char' as a last resort. */ -#ifndef COPYING_UNIT -#define COPYING_UNIT int -#endif - -/* The non-GNU-C macros copy the obstack into this global variable - to avoid multiple evaluation. */ - -struct obstack *_obstack; - -/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default). - Objects start on multiples of ALIGNMENT (0 means use default). - CHUNKFUN is the function to use to allocate chunks, - and FREEFUN the function to free them. */ - -void -_obstack_begin (h, size, alignment, chunkfun, freefun) - struct obstack *h; - int size; - int alignment; - POINTER (*chunkfun) (); - void (*freefun) (); -{ - register struct _obstack_chunk* chunk; /* points to new chunk */ - - if (alignment == 0) - alignment = DEFAULT_ALIGNMENT; - if (size == 0) - /* Default size is what GNU malloc can fit in a 4096-byte block. */ - { - /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. - Use the values for range checking, because if range checking is off, - the extra bytes won't be missed terribly, but if range checking is on - and we used a larger request, a whole extra 4096 bytes would be - allocated. - - These number are irrelevant to the new GNU malloc. I suspect it is - less sensitive to the size of the request. */ - int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) - + 4 + DEFAULT_ROUNDING - 1) - & ~(DEFAULT_ROUNDING - 1)); - size = 4096 - extra; - } - - h->chunkfun = (struct _obstack_chunk * (*)()) chunkfun; - h->freefun = freefun; - h->chunk_size = size; - h->alignment_mask = alignment - 1; - - chunk = h->chunk = (*h->chunkfun) (h->chunk_size); - h->next_free = h->object_base = chunk->contents; - h->chunk_limit = chunk->limit - = (char *) chunk + h->chunk_size; - chunk->prev = 0; -} - -/* Allocate a new current chunk for the obstack *H - on the assumption that LENGTH bytes need to be added - to the current object, or a new object of length LENGTH allocated. - Copies any partial object from the end of the old chunk - to the beginning of the new one. */ - -void -_obstack_newchunk (h, length) - struct obstack *h; - int length; -{ - register struct _obstack_chunk* old_chunk = h->chunk; - register struct _obstack_chunk* new_chunk; - register long new_size; - register int obj_size = h->next_free - h->object_base; - register int i; - int already; - - /* Compute size for new chunk. */ - new_size = (obj_size + length) + (obj_size >> 3) + 100; - if (new_size < h->chunk_size) - new_size = h->chunk_size; - - /* Allocate and initialize the new chunk. */ - new_chunk = h->chunk = (*h->chunkfun) (new_size); - new_chunk->prev = old_chunk; - new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size; - - /* Move the existing object to the new chunk. - Word at a time is fast and is safe if the object - is sufficiently aligned. */ - if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT) - { - for (i = obj_size / sizeof (COPYING_UNIT) - 1; - i >= 0; i--) - ((COPYING_UNIT *)new_chunk->contents)[i] - = ((COPYING_UNIT *)h->object_base)[i]; - /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT, - but that can cross a page boundary on a machine - which does not do strict alignment for COPYING_UNITS. */ - already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT); - } - else - already = 0; - /* Copy remaining bytes one by one. */ - for (i = already; i < obj_size; i++) - new_chunk->contents[i] = h->object_base[i]; - - /* If the object just copied was the only data in OLD_CHUNK, - free that chunk and remove it from the chain. */ - if (h->object_base == old_chunk->contents) - { - new_chunk->prev = old_chunk->prev; - (*h->freefun) (old_chunk); - } - - h->object_base = new_chunk->contents; - h->next_free = h->object_base + obj_size; -} - -/* Return nonzero if object OBJ has been allocated from obstack H. - This is here for debugging. - If you use it in a program, you are probably losing. */ - -int -_obstack_allocated_p (h, obj) - struct obstack *h; - POINTER obj; -{ - register struct _obstack_chunk* lp; /* below addr of any objects in this chunk */ - register struct _obstack_chunk* plp; /* point to previous chunk if any */ - - lp = (h)->chunk; - while (lp != 0 && ((POINTER)lp > obj || (POINTER)(lp)->limit < obj)) - { - plp = lp -> prev; - lp = plp; - } - return lp != 0; -} - -/* Free objects in obstack H, including OBJ and everything allocate - more recently than OBJ. If OBJ is zero, free everything in H. */ - -void -#ifdef __STDC__ -#undef obstack_free -obstack_free (struct obstack *h, POINTER obj) -#else -_obstack_free (h, obj) - struct obstack *h; - POINTER obj; -#endif -{ - register struct _obstack_chunk* lp; /* below addr of any objects in this chunk */ - register struct _obstack_chunk* plp; /* point to previous chunk if any */ - - lp = (h)->chunk; - /* We use >= because there cannot be an object at the beginning of a chunk. - But there can be an empty object at that address - at the end of another chunk. */ - while (lp != 0 && ((POINTER)lp >= obj || (POINTER)(lp)->limit < obj)) - { - plp = lp -> prev; - (*h->freefun) (lp); - lp = plp; - } - if (lp) - { - (h)->object_base = (h)->next_free = (char *)(obj); - (h)->chunk_limit = lp->limit; - (h)->chunk = lp; - } - else if (obj != 0) - /* obj is not in any of the chunks! */ - abort (); -} - -/* Let same .o link with output of gcc and other compilers. */ - -#ifdef __STDC__ -void -_obstack_free (h, obj) - struct obstack *h; - POINTER obj; -{ - obstack_free (h, obj); -} -#endif - -#if 0 -/* These are now turned off because the applications do not use it - and it uses bcopy via obstack_grow, which causes trouble on sysV. */ - -/* Now define the functional versions of the obstack macros. - Define them to simply use the corresponding macros to do the job. */ - -#ifdef __STDC__ -/* These function definitions do not work with non-ANSI preprocessors; - they won't pass through the macro names in parentheses. */ - -/* The function names appear in parentheses in order to prevent - the macro-definitions of the names from being expanded there. */ - -POINTER (obstack_base) (obstack) - struct obstack *obstack; -{ - return obstack_base (obstack); -} - -POINTER (obstack_next_free) (obstack) - struct obstack *obstack; -{ - return obstack_next_free (obstack); -} - -int (obstack_object_size) (obstack) - struct obstack *obstack; -{ - return obstack_object_size (obstack); -} - -int (obstack_room) (obstack) - struct obstack *obstack; -{ - return obstack_room (obstack); -} - -void (obstack_grow) (obstack, pointer, length) - struct obstack *obstack; - POINTER pointer; - int length; -{ - obstack_grow (obstack, pointer, length); -} - -void (obstack_grow0) (obstack, pointer, length) - struct obstack *obstack; - POINTER pointer; - int length; -{ - obstack_grow0 (obstack, pointer, length); -} - -void (obstack_1grow) (obstack, character) - struct obstack *obstack; - int character; -{ - obstack_1grow (obstack, character); -} - -void (obstack_blank) (obstack, length) - struct obstack *obstack; - int length; -{ - obstack_blank (obstack, length); -} - -void (obstack_1grow_fast) (obstack, character) - struct obstack *obstack; - int character; -{ - obstack_1grow_fast (obstack, character); -} - -void (obstack_blank_fast) (obstack, length) - struct obstack *obstack; - int length; -{ - obstack_blank_fast (obstack, length); -} - -POINTER (obstack_finish) (obstack) - struct obstack *obstack; -{ - return obstack_finish (obstack); -} - -POINTER (obstack_alloc) (obstack, length) - struct obstack *obstack; - int length; -{ - return obstack_alloc (obstack, length); -} - -POINTER (obstack_copy) (obstack, pointer, length) - struct obstack *obstack; - POINTER pointer; - int length; -{ - return obstack_copy (obstack, pointer, length); -} - -POINTER (obstack_copy0) (obstack, pointer, length) - struct obstack *obstack; - POINTER pointer; - int length; -{ - return obstack_copy0 (obstack, pointer, length); -} - -#endif /* __STDC__ */ - -#endif /* 0 */ diff --git a/gnu/gas/obstack.h b/gnu/gas/obstack.h deleted file mode 100644 index fd779c4c9d52..000000000000 --- a/gnu/gas/obstack.h +++ /dev/null @@ -1,418 +0,0 @@ -/* obstack.h - object stack macros - Copyright (C) 1988 Free Software Foundation, Inc. - -This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the -Free Software Foundation; either version 1, or (at your option) any -later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* Summary: - -All the apparent functions defined here are macros. The idea -is that you would use these pre-tested macros to solve a -very specific set of problems, and they would run fast. -Caution: no side-effects in arguments please!! They may be -evaluated MANY times!! - -These macros operate a stack of objects. Each object starts life -small, and may grow to maturity. (Consider building a word syllable -by syllable.) An object can move while it is growing. Once it has -been "finished" it never changes address again. So the "top of the -stack" is typically an immature growing object, while the rest of the -stack is of mature, fixed size and fixed address objects. - -These routines grab large chunks of memory, using a function you -supply, called `obstack_chunk_alloc'. On occasion, they free chunks, -by calling `obstack_chunk_free'. You must define them and declare -them before using any obstack macros. - -Each independent stack is represented by a `struct obstack'. -Each of the obstack macros expects a pointer to such a structure -as the first argument. - -One motivation for this package is the problem of growing char strings -in symbol tables. Unless you are "fascist pig with a read-only mind" -[Gosper's immortal quote from HAKMEM item 154, out of context] you -would not like to put any arbitrary upper limit on the length of your -symbols. - -In practice this often means you will build many short symbols and a -few long symbols. At the time you are reading a symbol you don't know -how long it is. One traditional method is to read a symbol into a -buffer, realloc()ating the buffer every time you try to read a symbol -that is longer than the buffer. This is beaut, but you still will -want to copy the symbol from the buffer to a more permanent -symbol-table entry say about half the time. - -With obstacks, you can work differently. Use one obstack for all symbol -names. As you read a symbol, grow the name in the obstack gradually. -When the name is complete, finalize it. Then, if the symbol exists already, -free the newly read name. - -The way we do this is to take a large chunk, allocating memory from -low addresses. When you want to build a symbol in the chunk you just -add chars above the current "high water mark" in the chunk. When you -have finished adding chars, because you got to the end of the symbol, -you know how long the chars are, and you can create a new object. -Mostly the chars will not burst over the highest address of the chunk, -because you would typically expect a chunk to be (say) 100 times as -long as an average object. - -In case that isn't clear, when we have enough chars to make up -the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed) -so we just point to it where it lies. No moving of chars is -needed and this is the second win: potentially long strings need -never be explicitly shuffled. Once an object is formed, it does not -change its address during its lifetime. - -When the chars burst over a chunk boundary, we allocate a larger -chunk, and then copy the partly formed object from the end of the old -chunk to the beginning of the new larger chunk. We then carry on -accreting characters to the end of the object as we normally would. - -A special macro is provided to add a single char at a time to a -growing object. This allows the use of register variables, which -break the ordinary 'growth' macro. - -Summary: - We allocate large chunks. - We carve out one object at a time from the current chunk. - Once carved, an object never moves. - We are free to append data of any size to the currently - growing object. - Exactly one object is growing in an obstack at any one time. - You can run one obstack per control block. - You may have as many control blocks as you dare. - Because of the way we do it, you can `unwind' a obstack - back to a previous state. (You may remove objects much - as you would with a stack.) -*/ - - -/* Don't do the contents of this file more than once. */ - -#ifndef __OBSTACKS__ -#define __OBSTACKS__ - -/* We use subtraction of (char *)0 instead of casting to int - because on word-addressable machines a simple cast to int - may ignore the byte-within-word field of the pointer. */ - -#ifndef __PTR_TO_INT -#define __PTR_TO_INT(P) ((P) - (char *)0) -#endif - -#ifndef __INT_TO_PTR -#define __INT_TO_PTR(P) ((P) + (char *)0) -#endif - -struct _obstack_chunk /* Lives at front of each chunk. */ -{ - char *limit; /* 1 past end of this chunk */ - struct _obstack_chunk *prev; /* address of prior chunk or NULL */ - char contents[4]; /* objects begin here */ -}; - -struct obstack /* control current object in current chunk */ -{ - long chunk_size; /* preferred size to allocate chunks in */ - struct _obstack_chunk* chunk; /* address of current struct obstack_chunk */ - char *object_base; /* address of object we are building */ - char *next_free; /* where to add next char to current object */ - char *chunk_limit; /* address of char after current chunk */ - int temp; /* Temporary for some macros. */ - int alignment_mask; /* Mask of alignment for each object. */ - struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk. */ - void (*freefun) (); /* User's function to free a chunk. */ -}; - -/* Declare the external functions we use; they are in obstack.c. */ - -#ifdef __STDC__ - extern void _obstack_newchunk (struct obstack *, int); - extern void _obstack_free (struct obstack *, void *); - extern void _obstack_begin (struct obstack *, int, int, - void *(*) (), void (*) ()); -#else - extern void _obstack_newchunk (); - extern void _obstack_free (); - extern void _obstack_begin (); -#endif - -#ifdef __STDC__ - -/* Do the function-declarations after the structs - but before defining the macros. */ - -void obstack_init (struct obstack *obstack); - -void * obstack_alloc (struct obstack *obstack, int size); - -void * obstack_copy (struct obstack *obstack, void *address, int size); -void * obstack_copy0 (struct obstack *obstack, void *address, int size); - -void obstack_free (struct obstack *obstack, void *block); - -void obstack_blank (struct obstack *obstack, int size); - -void obstack_grow (struct obstack *obstack, void *data, int size); -void obstack_grow0 (struct obstack *obstack, void *data, int size); - -void obstack_1grow (struct obstack *obstack, int data_char); -void obstack_ptr_grow (struct obstack *obstack, void *data); -void obstack_int_grow (struct obstack *obstack, int data); - -void * obstack_finish (struct obstack *obstack); - -int obstack_object_size (struct obstack *obstack); - -int obstack_room (struct obstack *obstack); -void obstack_1grow_fast (struct obstack *obstack, int data_char); -void obstack_ptr_grow_fast (struct obstack *obstack, void *data); -void obstack_int_grow_fast (struct obstack *obstack, int data); -void obstack_blank_fast (struct obstack *obstack, int size); - -void * obstack_base (struct obstack *obstack); -void * obstack_next_free (struct obstack *obstack); -int obstack_alignment_mask (struct obstack *obstack); -int obstack_chunk_size (struct obstack *obstack); - -#endif /* __STDC__ */ - -/* Non-ANSI C cannot really support alternative functions for these macros, - so we do not declare them. */ - -/* Pointer to beginning of object being allocated or to be allocated next. - Note that this might not be the final address of the object - because a new chunk might be needed to hold the final size. */ - -#define obstack_base(h) ((h)->object_base) - -/* Size for allocating ordinary chunks. */ - -#define obstack_chunk_size(h) ((h)->chunk_size) - -/* Pointer to next byte not yet allocated in current chunk. */ - -#define obstack_next_free(h) ((h)->next_free) - -/* Mask specifying low bits that should be clear in address of an object. */ - -#define obstack_alignment_mask(h) ((h)->alignment_mask) - -#define obstack_init(h) \ - _obstack_begin ((h), 0, 0, \ - (void *(*) ()) obstack_chunk_alloc, obstack_chunk_free) - -#define obstack_begin(h, size) \ - _obstack_begin ((h), (size), 0, \ - (void *(*) ()) obstack_chunk_alloc, obstack_chunk_free) - -#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = achar) - -#define obstack_blank_fast(h,n) ((h)->next_free += (n)) - -#if defined (__GNUC__) && defined (__STDC__) - -/* For GNU C, if not -traditional, - we can define these macros to compute all args only once - without using a global variable. - Also, we can avoid using the `temp' slot, to make faster code. */ - -#define obstack_object_size(OBSTACK) \ - ({ struct obstack *__o = (OBSTACK); \ - (unsigned) (__o->next_free - __o->object_base); }) - -#define obstack_room(OBSTACK) \ - ({ struct obstack *__o = (OBSTACK); \ - (unsigned) (__o->chunk_limit - __o->next_free); }) - -/* Note that the call to _obstack_newchunk is enclosed in (..., 0) - so that we can avoid having void expressions - in the arms of the conditional expression. - Casting the third operand to void was tried before, - but some compilers won't accept it. */ -#define obstack_grow(OBSTACK,where,length) \ -({ struct obstack *__o = (OBSTACK); \ - int __len = (length); \ - ((__o->next_free + __len > __o->chunk_limit) \ - ? (_obstack_newchunk (__o, __len), 0) : 0); \ - bcopy (where, __o->next_free, __len); \ - __o->next_free += __len; \ - (void) 0; }) - -#define obstack_grow0(OBSTACK,where,length) \ -({ struct obstack *__o = (OBSTACK); \ - int __len = (length); \ - ((__o->next_free + __len + 1 > __o->chunk_limit) \ - ? (_obstack_newchunk (__o, __len + 1), 0) : 0), \ - bcopy (where, __o->next_free, __len), \ - __o->next_free += __len, \ - *(__o->next_free)++ = 0; \ - (void) 0; }) - -#define obstack_1grow(OBSTACK,datum) \ -({ struct obstack *__o = (OBSTACK); \ - ((__o->next_free + 1 > __o->chunk_limit) \ - ? (_obstack_newchunk (__o, 1), 0) : 0), \ - *(__o->next_free)++ = (datum); \ - (void) 0; }) - -/* These assume that the obstack alignment is good enough for pointers or ints, - and that the data added so far to the current object - shares that much alignment. */ - -#define obstack_ptr_grow(OBSTACK,datum) \ -({ struct obstack *__o = (OBSTACK); \ - ((__o->next_free + sizeof (void *) > __o->chunk_limit) \ - ? (_obstack_newchunk (__o, sizeof (void *)), 0) : 0), \ - *((void **)__o->next_free)++ = ((void *)datum); \ - (void) 0; }) - -#define obstack_int_grow(OBSTACK,datum) \ -({ struct obstack *__o = (OBSTACK); \ - ((__o->next_free + sizeof (int) > __o->chunk_limit) \ - ? (_obstack_newchunk (__o, sizeof (int)), 0) : 0), \ - *((int *)__o->next_free)++ = ((int)datum); \ - (void) 0; }) - -#define obstack_ptr_grow_fast(h,aptr) (*((void **)(h)->next_free)++ = (void *)aptr) -#define obstack_int_grow_fast(h,aint) (*((int *)(h)->next_free)++ = (int)aint) - -#define obstack_blank(OBSTACK,length) \ -({ struct obstack *__o = (OBSTACK); \ - int __len = (length); \ - ((__o->chunk_limit - __o->next_free < __len) \ - ? (_obstack_newchunk (__o, __len), 0) : 0); \ - __o->next_free += __len; \ - (void) 0; }) - -#define obstack_alloc(OBSTACK,length) \ -({ struct obstack *__h = (OBSTACK); \ - obstack_blank (__h, (length)); \ - obstack_finish (__h); }) - -#define obstack_copy(OBSTACK,where,length) \ -({ struct obstack *__h = (OBSTACK); \ - obstack_grow (__h, (where), (length)); \ - obstack_finish (__h); }) - -#define obstack_copy0(OBSTACK,where,length) \ -({ struct obstack *__h = (OBSTACK); \ - obstack_grow0 (__h, (where), (length)); \ - obstack_finish (__h); }) - -#define obstack_finish(OBSTACK) \ -({ struct obstack *__o = (OBSTACK); \ - void *value = (void *) __o->object_base; \ - __o->next_free \ - = __INT_TO_PTR ((__PTR_TO_INT (__o->next_free)+__o->alignment_mask)\ - & ~ (__o->alignment_mask)); \ - ((__o->next_free - (char *)__o->chunk \ - > __o->chunk_limit - (char *)__o->chunk) \ - ? (__o->next_free = __o->chunk_limit) : 0); \ - __o->object_base = __o->next_free; \ - value; }) - -#define obstack_free(OBSTACK, OBJ) \ -({ struct obstack *__o = (OBSTACK); \ - void *__obj = (OBJ); \ - if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \ - __o->next_free = __o->object_base = __obj; \ - else (obstack_free) (__o, __obj); }) - -#else /* not __GNUC__ or not __STDC__ */ - -#define obstack_object_size(h) \ - (unsigned) ((h)->next_free - (h)->object_base) - -#define obstack_room(h) \ - (unsigned) ((h)->chunk_limit - (h)->next_free) - -#define obstack_grow(h,where,length) \ -( (h)->temp = (length), \ - (((h)->next_free + (h)->temp > (h)->chunk_limit) \ - ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ - bcopy (where, (h)->next_free, (h)->temp), \ - (h)->next_free += (h)->temp) - -#define obstack_grow0(h,where,length) \ -( (h)->temp = (length), \ - (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \ - ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \ - bcopy (where, (h)->next_free, (h)->temp), \ - (h)->next_free += (h)->temp, \ - *((h)->next_free)++ = 0) - -#define obstack_1grow(h,datum) \ -( (((h)->next_free + 1 > (h)->chunk_limit) \ - ? (_obstack_newchunk ((h), 1), 0) : 0), \ - *((h)->next_free)++ = (datum)) - -#define obstack_ptr_grow(h,datum) \ -( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \ - ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ - *((char **)(((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *)datum)) - -#define obstack_int_grow(h,datum) \ -( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ - ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ - *((int *)(((h)->next_free+=sizeof(int))-sizeof(int))) = ((int)datum)) - -#define obstack_ptr_grow_fast(h,aptr) (*((char **)(h)->next_free)++ = (char *)aptr) -#define obstack_int_grow_fast(h,aint) (*((int *)(h)->next_free)++ = (int)aint) - -#define obstack_blank(h,length) \ -( (h)->temp = (length), \ - (((h)->chunk_limit - (h)->next_free < (h)->temp) \ - ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ - (h)->next_free += (h)->temp) - -#define obstack_alloc(h,length) \ - (obstack_blank ((h), (length)), obstack_finish ((h))) - -#define obstack_copy(h,where,length) \ - (obstack_grow ((h), (where), (length)), obstack_finish ((h))) - -#define obstack_copy0(h,where,length) \ - (obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) - -#define obstack_finish(h) \ -( (h)->temp = __PTR_TO_INT ((h)->object_base), \ - (h)->next_free \ - = __INT_TO_PTR ((__PTR_TO_INT ((h)->next_free)+(h)->alignment_mask) \ - & ~ ((h)->alignment_mask)), \ - (((h)->next_free - (char *)(h)->chunk \ - > (h)->chunk_limit - (char *)(h)->chunk) \ - ? ((h)->next_free = (h)->chunk_limit) : 0), \ - (h)->object_base = (h)->next_free, \ - __INT_TO_PTR ((h)->temp)) - -#ifdef __STDC__ -#define obstack_free(h,obj) \ -( (h)->temp = (char *)(obj) - (char *) (h)->chunk, \ - (((h)->temp >= 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ - ? (int) ((h)->next_free = (h)->object_base \ - = (h)->temp + (char *) (h)->chunk) \ - : (((obstack_free) ((h), (h)->temp + (char *) (h)->chunk), 0), 0))) -#else -#define obstack_free(h,obj) \ -( (h)->temp = (char *)(obj) - (char *) (h)->chunk, \ - (((h)->temp >= 0 && (h)->temp < (h)->chunk_limit - (char *) (h)->chunk)\ - ? (int) ((h)->next_free = (h)->object_base \ - = (h)->temp + (char *) (h)->chunk) \ - : (_obstack_free ((h), (h)->temp + (char *) (h)->chunk), 0))) -#endif - -#endif /* not __GNUC__ or not __STDC__ */ - -#endif /* not __OBSTACKS__ */ diff --git a/gnu/gas/output-file.c b/gnu/gas/output-file.c deleted file mode 100644 index ff71f40f9a13..000000000000 --- a/gnu/gas/output-file.c +++ /dev/null @@ -1,81 +0,0 @@ -/* output-file.c - Deal with the output file - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - * Confines all details of emitting object bytes to this module. - * All O/S specific crocks should live here. - * What we lose in "efficiency" we gain in modularity. - * Note we don't need to #include the "as.h" file. No common coupling! - */ - -/* #include "style.h" */ -#include <stdio.h> - -void as_perror(); - -static FILE * -stdoutput; - -void -output_file_create (name) - char * name; -{ - if(name[0]=='-' && name[1]=='\0') - stdoutput=stdout; - else if ( ! (stdoutput = fopen( name, "w" )) ) - { - as_perror ("FATAL: Can't create %s", name); - exit(42); - } -} - - - -void -output_file_close (filename) - char * filename; -{ - if ( EOF == fclose( stdoutput ) ) - { - as_perror ("FATAL: Can't close %s", filename); - exit(42); - } - stdoutput = NULL; /* Trust nobody! */ -} - -void -output_file_append (where, length, filename) - char * where; - long int length; - char * filename; -{ - - for (; length; length--,where++) - { - (void)putc(*where,stdoutput); - if(ferror(stdoutput)) - /* if ( EOF == (putc( *where, stdoutput )) ) */ - { - as_perror("Failed to emit an object byte", filename); - as_fatal("Can't continue"); - } - } -} - -/* end: output-file.c */ diff --git a/gnu/gas/read.c b/gnu/gas/read.c deleted file mode 100644 index 835710770954..000000000000 --- a/gnu/gas/read.c +++ /dev/null @@ -1,2188 +0,0 @@ -/*- - * This code is derived from software copyrighted by the Free Software - * Foundation. - * - * Modified 1991 by Donn Seeley at UUNET Technologies, Inc. - */ - -#ifndef lint -static char sccsid[] = "@(#)read.c 6.4 (Berkeley) 5/8/91"; -#endif /* not lint */ - -/* read.c - read a source file - - Copyright (C) 1986,1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#define MASK_CHAR (0xFF) /* If your chars aren't 8 bits, you will - change this a bit. But then, GNU isn't - spozed to run on your machine anyway. - (RMS is so shortsighted sometimes.) - */ - -#define MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT (16) - /* This is the largest known floating point */ - /* format (for now). It will grow when we */ - /* do 4361 style flonums. */ - - -/* Routines that read assembler source text to build spagetti in memory. */ -/* Another group of these functions is in the as-expr.c module */ - -#include <ctype.h> -#include <sys/types.h> -#include <sys/stat.h> -#include "as.h" -#include "read.h" -#include "md.h" -#include "hash.h" -#include "obstack.h" -#include "frags.h" -#include "flonum.h" -#include "struc-symbol.h" -#include "expr.h" -#include "symbols.h" - -#ifdef SPARC -#include "sparc.h" -#define OTHER_ALIGN -#endif -#ifdef I860 -#include "i860.h" -#endif - -char * input_line_pointer; /* -> next char of source file to parse. */ - - -#if BITS_PER_CHAR != 8 -The following table is indexed by [ (char) ] and will break if -a char does not have exactly 256 states (hopefully 0:255!) ! -#endif - -const char /* used by is_... macros. our ctype[] */ -lex_type [256] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* @ABCDEFGHIJKLMNO */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* PQRSTUVWXYZ[\]^_ */ - 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, /* _!"#$%&'()*+,-./ */ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 0123456789:;<=>? */ - 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* @ABCDEFGHIJKLMNO */ - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 3, /* PQRSTUVWXYZ[\]^_ */ - 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* `abcdefghijklmno */ - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, /* pqrstuvwxyz{|}~. */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - - -/* - * In: a character. - * Out: TRUE if this character ends a line. - */ -#define _ (0) -const char is_end_of_line [256] = { - _, _, _, _, _, _, _, _, _, _,99, _, _, _, _, _, /* @abcdefghijklmno */ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */ - _, _, _, _, _, _, _, _, _, _, _,99, _, _, _, _, /* 0123456789:;<=>? */ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, /* */ - _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _ /* */ -}; -#undef _ - - /* Functions private to this file. */ -void equals(); -void big_cons(); -void cons(); -static char* demand_copy_C_string(); -static char* demand_copy_string(); -void demand_empty_rest_of_line(); -void float_cons(); -long int get_absolute_expression(); -static char get_absolute_expression_and_terminator(); -static segT get_known_segmented_expression(); -void ignore_rest_of_line(); -static int is_it_end_of_statement(); -static void pobegin(); -static void pseudo_set(); -static void stab(); -static void stringer(); - -extern char line_comment_chars[]; - -static char * buffer_limit; /* -> 1 + last char in buffer. */ - -static char * bignum_low; /* Lowest char of bignum. */ -static char * bignum_limit; /* 1st illegal address of bignum. */ -static char * bignum_high; /* Highest char of bignum. */ - /* May point to (bignum_start-1). */ - /* Never >= bignum_limit. */ -static char *old_buffer = 0; /* JF a hack */ -static char *old_input; -static char *old_limit; - -#ifndef WORKING_DOT_WORD -struct broken_word *broken_words; -int new_broken_words = 0; -#endif - -static void grow_bignum (); -static int next_char_of_string (); - -void -read_begin() -{ - pobegin(); - obstack_begin( ¬es, 5000 ); -#define BIGNUM_BEGIN_SIZE (16) - bignum_low = xmalloc((long)BIGNUM_BEGIN_SIZE); - bignum_limit = bignum_low + BIGNUM_BEGIN_SIZE; -} - -/* set up pseudo-op tables */ - -static struct hash_control * -po_hash = NULL; /* use before set up: NULL-> address error */ - - -void s_abort(), s_align(), s_comm(), s_data(); -void s_desc(), s_even(), s_file(), s_fill(); -void s_globl(), s_lcomm(), s_line(), s_lsym(); -void s_org(), s_set(), s_space(), s_text(); -#ifdef VMS -char const_flag = 0; -void s_const(); -#endif - -#ifdef DONTDEF -void s_gdbline(), s_gdblinetab(); -void s_gdbbeg(), s_gdbblock(), s_gdbend(), s_gdbsym(); -#endif - -void stringer(); -void cons(); -void float_cons(); -void big_cons(); -void stab(); - -static const pseudo_typeS -potable[] = -{ - { "abort", s_abort, 0 }, - { "align", s_align, 0 }, - { "ascii", stringer, 0 }, - { "asciz", stringer, 1 }, - { "byte", cons, 1 }, - { "comm", s_comm, 0 }, -#ifdef VMS - { "const", s_const, 0 }, -#endif - { "data", s_data, 0 }, - { "desc", s_desc, 0 }, - { "double", float_cons, 'd' }, - { "file", s_file, 0 }, - { "fill", s_fill, 0 }, - { "float", float_cons, 'f' }, -#ifdef DONTDEF - { "gdbbeg", s_gdbbeg, 0 }, - { "gdbblock", s_gdbblock, 0 }, - { "gdbend", s_gdbend, 0 }, - { "gdbsym", s_gdbsym, 0 }, - { "gdbline", s_gdbline, 0 }, - { "gdblinetab",s_gdblinetab, 0 }, -#endif - { "globl", s_globl, 0 }, - { "int", cons, 4 }, - { "lcomm", s_lcomm, 0 }, - { "line", s_line, 0 }, - { "long", cons, 4 }, - { "lsym", s_lsym, 0 }, - { "octa", big_cons, 16 }, - { "org", s_org, 0 }, - { "quad", big_cons, 8 }, - { "set", s_set, 0 }, - { "short", cons, 2 }, - { "single", float_cons, 'f' }, - { "space", s_space, 0 }, - { "stabd", stab, 'd' }, - { "stabn", stab, 'n' }, - { "stabs", stab, 's' }, - { "text", s_text, 0 }, -#ifndef SPARC - { "word", cons, 2 }, -#endif - { NULL} /* end sentinel */ -}; - -static void -pobegin() -{ - char * errtxt; /* error text */ - const pseudo_typeS * pop; - - po_hash = hash_new(); - errtxt = ""; /* OK so far */ - for (pop=potable; pop->poc_name && !*errtxt; pop++) - { - errtxt = hash_insert (po_hash, pop->poc_name, (char *)pop); - } - - for(pop=md_pseudo_table; pop->poc_name && !*errtxt; pop++) - errtxt = hash_insert (po_hash, pop->poc_name, (char *)pop); - - if (*errtxt) - { - as_fatal ("error constructing pseudo-op table"); - } -} /* pobegin() */ - -/* read_a_source_file() - * - * File has already been opened, and will be closed by our caller. - * - * We read the file, putting things into a web that - * represents what we have been reading. - */ -void -read_a_source_file (buffer) - char * buffer; /* 1st character of each buffer of lines is here. */ -{ - register char c; - register char * s; /* string of symbol, '\0' appended */ - register int temp; - /* register struct frag * fragP; JF unused */ /* a frag we just made */ - pseudo_typeS *pop; -#ifdef DONTDEF - void gdb_block_beg(); - void gdb_block_position(); - void gdb_block_end(); - void gdb_symbols_fixup(); -#endif - - subseg_new (SEG_TEXT, 0); - while ( buffer_limit = input_scrub_next_buffer (&buffer) ) - { /* We have another line to parse. */ - know( buffer_limit [-1] == '\n' ); /* Must have a sentinel. */ - input_line_pointer = buffer; - contin: /* JF this goto is my fault I admit it. Someone brave please re-write - the whole input section here? Pleeze??? */ - while ( input_line_pointer < buffer_limit ) - { /* We have more of this buffer to parse. */ - /* - * We now have input_line_pointer -> 1st char of next line. - * If input_line_pointer [-1] == '\n' then we just - * scanned another line: so bump line counters. - */ - if (input_line_pointer [-1] == '\n') - { - bump_line_counters (); - } - /* - * We are at the begining of a line, or similar place. - * We expect a well-formed assembler statement. - * A "symbol-name:" is a statement. - * - * Depending on what compiler is used, the order of these tests - * may vary to catch most common case 1st. - * Each test is independent of all other tests at the (top) level. - * PLEASE make a compiler that doesn't use this assembler. - * It is crufty to waste a compiler's time encoding things for this - * assembler, which then wastes more time decoding it. - * (And communicating via (linear) files is silly! - * If you must pass stuff, please pass a tree!) - */ - if ( (c= * input_line_pointer ++) == '\t' || c == ' ' || c=='\f') - { - c = * input_line_pointer ++; - } - know( c != ' ' ); /* No further leading whitespace. */ - /* - * C is the 1st significant character. - * Input_line_pointer points after that character. - */ - if ( is_name_beginner(c) ) - { /* want user-defined label or pseudo/opcode */ - s = -- input_line_pointer; - c = get_symbol_end(); /* name's delimiter */ - /* - * C is character after symbol. - * That character's place in the input line is now '\0'. - * S points to the beginning of the symbol. - * [In case of pseudo-op, s -> '.'.] - * Input_line_pointer -> '\0' where c was. - */ - if ( c == ':' ) - { - if (flagseen['g']) - /* set line number for function definition */ - funcstab(s); - colon(s); /* user-defined label */ - * input_line_pointer ++ = ':'; /* Put ':' back for error messages' sake. */ - /* Input_line_pointer -> after ':'. */ - SKIP_WHITESPACE(); - } - else if(c=='=' || input_line_pointer[1]=='=') /* JF deal with FOO=BAR */ - { - equals(s); - demand_empty_rest_of_line(); - } - else - { /* expect pseudo-op or machine instruction */ - if ( *s=='.' ) - { - /* - * PSEUDO - OP. - * - * WARNING: c has next char, which may be end-of-line. - * We lookup the pseudo-op table with s+1 because we - * already know that the pseudo-op begins with a '.'. - */ - - pop= (pseudo_typeS *) hash_find (po_hash, s+1); - - /* Print the error msg now, while we still can */ - if(!pop) - as_bad("Unknown pseudo-op: '%s'",s); - - /* Put it back for error messages etc. */ - * input_line_pointer = c; - /* The following skip of whitespace is compulsory. */ - /* A well shaped space is sometimes all that seperates keyword from operands. */ - if ( c == ' ' || c == '\t' ) - { /* Skip seperator after keyword. */ - input_line_pointer ++; - } - /* - * Input_line is restored. - * Input_line_pointer -> 1st non-blank char - * after pseudo-operation. - */ - if(!pop) { - ignore_rest_of_line(); - break; - } - else - (*pop->poc_handler)(pop->poc_val); - } - else - { /* machine instruction */ - /* If source file debugging, emit a stab. */ - if (flagseen['g']) - linestab(); - - /* WARNING: c has char, which may be end-of-line. */ - /* Also: input_line_pointer -> `\0` where c was. */ - * input_line_pointer = c; - while ( ! is_end_of_line [* input_line_pointer] ) - { - input_line_pointer ++; - } - c = * input_line_pointer; - * input_line_pointer = '\0'; - md_assemble (s); /* Assemble 1 instruction. */ - * input_line_pointer ++ = c; - /* We resume loop AFTER the end-of-line from this instruction */ - } /* if (*s=='.') */ - } /* if c==':' */ - continue; - } /* if (is_name_beginner(c) */ - - - if ( is_end_of_line [c] ) - { /* empty statement */ - continue; - } - - if ( isdigit(c) ) - { /* local label ("4:") */ - temp = c - '0'; -#ifdef SUN_ASM_SYNTAX - if( *input_line_pointer=='$') - input_line_pointer++; -#endif - if ( * input_line_pointer ++ == ':' ) - { - local_colon (temp); - } - else - { - as_bad( "Spurious digit %d.", temp); - input_line_pointer -- ; - ignore_rest_of_line(); - } - continue; - } - if(c && index(line_comment_chars,c)) { /* Its a comment. Better say APP or NO_APP */ - char *ends; - char *strstr(); - char *new_buf; - char *new_tmp; - int new_length; - char *tmp_buf = 0; - extern char *scrub_string,*scrub_last_string; - int scrub_from_string(); - void scrub_to_string(); - - bump_line_counters(); - s=input_line_pointer; - if(strncmp(s,"APP\n",4)) - continue; /* We ignore it */ - s+=4; - - ends=strstr(s,"#NO_APP\n"); - - if(!ends) { - int tmp_len; - int num; - - /* The end of the #APP wasn't in this buffer. We - keep reading in buffers until we find the #NO_APP - that goes with this #APP There is one. The specs - guarentee it. . .*/ - tmp_len=buffer_limit-s; - tmp_buf=xmalloc(tmp_len); - bcopy(s,tmp_buf,tmp_len); - do { - new_tmp = input_scrub_next_buffer(&buffer); - if(!new_tmp) - break; - else - buffer_limit = new_tmp; - input_line_pointer = buffer; - ends = strstr(buffer,"#NO_APP\n"); - if(ends) - num=ends-buffer; - else - num=buffer_limit-buffer; - - tmp_buf=xrealloc(tmp_buf,tmp_len+num); - bcopy(buffer,tmp_buf+tmp_len,num); - tmp_len+=num; - } while(!ends); - - input_line_pointer= ends ? ends+8 : NULL; - - s=tmp_buf; - ends=s+tmp_len; - - } else { - input_line_pointer=ends+8; - } - new_buf=xmalloc(100); - new_length=100; - new_tmp=new_buf; - - scrub_string=s; - scrub_last_string = ends; - for(;;) { - int ch; - - ch=do_scrub_next_char(scrub_from_string,scrub_to_string); - if(ch==EOF) break; - *new_tmp++=ch; - if(new_tmp==new_buf+new_length) { - new_buf=xrealloc(new_buf,new_length+100); - new_tmp=new_buf+new_length; - new_length+=100; - } - } - - if(tmp_buf) - free(tmp_buf); - old_buffer=buffer; - old_input=input_line_pointer; - old_limit=buffer_limit; - buffer=new_buf; - input_line_pointer=new_buf; - buffer_limit=new_tmp; - continue; - } - - as_bad("Junk character %d.",c); - ignore_rest_of_line(); - } /* while (input_line_pointer<buffer_limit )*/ - if(old_buffer) { - bump_line_counters(); - if(old_input == 0) - return; - buffer=old_buffer; - input_line_pointer=old_input; - buffer_limit=old_limit; - old_buffer = 0; - goto contin; - } - } /* while (more bufrers to scan) */ -} /* read_a_source_file() */ - -void -s_abort() -{ - as_fatal(".abort detected. Abandoning ship."); -} - -#ifdef OTHER_ALIGN -static void -s_align() -{ - register unsigned int temp; - register long int temp_fill; - unsigned int i; - - temp = get_absolute_expression (); -#define MAX_ALIGNMENT (1 << 15) - if ( temp > MAX_ALIGNMENT ) { - as_bad("Alignment too large: %d. assumed.", temp = MAX_ALIGNMENT); - } - - /* - * For the sparc, `.align (1<<n)' actually means `.align n' - * so we have to convert it. - */ - if (temp != 0) { - for (i = 0; (temp & 1) == 0; temp >>= 1, ++i) - ; - } - if (temp != 1) - as_bad("Alignment not a power of 2"); - - temp = i; - if (*input_line_pointer == ',') { - input_line_pointer ++; - temp_fill = get_absolute_expression (); - } else { - temp_fill = 0; - } - /* Only make a frag if we HAVE to. . . */ - if (temp && ! need_pass_2) - frag_align (temp, (int)temp_fill); - - demand_empty_rest_of_line(); -} -#else - -void -s_align() -{ - register int temp; - register long int temp_fill; - - temp = get_absolute_expression (); -#define MAX_ALIGNMENT (15) - if ( temp > MAX_ALIGNMENT ) - as_bad("Alignment too large: %d. assumed.", temp = MAX_ALIGNMENT); - else if ( temp < 0 ) { - as_bad("Alignment negative. 0 assumed."); - temp = 0; - } - if ( *input_line_pointer == ',' ) { - input_line_pointer ++; - temp_fill = get_absolute_expression (); - } else - temp_fill = 0; - /* Only make a frag if we HAVE to. . . */ - if ( temp && ! need_pass_2 ) - frag_align (temp, (int)temp_fill); - demand_empty_rest_of_line(); -} -#endif - -void -s_comm() -{ - register char *name; - register char c; - register char *p; - register int temp; - register symbolS * symbolP; - - name = input_line_pointer; - c = get_symbol_end(); - /* just after name is now '\0' */ - p = input_line_pointer; - *p = c; - SKIP_WHITESPACE(); - if ( * input_line_pointer != ',' ) { - as_bad("Expected comma after symbol-name"); - ignore_rest_of_line(); - return; - } - input_line_pointer ++; /* skip ',' */ - if ( (temp = get_absolute_expression ()) < 0 ) { - as_warn(".COMMon length (%d.) <0! Ignored.", temp); - ignore_rest_of_line(); - return; - } - *p = 0; - symbolP = symbol_find_or_make (name); - *p = c; - if ( (symbolP -> sy_type & N_TYPE) != N_UNDF || - symbolP -> sy_other != 0 || symbolP -> sy_desc != 0) { - as_warn( "Ignoring attempt to re-define symbol"); - ignore_rest_of_line(); - return; - } - if (symbolP -> sy_value) { - if (symbolP -> sy_value != temp) - as_warn( "Length of .comm \"%s\" is already %d. Not changed to %d.", - symbolP -> sy_name, symbolP -> sy_value, temp); - } else { - symbolP -> sy_value = temp; - symbolP -> sy_type |= N_EXT; - } -#ifdef VMS - if(!temp) - symbolP->sy_other = const_flag; -#endif - know( symbolP -> sy_frag == &zero_address_frag ); - demand_empty_rest_of_line(); -} - -#ifdef VMS -void -s_const() -{ - register int temp; - - temp = get_absolute_expression (); - subseg_new (SEG_DATA, (subsegT)temp); - const_flag = 1; - demand_empty_rest_of_line(); -} -#endif - -void -s_data() -{ - register int temp; - - temp = get_absolute_expression (); - subseg_new (SEG_DATA, (subsegT)temp); -#ifdef VMS - const_flag = 0; -#endif - demand_empty_rest_of_line(); -} - -void -s_desc() -{ - register char *name; - register char c; - register char *p; - register symbolS * symbolP; - register int temp; - - /* - * Frob invented at RMS' request. Set the n_desc of a symbol. - */ - name = input_line_pointer; - c = get_symbol_end(); - p = input_line_pointer; - symbolP = symbol_table_lookup (name); - * p = c; - SKIP_WHITESPACE(); - if ( * input_line_pointer != ',' ) { - *p = 0; - as_bad("Expected comma after name \"%s\"", name); - *p = c; - ignore_rest_of_line(); - } else { - input_line_pointer ++; - temp = get_absolute_expression (); - *p = 0; - symbolP = symbol_find_or_make (name); - *p = c; - symbolP -> sy_desc = temp; - } - demand_empty_rest_of_line(); -} - -void -s_file() -{ - register char *s; - int length; - - /* Some assemblers tolerate immediately following '"' */ - if ( s = demand_copy_string( & length ) ) { - new_logical_line (s, -1); - demand_empty_rest_of_line(); - } -} - -void -s_fill() -{ - long int temp_repeat; - long int temp_size; - register long int temp_fill; - char *p; - - if ( get_absolute_expression_and_terminator(& temp_repeat) != ',' ) { - input_line_pointer --; /* Backup over what was not a ','. */ - as_warn("Expect comma after rep-size in .fill"); - ignore_rest_of_line(); - return; - } - if ( get_absolute_expression_and_terminator( & temp_size) != ',' ) { - input_line_pointer --; /* Backup over what was not a ','. */ - as_warn("Expected comma after size in .fill"); - ignore_rest_of_line(); - return; - } - /* - * This is to be compatible with BSD 4.2 AS, not for any rational reason. - */ -#define BSD_FILL_SIZE_CROCK_8 (8) - if ( temp_size > BSD_FILL_SIZE_CROCK_8 ) { - as_bad(".fill size clamped to %d.", BSD_FILL_SIZE_CROCK_8); - temp_size = BSD_FILL_SIZE_CROCK_8 ; - } if ( temp_size < 0 ) { - as_warn("Size negative: .fill ignored."); - temp_size = 0; - } else if ( temp_repeat <= 0 ) { - as_warn("Repeat < 0, .fill ignored"); - temp_size = 0; - } - temp_fill = get_absolute_expression (); - if ( temp_size && !need_pass_2 ) { - p = frag_var (rs_fill, (int)temp_size, (int)temp_size, (relax_substateT)0, (symbolS *)0, temp_repeat, (char *)0); - bzero (p, (int)temp_size); -/* - * The magic number BSD_FILL_SIZE_CROCK_4 is from BSD 4.2 VAX flavoured AS. - * The following bizzare behaviour is to be compatible with above. - * I guess they tried to take up to 8 bytes from a 4-byte expression - * and they forgot to sign extend. Un*x Sux. - */ -#define BSD_FILL_SIZE_CROCK_4 (4) - md_number_to_chars (p, temp_fill, temp_size > BSD_FILL_SIZE_CROCK_4 ? BSD_FILL_SIZE_CROCK_4 : (int)temp_size); -/* - * Note: .fill (),0 emits no frag (since we are asked to .fill 0 bytes) - * but emits no error message because it seems a legal thing to do. - * It is a degenerate case of .fill but could be emitted by a compiler. - */ - } - demand_empty_rest_of_line(); -} - -#ifdef DONTDEF -void -s_gdbbeg() -{ - register int temp; - - temp = get_absolute_expression (); - if (temp < 0) - as_warn( "Block number <0. Ignored." ); - else if (flagseen ['G']) - gdb_block_beg ( (long int) temp, frag_now, (long int)(obstack_next_free(& frags) - frag_now -> fr_literal)); - demand_empty_rest_of_line (); -} - -void -s_gdbblock() -{ - register int position; - int temp; - - if (get_absolute_expression_and_terminator (&temp) != ',') { - as_warn( "expected comma before position in .gdbblock"); - --input_line_pointer; - ignore_rest_of_line (); - return; - } - position = get_absolute_expression (); - if (flagseen ['G']) - gdb_block_position ((long int) temp, (long int) position); - demand_empty_rest_of_line (); -} - -void -s_gdbend() -{ - register int temp; - - temp = get_absolute_expression (); - if (temp < 0) - as_warn( "Block number <0. Ignored." ); - else if (flagseen ['G']) - gdb_block_end ( (long int) temp, frag_now, (long int)(obstack_next_free(& frags) - frag_now -> fr_literal)); - demand_empty_rest_of_line (); -} - -void -s_gdbsym() -{ - register char *name, - *p; - register char c; - register symbolS * symbolP; - register int temp; - - name = input_line_pointer; - c = get_symbol_end(); - p = input_line_pointer; - symbolP = symbol_find_or_make (name); - *p = c; - SKIP_WHITESPACE(); - if ( * input_line_pointer != ',' ) { - as_warn("Expected comma after name"); - ignore_rest_of_line(); - return; - } - input_line_pointer ++; - if ( (temp = get_absolute_expression ()) < 0 ) { - as_warn("Bad GDB symbol file offset (%d.) <0! Ignored.", temp); - ignore_rest_of_line(); - return; - } - if (flagseen ['G']) - gdb_symbols_fixup (symbolP, (long int)temp); - demand_empty_rest_of_line (); -} - -void -s_gdbline() -{ - int file_number, - lineno; - - if(get_absolute_expression_and_terminator(&file_number) != ',') { - as_warn("expected comman after filenum in .gdbline"); - ignore_rest_of_line(); - return; - } - lineno=get_absolute_expression(); - if(flagseen['G']) - gdb_line(file_number,lineno); - demand_empty_rest_of_line(); -} - - -void -s_gdblinetab() -{ - int file_number, - offset; - - if(get_absolute_expression_and_terminator(&file_number) != ',') { - as_warn("expected comman after filenum in .gdblinetab"); - ignore_rest_of_line(); - return; - } - offset=get_absolute_expression(); - if(flagseen['G']) - gdb_line_tab(file_number,offset); - demand_empty_rest_of_line(); -} -#endif - -void -s_globl() -{ - register char *name; - register int c; - register symbolS * symbolP; - - do { - name = input_line_pointer; - c = get_symbol_end(); - symbolP = symbol_find_or_make (name); - * input_line_pointer = c; - SKIP_WHITESPACE(); - symbolP -> sy_type |= N_EXT; - if(c==',') { - input_line_pointer++; - SKIP_WHITESPACE(); - if(*input_line_pointer=='\n') - c='\n'; - } - } while(c==','); - demand_empty_rest_of_line(); -} - -void -s_lcomm() -{ - register char *name; - register char c; - register char *p; - register int temp; - register symbolS * symbolP; - - name = input_line_pointer; - c = get_symbol_end(); - p = input_line_pointer; - *p = c; - SKIP_WHITESPACE(); - if ( * input_line_pointer != ',' ) { - as_warn("Expected comma after name"); - ignore_rest_of_line(); - return; - } - input_line_pointer ++; - if ( (temp = get_absolute_expression ()) < 0 ) { - as_warn("BSS length (%d.) <0! Ignored.", temp); - ignore_rest_of_line(); - return; - } - *p = 0; - symbolP = symbol_find_or_make (name); - *p = c; - if ( symbolP -> sy_other == 0 - && symbolP -> sy_desc == 0 - && ( ( symbolP -> sy_type == N_BSS - && symbolP -> sy_value == local_bss_counter) - || ( (symbolP -> sy_type & N_TYPE) == N_UNDF - && symbolP -> sy_value == 0))) { - symbolP -> sy_value = local_bss_counter; - symbolP -> sy_type = N_BSS; - symbolP -> sy_frag = & bss_address_frag; - local_bss_counter += temp; - } else - as_warn( "Ignoring attempt to re-define symbol from %d. to %d.", - symbolP -> sy_value, local_bss_counter ); - demand_empty_rest_of_line(); -} - -void -s_line() -{ - /* Assume delimiter is part of expression. */ - /* BSD4.2 as fails with delightful bug, so we */ - /* are not being incompatible here. */ - new_logical_line ((char *)NULL, (int)(get_absolute_expression ())); - demand_empty_rest_of_line(); -} - -void -s_long() -{ - cons(4); -} - -void -s_int() -{ - cons(4); -} - -void -s_lsym() -{ - register char *name; - register char c; - register char *p; - register segT segment; - expressionS exp; - register symbolS *symbolP; - - /* we permit ANY expression: BSD4.2 demands constants */ - name = input_line_pointer; - c = get_symbol_end(); - p = input_line_pointer; - *p = c; - SKIP_WHITESPACE(); - if ( * input_line_pointer != ',' ) { - *p = 0; - as_warn("Expected comma after name \"%s\"", name); - *p = c; - ignore_rest_of_line(); - return; - } - input_line_pointer ++; - segment = expression (& exp); - if ( segment != SEG_ABSOLUTE && segment != SEG_DATA && - segment != SEG_TEXT && segment != SEG_BSS) { - as_bad("Bad expression: %s", seg_name [(int)segment]); - ignore_rest_of_line(); - return; - } - know( segment == SEG_ABSOLUTE || segment == SEG_DATA || segment == SEG_TEXT || segment == SEG_BSS ); - *p = 0; - symbolP = symbol_new (name,(unsigned char)(seg_N_TYPE [(int) segment]), - 0, 0, (valueT)(exp . X_add_number), & zero_address_frag); - *p = c; - demand_empty_rest_of_line(); -} - -void -s_org() -{ - register segT segment; - expressionS exp; - register long int temp_fill; - register char *p; -/* - * Don't believe the documentation of BSD 4.2 AS. - * There is no such thing as a sub-segment-relative origin. - * Any absolute origin is given a warning, then assumed to be segment-relative. - * Any segmented origin expression ("foo+42") had better be in the right - * segment or the .org is ignored. - * - * BSD 4.2 AS warns if you try to .org backwards. We cannot because we - * never know sub-segment sizes when we are reading code. - * BSD will crash trying to emit -ve numbers of filler bytes in certain - * .orgs. We don't crash, but see as-write for that code. - */ -/* - * Don't make frag if need_pass_2==TRUE. - */ - segment = get_known_segmented_expression(& exp); - if ( *input_line_pointer == ',' ) { - input_line_pointer ++; - temp_fill = get_absolute_expression (); - } else - temp_fill = 0; - if ( ! need_pass_2 ) { - if (segment != now_seg && segment != SEG_ABSOLUTE) - as_warn("Illegal segment \"%s\". Segment \"%s\" assumed.", - seg_name [(int) segment], seg_name [(int) now_seg]); - p = frag_var (rs_org, 1, 1, (relax_substateT)0, exp . X_add_symbol, - exp . X_add_number, (char *)0); - * p = temp_fill; - } /* if (ok to make frag) */ - demand_empty_rest_of_line(); -} - -void -s_set() -{ - register char *name; - register char delim; - register char *end_name; - register symbolS *symbolP; - - /* - * Especial apologies for the random logic: - * this just grew, and could be parsed much more simply! - * Dean in haste. - */ - name = input_line_pointer; - delim = get_symbol_end(); - end_name = input_line_pointer; - *end_name = delim; - SKIP_WHITESPACE(); - if ( * input_line_pointer != ',' ) { - *end_name = 0; - as_warn("Expected comma after name \"%s\"", name); - *end_name = delim; - ignore_rest_of_line(); - return; - } - input_line_pointer ++; - *end_name = 0; - if(name[0]=='.' && name[1]=='\0') { - /* Turn '. = mumble' into a .org mumble */ - register segT segment; - expressionS exp; - register char *ptr; - - segment = get_known_segmented_expression(& exp); - if ( ! need_pass_2 ) { - if (segment != now_seg && segment != SEG_ABSOLUTE) - as_warn("Illegal segment \"%s\". Segment \"%s\" assumed.", - seg_name [(int) segment], seg_name [(int) now_seg]); - ptr = frag_var (rs_org, 1, 1, (relax_substateT)0, exp.X_add_symbol, - exp.X_add_number, (char *)0); - *ptr= 0; - } /* if (ok to make frag) */ - *end_name = delim; - return; - } - symbolP = symbol_find_or_make (name); - *end_name = delim; - pseudo_set (symbolP); - demand_empty_rest_of_line (); -} - -void -s_space() -{ - long int temp_repeat; - register long int temp_fill; - register char *p; - - /* Just like .fill, but temp_size = 1 */ - if ( get_absolute_expression_and_terminator( & temp_repeat) == ',' ) { - temp_fill = get_absolute_expression (); - } else { - input_line_pointer --; /* Backup over what was not a ','. */ - temp_fill = 0; - } - if ( temp_repeat <= 0 ) { - as_warn("Repeat < 0, .space ignored"); - ignore_rest_of_line(); - return; - } - if ( ! need_pass_2 ) { - p = frag_var (rs_fill, 1, 1, (relax_substateT)0, (symbolS *)0, - temp_repeat, (char *)0); - * p = temp_fill; - } - demand_empty_rest_of_line(); -} - -void -s_text() -{ - register int temp; - - temp = get_absolute_expression (); - subseg_new (SEG_TEXT, (subsegT)temp); - demand_empty_rest_of_line(); -} - - -/*( JF was static, but can't be if machine dependent pseudo-ops are to use it */ - -void -demand_empty_rest_of_line() -{ - SKIP_WHITESPACE(); - if ( is_end_of_line [* input_line_pointer] ) - { - input_line_pointer ++; - } - else - { - ignore_rest_of_line(); - } - /* Return having already swallowed end-of-line. */ -} /* Return pointing just after end-of-line. */ - - -void -ignore_rest_of_line() /* For suspect lines: gives warning. */ -{ - if ( ! is_end_of_line [* input_line_pointer]) - { - as_warn("Rest of line ignored. 1st junk character valued %d (%c)." - , * input_line_pointer, *input_line_pointer); - while ( input_line_pointer < buffer_limit - && ! is_end_of_line [* input_line_pointer] ) - { - input_line_pointer ++; - } - } - input_line_pointer ++; /* Return pointing just after end-of-line. */ - know( is_end_of_line [input_line_pointer [-1]] ); -} - -/* - * stab() - * - * Handle .stabX directives, which used to be open-coded. - * So much creeping featurism overloaded the semantics that we decided - * to put all .stabX thinking in one place. Here. - * - * We try to make any .stabX directive legal. Other people's AS will often - * do assembly-time consistency checks: eg assigning meaning to n_type bits - * and "protecting" you from setting them to certain values. (They also zero - * certain bits before emitting symbols. Tut tut.) - * - * If an expression is not absolute we either gripe or use the relocation - * information. Other people's assemblers silently forget information they - * don't need and invent information they need that you didn't supply. - * - * .stabX directives always make a symbol table entry. It may be junk if - * the rest of your .stabX directive is malformed. - */ -static void -stab (what) -int what; -{ - register symbolS * symbolP; - register char * string; - int saved_type; - int length; - int goof; /* TRUE if we have aborted. */ - long int longint; - -/* - * Enter with input_line_pointer pointing past .stabX and any following - * whitespace. - */ - goof = FALSE; /* JF who forgot this?? */ - if (what == 's') { - string = demand_copy_C_string (& length); - SKIP_WHITESPACE(); - if (* input_line_pointer == ',') - input_line_pointer ++; - else { - as_warn( "I need a comma after symbol's name" ); - goof = TRUE; - } - } else - string = ""; - -/* - * Input_line_pointer->after ','. String -> symbol name. - */ - if (! goof) { - symbolP = symbol_new (string, 0,0,0,0,(struct frag *)0); - switch (what) { - case 'd': - symbolP->sy_name = NULL; /* .stabd feature. */ - symbolP->sy_value = obstack_next_free(& frags) - frag_now->fr_literal; - symbolP->sy_frag = frag_now; - break; - - case 'n': - symbolP->sy_frag = &zero_address_frag; - break; - - case 's': - symbolP->sy_frag = & zero_address_frag; - break; - - default: - BAD_CASE( what ); - break; - } - if (get_absolute_expression_and_terminator (& longint) == ',') - symbolP->sy_type = saved_type = longint; - else { - as_warn( "I want a comma after the n_type expression" ); - goof = TRUE; - input_line_pointer --; /* Backup over a non-',' char. */ - } - } - if (! goof) { - if (get_absolute_expression_and_terminator (& longint) == ',') - symbolP->sy_other = longint; - else { - as_warn( "I want a comma after the n_other expression" ); - goof = TRUE; - input_line_pointer --; /* Backup over a non-',' char. */ - } - } - if (! goof) { - symbolP->sy_desc = get_absolute_expression (); - if (what == 's' || what == 'n') { - if (* input_line_pointer != ',') { - as_warn( "I want a comma after the n_desc expression" ); - goof = TRUE; - } else { - input_line_pointer ++; - } - } - } - if ((! goof) && (what=='s' || what=='n')) { - pseudo_set (symbolP); - symbolP->sy_type = saved_type; - } - if (goof) - ignore_rest_of_line (); - else - demand_empty_rest_of_line (); -} - -/* - * pseudo_set() - * - * In: Pointer to a symbol. - * Input_line_pointer -> expression. - * - * Out: Input_line_pointer -> just after any whitespace after expression. - * Tried to set symbol to value of expression. - * Will change sy_type, sy_value, sy_frag; - * May set need_pass_2 == TRUE. - */ -static void -pseudo_set (symbolP) - symbolS * symbolP; -{ - expressionS exp; - register segT segment; - int ext; - - know( symbolP ); /* NULL pointer is logic error. */ - ext=(symbolP->sy_type&N_EXT); - if ((segment = expression( & exp )) == SEG_NONE) - { - as_warn( "Missing expression: absolute 0 assumed" ); - exp . X_seg = SEG_ABSOLUTE; - exp . X_add_number = 0; - } - switch (segment) - { - case SEG_BIG: - as_warn( "%s number illegal. Absolute 0 assumed.", - exp . X_add_number > 0 ? "Bignum" : "Floating-Point" ); - symbolP -> sy_type = N_ABS | ext; - symbolP -> sy_value = 0; - symbolP -> sy_frag = & zero_address_frag; - break; - - case SEG_NONE: - as_warn("No expression: Using absolute 0"); - symbolP -> sy_type = N_ABS | ext; - symbolP -> sy_value = 0; - symbolP -> sy_frag = & zero_address_frag; - break; - - case SEG_DIFFERENCE: - if (exp.X_add_symbol && exp.X_subtract_symbol - && (exp.X_add_symbol->sy_type & N_TYPE) - == (exp.X_subtract_symbol->sy_type & N_TYPE)) { - if(exp.X_add_symbol->sy_frag != exp.X_subtract_symbol->sy_frag) { - as_bad("Unknown expression: symbols %s and %s are in different frags.",exp.X_add_symbol->sy_name, exp.X_subtract_symbol->sy_name); - need_pass_2++; - } - exp.X_add_number+=exp.X_add_symbol->sy_value - exp.X_subtract_symbol->sy_value; - } else - as_warn( "Complex expression. Absolute segment assumed." ); - case SEG_ABSOLUTE: - symbolP -> sy_type = N_ABS | ext; - symbolP -> sy_value = exp . X_add_number; - symbolP -> sy_frag = & zero_address_frag; - break; - - case SEG_DATA: - case SEG_TEXT: - case SEG_BSS: - symbolP -> sy_type = seg_N_TYPE [(int) segment] | ext; - symbolP -> sy_value= exp . X_add_number + exp . X_add_symbol -> sy_value; - symbolP -> sy_frag = exp . X_add_symbol -> sy_frag; - break; - - case SEG_PASS1: /* Not an error. Just try another pass. */ - symbolP->sy_forward=exp.X_add_symbol; - as_warn("Unknown expression"); - know( need_pass_2 == TRUE ); - break; - - case SEG_UNKNOWN: - symbolP->sy_forward=exp.X_add_symbol; - /* as_warn("unknown symbol"); */ - /* need_pass_2 = TRUE; */ - break; - - default: - BAD_CASE( segment ); - break; - } -} - -/* - * stabs(file), stabf(func) and stabd(line) -- for the purpose of - * source file debugging of assembly files, generate file, - * function and line number stabs, respectively. - * These functions have corresponding functions named - * filestab(), funcstab() and linestab() in input-scrub.c, - * where logical files and logical line numbers are handled. - */ - -#include <stab.h> - -stabs(file) - char *file; -{ - /* .stabs "file",100,0,0,. */ - (void) symbol_new(file, - N_SO, - 0, - 0, - obstack_next_free(& frags) - frag_now->fr_literal, - frag_now); -} - -stabf(func) - char *func; -{ - symbolS *symbolP; - static int void_undefined = 1; - - /* crudely filter uninteresting labels: require an initial '_' */ - if (*func++ != '_') - return; - - /* assembly functions are assumed to have void type */ - if (void_undefined) - { - /* .stabs "void:t15=15",128,0,0,0 */ - (void) symbol_new("void:t1=1", - N_LSYM, - 0, - 0, - 0, - &zero_address_frag); - void_undefined = 0; - } - - /* .stabs "func:F1",36,0,0,. */ - symbolP = symbol_new((char *) 0, - N_FUN, - 0, - 0, - obstack_next_free(& frags) - frag_now->fr_literal, - frag_now); - obstack_grow(¬es, func, strlen(func)); - obstack_1grow(¬es, ':'); - obstack_1grow(¬es, 'F'); - obstack_1grow(¬es, '1'); - obstack_1grow(¬es, '\0'); - symbolP->sy_name = obstack_finish(¬es); -} - -stabd(line) - unsigned line; -{ - /* .stabd 68,0,line */ - (void) symbol_new((char *)0, - N_SLINE, - 0, - line, - obstack_next_free(& frags) - frag_now->fr_literal, - frag_now); -} - -/* - * cons() - * - * CONStruct more frag of .bytes, or .words etc. - * Should need_pass_2 be TRUE then emit no frag(s). - * This understands EXPRESSIONS, as opposed to big_cons(). - * - * Bug (?) - * - * This has a split personality. We use expression() to read the - * value. We can detect if the value won't fit in a byte or word. - * But we can't detect if expression() discarded significant digits - * in the case of a long. Not worth the crocks required to fix it. - */ -void -cons(nbytes) /* worker to do .byte etc statements */ - /* clobbers input_line_pointer, checks */ - /* end-of-line. */ - register int nbytes; /* 1=.byte, 2=.word, 4=.long */ -{ - register char c; - register long int mask; /* High-order bits we will left-truncate, */ - /* but includes sign bit also. */ - register long int get; /* what we get */ - register long int use; /* get after truncation. */ - register long int unmask; /* what bits we will store */ - register char * p; - register segT segment; - expressionS exp; -#ifdef NS32K - void fix_new_ns32k(); -#else - void fix_new(); -#endif - - /* - * Input_line_pointer -> 1st char after pseudo-op-code and could legally - * be a end-of-line. (Or, less legally an eof - which we cope with.) - */ - /* JF << of >= number of bits in the object is undefined. In particular - SPARC (Sun 4) has problems */ - if(nbytes>=sizeof(long int)) - mask = 0; - else - mask = ~0 << (BITS_PER_CHAR * nbytes); /* Don't store these bits. */ - unmask = ~ mask; /* Do store these bits. */ -#ifdef NEVER - "Do this mod if you want every overflow check to assume SIGNED 2's complement data."; - mask = ~ (unmask >> 1); /* Includes sign bit now. */ -#endif - /* - * The following awkward logic is to parse ZERO or more expressions, - * comma seperated. Recall an expression includes its leading & - * trailing blanks. We fake a leading ',' if there is (supposed to - * be) a 1st expression, and keep demanding 1 expression for each ','. - */ - if (is_it_end_of_statement()) - { - c = 0; /* Skip loop. */ - input_line_pointer ++; /* Matches end-of-loop 'correction'. */ - } - else - c = ','; /* Do loop. */ - while ( c == ',' ) - { - segment = expression( &exp ); /* At least scan over the expression. */ - if ( ! need_pass_2 ) - { /* Still worthwhile making frags. */ - - /* Don't call this if we are going to junk this pass anyway! */ - know( segment != SEG_PASS1 ); - - if ( segment == SEG_DIFFERENCE && exp . X_add_symbol == NULL ) - { - as_warn( "Subtracting symbol \"%s\"(segment\"%s\") is too hard. Absolute segment assumed.", - exp . X_subtract_symbol -> sy_name, - seg_name [(int) N_TYPE_seg [exp . X_subtract_symbol -> sy_type & N_TYPE]]); - segment = SEG_ABSOLUTE; - /* Leave exp . X_add_number alone. */ - } - p = frag_more (nbytes); - switch (segment) - { - case SEG_BIG: - as_warn( "%s number illegal. Absolute 0 assumed.", - exp . X_add_number > 0 ? "Bignum" : "Floating-Point"); - md_number_to_chars (p, (long)0, nbytes); - break; - - case SEG_NONE: - as_warn( "0 assumed for missing expression" ); - exp . X_add_number = 0; - know( exp . X_add_symbol == NULL ); - /* fall into SEG_ABSOLUTE */ - case SEG_ABSOLUTE: - get = exp . X_add_number; - use = get & unmask; - if ( (get & mask) && (get & mask) != mask ) - { /* Leading bits contain both 0s & 1s. */ - as_warn("Value x%x truncated to x%x.", get, use); - } - md_number_to_chars (p, use, nbytes); /* put bytes in right order. */ - break; - - case SEG_DIFFERENCE: -#ifndef WORKING_DOT_WORD - if(nbytes==2) { - struct broken_word *x; - - x=(struct broken_word *)xmalloc(sizeof(struct broken_word)); - x->next_broken_word=broken_words; - broken_words=x; - x->frag=frag_now; - x->word_goes_here=p; - x->dispfrag=0; - x->add=exp.X_add_symbol; - x->sub=exp.X_subtract_symbol; - x->addnum=exp.X_add_number; - x->added=0; - new_broken_words++; - break; - } - /* Else Fall through into. . . */ -#endif - case SEG_BSS: - case SEG_UNKNOWN: - case SEG_TEXT: - case SEG_DATA: -#if defined(SPARC) || defined(I860) - fix_new (frag_now, p - frag_now -> fr_literal, nbytes, - exp . X_add_symbol, exp . X_subtract_symbol, - exp . X_add_number, 0, RELOC_32); -#endif -#ifdef NS32K - fix_new_ns32k (frag_now, p - frag_now -> fr_literal, nbytes, - exp . X_add_symbol, exp . X_subtract_symbol, - exp . X_add_number, 0, 0, 2, 0, 0); -#endif -#if !defined(SPARC) && !defined(NS32K) && !defined(I860) - fix_new (frag_now, p - frag_now -> fr_literal, nbytes, - exp . X_add_symbol, exp . X_subtract_symbol, - exp . X_add_number, 0); -#endif - break; - - default: - BAD_CASE( segment ); - break; - } /* switch(segment) */ - } /* if(!need_pass_2) */ - c = * input_line_pointer ++; - } /* while(c==',') */ - input_line_pointer --; /* Put terminator back into stream. */ - demand_empty_rest_of_line(); -} /* cons() */ - -/* - * big_cons() - * - * CONStruct more frag(s) of .quads, or .octa etc. - * Makes 0 or more new frags. - * If need_pass_2 == TRUE, generate no frag. - * This understands only bignums, not expressions. Cons() understands - * expressions. - * - * Constants recognised are '0...'(octal) '0x...'(hex) '...'(decimal). - * - * This creates objects with struct obstack_control objs, destroying - * any context objs held about a partially completed object. Beware! - * - * - * I think it sucks to have 2 different types of integers, with 2 - * routines to read them, store them etc. - * It would be nicer to permit bignums in expressions and only - * complain if the result overflowed. However, due to "efficiency"... - */ -void -big_cons(nbytes) /* worker to do .quad etc statements */ - /* clobbers input_line_pointer, checks */ - /* end-of-line. */ - register int nbytes; /* 8=.quad 16=.octa ... */ -{ - register char c; /* input_line_pointer -> c. */ - register int radix; - register long int length; /* Number of chars in an object. */ - register int digit; /* Value of 1 digit. */ - register int carry; /* For multi-precision arithmetic. */ - register int work; /* For multi-precision arithmetic. */ - register char * p; /* For multi-precision arithmetic. */ - - extern char hex_value[]; /* In hex_value.c. */ - - /* - * The following awkward logic is to parse ZERO or more strings, - * comma seperated. Recall an expression includes its leading & - * trailing blanks. We fake a leading ',' if there is (supposed to - * be) a 1st expression, and keep demanding 1 expression for each ','. - */ - if (is_it_end_of_statement()) - { - c = 0; /* Skip loop. */ - } - else - { - c = ','; /* Do loop. */ - -- input_line_pointer; - } - while (c == ',') - { - ++ input_line_pointer; - SKIP_WHITESPACE(); - c = * input_line_pointer; - /* C contains 1st non-blank character of what we hope is a number. */ - if (c == '0') - { - c = * ++ input_line_pointer; - if (c == 'x' || c=='X') - { - c = * ++ input_line_pointer; - radix = 16; - } - else - { - radix = 8; - } - } - else - { - radix = 10; - } - /* - * This feature (?) is here to stop people worrying about - * mysterious zero constants: which is what they get when - * they completely omit digits. - */ - if (hex_value[c] >= radix) - { - as_warn( "Missing digits. 0 assumed." ); - } - bignum_high = bignum_low - 1; /* Start constant with 0 chars. */ - for( ; (digit = hex_value [c]) < radix; c = * ++ input_line_pointer) - { - /* Multiply existing number by radix, then add digit. */ - carry = digit; - for (p=bignum_low; p <= bignum_high; p++) - { - work = (*p & MASK_CHAR) * radix + carry; - *p = work & MASK_CHAR; - carry = work >> BITS_PER_CHAR; - } - if (carry) - { - grow_bignum(); - * bignum_high = carry & MASK_CHAR; - know( (carry & ~ MASK_CHAR) == 0); - } - } - length = bignum_high - bignum_low + 1; - if (length > nbytes) - { - as_warn( "Most significant bits truncated in integer constant." ); - } - else - { - register long int leading_zeroes; - - for(leading_zeroes = nbytes - length; - leading_zeroes; - leading_zeroes --) - { - grow_bignum(); - * bignum_high = 0; - } - } - if (! need_pass_2) - { - p = frag_more (nbytes); - bcopy (bignum_low, p, (int)nbytes); - } - /* C contains character after number. */ - SKIP_WHITESPACE(); - c = * input_line_pointer; - /* C contains 1st non-blank character after number. */ - } - demand_empty_rest_of_line(); -} /* big_cons() */ - -static void -grow_bignum() /* Extend bignum by 1 char. */ -{ - register long int length; - - bignum_high ++; - if (bignum_high >= bignum_limit) - { - length = bignum_limit - bignum_low; - bignum_low = xrealloc (bignum_low, length + length); - bignum_high = bignum_low + length; - bignum_limit = bignum_low + length + length; - } -} /* grow_bignum(); */ - -/* - * float_cons() - * - * CONStruct some more frag chars of .floats .ffloats etc. - * Makes 0 or more new frags. - * If need_pass_2 == TRUE, no frags are emitted. - * This understands only floating literals, not expressions. Sorry. - * - * A floating constant is defined by atof_generic(), except it is preceded - * by 0d 0f 0g or 0h. After observing the STRANGE way my BSD AS does its - * reading, I decided to be incompatible. This always tries to give you - * rounded bits to the precision of the pseudo-op. Former AS did premature - * truncatation, restored noisy bits instead of trailing 0s AND gave you - * a choice of 2 flavours of noise according to which of 2 floating-point - * scanners you directed AS to use. - * - * In: input_line_pointer -> whitespace before, or '0' of flonum. - * - */ - -void /* JF was static, but can't be if VAX.C is goning to use it */ -float_cons(float_type) /* Worker to do .float etc statements. */ - /* Clobbers input_line-pointer, checks end-of-line. */ - register float_type; /* 'f':.ffloat ... 'F':.float ... */ -{ - register char * p; - register char c; - int length; /* Number of chars in an object. */ - register char * err; /* Error from scanning floating literal. */ - char temp [MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT]; - - /* - * The following awkward logic is to parse ZERO or more strings, - * comma seperated. Recall an expression includes its leading & - * trailing blanks. We fake a leading ',' if there is (supposed to - * be) a 1st expression, and keep demanding 1 expression for each ','. - */ - if (is_it_end_of_statement()) - { - c = 0; /* Skip loop. */ - ++ input_line_pointer; /* -> past termintor. */ - } - else - { - c = ','; /* Do loop. */ - } - while (c == ',') - { - /* input_line_pointer -> 1st char of a flonum (we hope!). */ - SKIP_WHITESPACE(); - /* Skip any 0{letter} that may be present. Don't even check if the - * letter is legal. Someone may invent a "z" format and this routine - * has no use for such information. Lusers beware: you get - * diagnostics if your input is ill-conditioned. - */ - - if(input_line_pointer[0]=='0' && isalpha(input_line_pointer[1])) - input_line_pointer+=2; - - err = md_atof (float_type, temp, &length); - know( length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT); - know( length > 0 ); - if (* err) - { - as_warn( "Bad floating literal: %s", err); - ignore_rest_of_line(); - /* Input_line_pointer -> just after end-of-line. */ - c = 0; /* Break out of loop. */ - } - else - { - if ( ! need_pass_2) - { - p = frag_more (length); - bcopy (temp, p, length); - } - SKIP_WHITESPACE(); - c = * input_line_pointer ++; - /* C contains 1st non-white character after number. */ - /* input_line_pointer -> just after terminator (c). */ - } - } - -- input_line_pointer; /* -> terminator (is not ','). */ - demand_empty_rest_of_line(); -} /* float_cons() */ - -/* - * stringer() - * - * We read 0 or more ',' seperated, double-quoted strings. - * - * Caller should have checked need_pass_2 is FALSE because we don't check it. - */ -static void -stringer(append_zero) /* Worker to do .ascii etc statements. */ - /* Checks end-of-line. */ - register int append_zero; /* 0: don't append '\0', else 1 */ -{ - /* register char * p; JF unused */ - /* register int length; JF unused */ /* Length of string we read, excluding */ - /* trailing '\0' implied by closing quote. */ - /* register char * where; JF unused */ - /* register fragS * fragP; JF unused */ - register int c; - - /* - * The following awkward logic is to parse ZERO or more strings, - * comma seperated. Recall a string expression includes spaces - * before the opening '\"' and spaces after the closing '\"'. - * We fake a leading ',' if there is (supposed to be) - * a 1st, expression. We keep demanding expressions for each - * ','. - */ - if (is_it_end_of_statement()) - { - c = 0; /* Skip loop. */ - ++ input_line_pointer; /* Compensate for end of loop. */ - } - else - { - c = ','; /* Do loop. */ - } - for ( ; c == ','; c = *input_line_pointer ++) - { - SKIP_WHITESPACE(); - if (* input_line_pointer == '\"') - { - ++ input_line_pointer; /* -> 1st char of string. */ - while ( (c = next_char_of_string()) >= 0) - { - FRAG_APPEND_1_CHAR( c ); - } - if (append_zero) - { - FRAG_APPEND_1_CHAR( 0 ); - } - know( input_line_pointer [-1] == '\"' ); - } - else - { - as_warn( "Expected \"-ed string" ); - } - SKIP_WHITESPACE(); - } - -- input_line_pointer; - demand_empty_rest_of_line(); -} /* stringer() */ - -static int -next_char_of_string () -{ - register int c; - - c = * input_line_pointer ++; - switch (c) - { - case '\"': - c = -1; - break; - - case '\\': - switch (c = * input_line_pointer ++) - { - case 'b': - c = '\b'; - break; - - case 'f': - c = '\f'; - break; - - case 'n': - c = '\n'; - break; - - case 'r': - c = '\r'; - break; - - case 't': - c = '\t'; - break; - - case '\\': - case '"': - break; /* As itself. */ - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - long int number; - - for (number = 0; isdigit(c); c = * input_line_pointer ++) - { - number = number * 8 + c - '0'; - } - c = number; - } - -- input_line_pointer; - break; - - case '\n': -/* as_fatal( "Unterminated string - use app!" ); */ -/* To be compatible with BSD 4.2 as: give the luser a linefeed!! */ - c = '\n'; - break; - - default: - as_warn( "Bad escaped character in string, '?' assumed" ); - c = '?'; - break; - } - break; - - default: - break; - } - return (c); -} - -static segT -get_segmented_expression ( expP ) - register expressionS * expP; -{ - register segT retval; - - if ( (retval = expression( expP )) == SEG_PASS1 || retval == SEG_NONE || retval == SEG_BIG ) - { - as_warn("Expected address expression: absolute 0 assumed"); - retval = expP -> X_seg = SEG_ABSOLUTE; - expP -> X_add_number = 0; - expP -> X_add_symbol = expP -> X_subtract_symbol = 0; - } - return (retval); /* SEG_ ABSOLUTE,UNKNOWN,DATA,TEXT,BSS */ -} - -static segT -get_known_segmented_expression ( expP ) - register expressionS * expP; -{ - register segT retval; - register char * name1; - register char * name2; - - if ( (retval = get_segmented_expression (expP)) == SEG_UNKNOWN - ) - { - name1 = expP -> X_add_symbol ? expP -> X_add_symbol -> sy_name : ""; - name2 = expP -> X_subtract_symbol ? expP -> X_subtract_symbol -> sy_name : ""; - if ( name1 && name2 ) - { - as_warn("Symbols \"%s\" \"%s\" are undefined: absolute 0 assumed.", - name1, name2); - } - else - { - as_warn("Symbol \"%s\" undefined: absolute 0 assumed.", - name1 ? name1 : name2); - } - retval = expP -> X_seg = SEG_ABSOLUTE; - expP -> X_add_number = 0; - expP -> X_add_symbol = expP -> X_subtract_symbol = NULL; - } - know( retval == SEG_ABSOLUTE || retval == SEG_DATA || retval == SEG_TEXT || retval == SEG_BSS || retval == SEG_DIFFERENCE ); - return (retval); -} /* get_known_segmented_expression() */ - - - -/* static */ long int /* JF was static, but can't be if the MD pseudos are to use it */ -get_absolute_expression () -{ - expressionS exp; - register segT s; - - if ( (s = expression(& exp)) != SEG_ABSOLUTE ) - { - if ( s != SEG_NONE ) - { - as_warn( "Bad Absolute Expression, absolute 0 assumed."); - } - exp . X_add_number = 0; - } - return (exp . X_add_number); -} - -static char /* return terminator */ -get_absolute_expression_and_terminator( val_pointer) - long int * val_pointer; /* return value of expression */ -{ - * val_pointer = get_absolute_expression (); - return ( * input_line_pointer ++ ); -} - -/* - * demand_copy_C_string() - * - * Like demand_copy_string, but return NULL if the string contains any '\0's. - * Give a warning if that happens. - */ -static char * -demand_copy_C_string (len_pointer) - int * len_pointer; -{ - register char * s; - - if (s = demand_copy_string (len_pointer)) - { - register int len; - - for (len = * len_pointer; - len > 0; - len--) - { - if (* s == 0) - { - s = 0; - len = 1; - * len_pointer = 0; - as_warn( "This string may not contain \'\\0\'" ); - } - } - } - return (s); -} - -/* - * demand_copy_string() - * - * Demand string, but return a safe (=private) copy of the string. - * Return NULL if we can't read a string here. - */ -static char * -demand_copy_string (lenP) - int * lenP; -{ - register int c; - register int len; - char * retval; - - len = 0; - SKIP_WHITESPACE(); - if (* input_line_pointer == '\"') - { - input_line_pointer ++; /* Skip opening quote. */ - while ( (c = next_char_of_string()) >= 0 ) { - obstack_1grow ( ¬es, c ); - len ++; - } - /* JF this next line is so demand_copy_C_string will return a null - termanated string. */ - obstack_1grow(¬es,'\0'); - retval=obstack_finish( ¬es); - } else { - as_warn( "Missing string" ); - retval = NULL; - ignore_rest_of_line (); - } - * lenP = len; - return (retval); -} - -/* - * is_it_end_of_statement() - * - * In: Input_line_pointer -> next character. - * - * Do: Skip input_line_pointer over all whitespace. - * - * Out: TRUE if input_line_pointer -> end-of-line. - */ -static int -is_it_end_of_statement() -{ - SKIP_WHITESPACE(); - return (is_end_of_line [* input_line_pointer]); -} - -void -equals(sym_name) -char *sym_name; -{ - register struct symbol * symbolP; /* symbol we are working with */ - - input_line_pointer++; - if(*input_line_pointer=='=') - input_line_pointer++; - - while(*input_line_pointer==' ' || *input_line_pointer=='\t') - input_line_pointer++; - - if(sym_name[0]=='.' && sym_name[1]=='\0') { - /* Turn '. = mumble' into a .org mumble */ - register segT segment; - expressionS exp; - register char *p; - - segment = get_known_segmented_expression(& exp); - if ( ! need_pass_2 ) { - if (segment != now_seg && segment != SEG_ABSOLUTE) - as_warn("Illegal segment \"%s\". Segment \"%s\" assumed.", - seg_name [(int) segment], seg_name [(int) now_seg]); - p = frag_var (rs_org, 1, 1, (relax_substateT)0, exp.X_add_symbol, - exp.X_add_number, (char *)0); - * p = 0; - } /* if (ok to make frag) */ - } else { - symbolP=symbol_find_or_make(sym_name); - pseudo_set(symbolP); - } -} - -/* end: read.c */ diff --git a/gnu/gas/read.h b/gnu/gas/read.h deleted file mode 100644 index 6b46e8fcac8c..000000000000 --- a/gnu/gas/read.h +++ /dev/null @@ -1,47 +0,0 @@ -/* read.h - of read.c - Copyright (C) 1986 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -extern char * input_line_pointer; /* -> char we are parsing now. */ - -#define PERMIT_WHITESPACE /* Define to make whitespace be allowed in */ - /* many syntactically unnecessary places. */ - /* Normally undefined. For compatibility */ - /* with ancient GNU cc. */ -#undef PERMIT_WHITESPACE - -#ifdef PERMIT_WHITESPACE -#define SKIP_WHITESPACE() {if (* input_line_pointer == ' ') ++ input_line_pointer;} -#else -#define SKIP_WHITESPACE() ASSERT( * input_line_pointer != ' ' ) -#endif - - -#define LEX_NAME (1) /* may continue a name */ -#define LEX_BEGIN_NAME (2) /* may begin a name */ - -#define is_name_beginner(c) ( lex_type[c] & LEX_BEGIN_NAME ) -#define is_part_of_name(c) ( lex_type[c] & LEX_NAME ) - -extern const char lex_type[]; - -void read_begin(); -void read_end(); -void read_a_source_file(); - -/* end: read.h */ diff --git a/gnu/gas/struc-symbol.h b/gnu/gas/struc-symbol.h deleted file mode 100644 index 11eab6b72bea..000000000000 --- a/gnu/gas/struc-symbol.h +++ /dev/null @@ -1,72 +0,0 @@ -/* struct_symbol.h - Internal symbol structure - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#ifndef VMS -#include "a.out.gnu.h" /* Needed to define struct nlist. Sigh. */ -#else -#include "a_out.h" -#endif - -struct symbol /* our version of an nlist node */ -{ - struct nlist sy_nlist; /* what we write in .o file (if permitted) */ - long unsigned sy_name_offset; /* 4-origin position of sy_name in symbols */ - /* part of object file. */ - /* 0 for (nameless) .stabd symbols. */ - /* Not used until write_object_file() time. */ - long int sy_number; /* 24 bit symbol number. */ - /* Symbol numbers start at 0 and are */ - /* unsigned. */ - struct symbol * sy_next; /* forward chain, or NULL */ - struct frag * sy_frag; /* NULL or -> frag this symbol attaches to. */ - struct symbol *sy_forward; /* value is really that of this other symbol */ -}; - -typedef struct symbol symbolS; - -#define sy_name sy_nlist .n_un. n_name - /* Name field always points to a string. */ - /* 0 means .stabd-like anonymous symbol. */ -#define sy_type sy_nlist. n_type -#define sy_other sy_nlist. n_other -#define sy_desc sy_nlist. n_desc -#define sy_value sy_nlist. n_value - /* Value of symbol is this value + object */ - /* file address of sy_frag. */ - -typedef unsigned valueT; /* The type of n_value. Helps casting. */ - -/* end: struct_symbol.h */ -#ifndef WORKING_DOT_WORD -struct broken_word { - struct broken_word *next_broken_word;/* One of these strucs per .word x-y */ - fragS *frag; /* Which frag its in */ - char *word_goes_here;/* Where in the frag it is */ - fragS *dispfrag; /* where to add the break */ - symbolS *add; /* symbol_x */ - symbolS *sub; /* - symbol_y */ - long addnum; /* + addnum */ - int added; /* nasty thing happend yet? */ - /* 1: added and has a long-jump */ - /* 2: added but uses someone elses long-jump */ - struct broken_word *use_jump; /* points to broken_word with a similar - long-jump */ -}; -extern struct broken_word *broken_words; -#endif diff --git a/gnu/gas/subsegs.c b/gnu/gas/subsegs.c deleted file mode 100644 index c9eea3da0b23..000000000000 --- a/gnu/gas/subsegs.c +++ /dev/null @@ -1,292 +0,0 @@ -/* subsegs.c - subsegments - - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - * Segments & sub-segments. - */ - -#include "as.h" -#include "subsegs.h" -#include "obstack.h" -#include "frags.h" -#include "struc-symbol.h" -#include "write.h" - -frchainS* frchain_root, - * frchain_now, /* Commented in "subsegs.h". */ - * data0_frchainP; - - -const int /* in: segT out: N_TYPE bits */ -seg_N_TYPE[] = { - N_ABS, - N_TEXT, - N_DATA, - N_BSS, - N_UNDF, - N_UNDF, - N_UNDF, - N_UNDF, - N_UNDF, - N_UNDF -}; - - -char * const /* in: segT out: char* */ -seg_name[] = { - "absolute", - "text", - "data", - "bss", - "unknown", - "absent", - "pass1", - "ASSEMBLER-INTERNAL-LOGIC-ERROR!", - "bignum/flonum", - "difference", - "" - }; /* Used by error reporters, dumpers etc. */ - -const segT N_TYPE_seg [N_TYPE+2] = /* N_TYPE == 0x1E = 32-2 */ -{ - SEG_UNKNOWN, /* N_UNDF == 0 */ - SEG_GOOF, - SEG_ABSOLUTE, /* N_ABS == 2 */ - SEG_GOOF, - SEG_TEXT, /* N_TEXT == 4 */ - SEG_GOOF, - SEG_DATA, /* N_DATA == 6 */ - SEG_GOOF, - SEG_BSS, /* N_BSS == 8 */ - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, - SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF, SEG_GOOF -}; - -void -subsegs_begin() -{ - /* Check table(s) seg_name[], seg_N_TYPE[] is in correct order */ - know( SEG_ABSOLUTE ==0 ); - know( SEG_TEXT ==1 ); - know( SEG_DATA ==2 ); - know( SEG_BSS ==3 ); - know( SEG_UNKNOWN ==4 ); - know( SEG_NONE ==5 ); - know( SEG_PASS1 ==6 ); - know( SEG_GOOF ==7 ); - know( SEG_BIG ==8 ); - know( SEG_DIFFERENCE ==9 ); - know( SEG_MAXIMUM_ORDINAL == SEG_DIFFERENCE ); - know( seg_name [(int) SEG_MAXIMUM_ORDINAL + 1] [0] == 0 ); - - obstack_begin( &frags, 5000); - frchain_root = NULL; - frchain_now = NULL; /* Warn new_subseg() that we are booting. */ - /* Fake up 1st frag. */ - /* It won't be used=> is ok if obstack... */ - /* pads the end of it for alignment. */ - frag_now=(fragS *)obstack_alloc(&frags,SIZEOF_STRUCT_FRAG); - /* obstack_1blank( &frags, SIZEOF_STRUCT_FRAG, & frag_now ); */ - /* This 1st frag will not be in any frchain. */ - /* We simply give subseg_new somewhere to scribble. */ - now_subseg = 42; /* Lie for 1st call to subseg_new. */ - subseg_new (SEG_DATA, 0); /* .data 0 */ - data0_frchainP = frchain_now; -} - -/* - * subseg_change() - * - * Change the subsegment we are in, BUT DO NOT MAKE A NEW FRAG for the - * subsegment. If we are already in the correct subsegment, change nothing. - * This is used eg as a worker for subseg_new [which does make a new frag_now] - * and for changing segments after we have read the source. We construct eg - * fixSs even after the source file is read, so we do have to keep the - * segment context correct. - */ -void -subseg_change (seg, subseg) - register segT seg; - register int subseg; -{ - now_seg = seg; - now_subseg = subseg; - if (seg == SEG_DATA) - { - seg_fix_rootP = & data_fix_root; - } - else - { - know (seg == SEG_TEXT); - seg_fix_rootP = & text_fix_root; - } -} - -/* - * subseg_new() - * - * If you attempt to change to the current subsegment, nothing happens. - * - * In: segT, subsegT code for new subsegment. - * frag_now -> incomplete frag for current subsegment. - * If frag_now==NULL, then there is no old, incomplete frag, so - * the old frag is not closed off. - * - * Out: now_subseg, now_seg updated. - * Frchain_now points to the (possibly new) struct frchain for this - * sub-segment. - * Frchain_root updated if needed. - */ - -void -subseg_new (seg, subseg) /* begin assembly for a new sub-segment */ - register segT seg; /* SEG_DATA or SEG_TEXT */ - register subsegT subseg; -{ - long tmp; /* JF for obstack alignment hacking */ - - know( seg == SEG_DATA || seg == SEG_TEXT ); - - if (seg != now_seg || subseg != now_subseg) - { /* we just changed sub-segments */ - register frchainS * frcP; /* crawl frchain chain */ - register frchainS** lastPP; /* address of last pointer */ - frchainS * newP; /* address of new frchain */ - register fragS * former_last_fragP; - register fragS * new_fragP; - - if (frag_now) /* If not bootstrapping. */ - { - frag_now -> fr_fix = obstack_next_free(& frags) - frag_now -> fr_literal; - frag_wane(frag_now); /* Close off any frag in old subseg. */ - } -/* - * It would be nice to keep an obstack for each subsegment, if we swap - * subsegments a lot. Hence we would have much fewer frag_wanes(). - */ - { - - obstack_finish( &frags); - /* - * If we don't do the above, the next object we put on obstack frags - * will appear to start at the fr_literal of the current frag. - * Also, above ensures that the next object will begin on a - * address that is aligned correctly for the engine that runs - * this program. - */ - } - subseg_change (seg, (int)subseg); - /* - * Attempt to find or make a frchain for that sub seg. - * Crawl along chain of frchainSs, begins @ frchain_root. - * If we need to make a frchainS, link it into correct - * position of chain rooted in frchain_root. - */ - for (frcP = * (lastPP = & frchain_root); - frcP - && (int)(frcP -> frch_seg) <= (int)seg; - frcP = * ( lastPP = & frcP -> frch_next) - ) - { - if ( (int)(frcP -> frch_seg) == (int)seg - && frcP -> frch_subseg >= subseg) - { - break; - } - } - /* - * frcP: Address of the 1st frchainS in correct segment with - * frch_subseg >= subseg. - * We want to either use this frchainS, or we want - * to insert a new frchainS just before it. - * - * If frcP==NULL, then we are at the end of the chain - * of frchainS-s. A NULL frcP means we fell off the end - * of the chain looking for a - * frch_subseg >= subseg, so we - * must make a new frchainS. - * - * If we ever maintain a pointer to - * the last frchainS in the chain, we change that pointer - * ONLY when frcP==NULL. - * - * lastPP: Address of the pointer with value frcP; - * Never NULL. - * May point to frchain_root. - * - */ - if ( ! frcP - || ( (int)(frcP -> frch_seg) > (int)seg - || frcP->frch_subseg > subseg)) /* Kinky logic only works with 2 segments. */ - { - /* - * This should be the only code that creates a frchainS. - */ - newP=(frchainS *)obstack_alloc(&frags,sizeof(frchainS)); - /* obstack_1blank( &frags, sizeof(frchainS), &newP); */ - /* This begines on a good boundary */ - /* because a obstack_done() preceeded it. */ - /* It implies an obstack_done(), so we */ - /* expect the next object allocated to */ - /* begin on a correct boundary. */ - *lastPP = newP; - newP -> frch_next = frcP; /* perhaps NULL */ - (frcP = newP) -> frch_subseg = subseg; - newP -> frch_seg = seg; - newP -> frch_last = NULL; - } - /* - * Here with frcP ->ing to the frchainS for subseg. - */ - frchain_now = frcP; - /* - * Make a fresh frag for the subsegment. - */ - /* We expect this to happen on a correct */ - /* boundary since it was proceeded by a */ - /* obstack_done(). */ - tmp=obstack_alignment_mask(&frags); /* JF disable alignment */ - obstack_alignment_mask(&frags)=0; - frag_now=(fragS *)obstack_alloc(&frags,SIZEOF_STRUCT_FRAG); - obstack_alignment_mask(&frags)=tmp; - /* know( frags . obstack_c_next_free == frag_now -> fr_literal ); */ - /* But we want any more chars to come */ - /* immediately after the structure we just made. */ - new_fragP = frag_now; - new_fragP -> fr_next = NULL; - /* - * Append new frag to current frchain. - */ - former_last_fragP = frcP -> frch_last; - if (former_last_fragP) - { - know( former_last_fragP -> fr_next == NULL ); - know( frchain_now -> frch_root ); - former_last_fragP -> fr_next = new_fragP; - } - else - { - frcP -> frch_root = new_fragP; - } - frcP -> frch_last = new_fragP; - } /* if (changing subsegments) */ -} /* subseg_new() */ - -/* end: subsegs.c */ diff --git a/gnu/gas/subsegs.h b/gnu/gas/subsegs.h deleted file mode 100644 index b8dbaf76e584..000000000000 --- a/gnu/gas/subsegs.h +++ /dev/null @@ -1,65 +0,0 @@ -/* subsegs.h -> subsegs.c - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - * For every sub-segment the user mentions in the ASsembler program, - * we make one struct frchain. Each sub-segment has exactly one struct frchain - * and vice versa. - * - * Struct frchain's are forward chained (in ascending order of sub-segment - * code number). The chain runs through frch_next of each subsegment. - * This makes it hard to find a subsegment's frags - * if programmer uses a lot of them. Most programs only use text0 and - * data0, so they don't suffer. At least this way: - * (1) There are no "arbitrary" restrictions on how many subsegments - * can be programmed; - * (2) Subsegments' frchain-s are (later) chained together in the order in - * which they are emitted for object file viz text then data. - * - * From each struct frchain dangles a chain of struct frags. The frags - * represent code fragments, for that sub-segment, forward chained. - */ - -struct frchain /* control building of a frag chain */ -{ /* FRCH = FRagment CHain control */ - struct frag * frch_root; /* 1st struct frag in chain, or NULL */ - struct frag * frch_last; /* last struct frag in chain, or NULL */ - struct frchain * frch_next; /* next in chain of struct frchain-s */ - segT frch_seg; /* SEG_TEXT or SEG_DATA. */ - subsegT frch_subseg; /* subsegment number of this chain */ -}; - -typedef struct frchain frchainS; - -extern frchainS * frchain_root; /* NULL means no frchains yet. */ - /* all subsegments' chains hang off here */ - -extern frchainS * frchain_now; - /* Frchain we are assembling into now */ - /* That is, the current segment's frag */ - /* chain, even if it contains no (complete) */ - /* frags. */ - -extern frchainS * data0_frchainP; - /* Sentinel for frchain crawling. */ - /* Points to the 1st data-segment frchain. */ - /* (Which is pointed to by the last text- */ - /* segment frchain.) */ - -/* end: subsegs.h */ diff --git a/gnu/gas/symbols.c b/gnu/gas/symbols.c deleted file mode 100644 index ce7197a8e06f..000000000000 --- a/gnu/gas/symbols.c +++ /dev/null @@ -1,438 +0,0 @@ -/* symbols.c -symbol table- - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - - -#include "as.h" -#include "hash.h" -#include "obstack.h" /* For "symbols.h" */ -#include "struc-symbol.h" -#include "symbols.h" -#include "frags.h" - -#ifndef WORKING_DOT_WORD -extern int new_broken_words; -#endif -#ifdef VMS -extern char const_flag; -#endif - -static -struct hash_control * -sy_hash; /* symbol-name => struct symbol pointer */ - - /* Below are commented in "symbols.h". */ -unsigned int local_bss_counter; -symbolS * symbol_rootP; -symbolS * symbol_lastP; -symbolS abs_symbol; -struct obstack notes; - - - -symbolS * symbol_find(); /* Keep C compiler happy. */ - -/* - * Un*x idea of local labels. They are made by "n:" where n - * is any decimal digit. Refer to them with - * "nb" for previous (backward) n: - * or "nf" for next (forward) n:. - * - * Like Un*x AS, we have one set of local label counters for entire assembly, - * not one set per (sub)segment like in most assemblers. This implies that - * one can refer to a label in another segment, and indeed some crufty - * compilers have done just that. - * - * I document the symbol names here to save duplicating words elsewhere. - * The mth occurence of label n: is turned into the symbol "Ln^Am" where - * n is a digit and m is a decimal number. "L" makes it a label discarded - * unless debugging and "^A"('\1') ensures no ordinary symbol SHOULD get the - * same name as a local label symbol. The first "4:" is "L4^A1" - the m - * numbers begin at 1. - */ - -typedef short unsigned int -local_label_countT; - -static local_label_countT -local_label_counter[10]; - -static /* Returned to caller, then copied. */ - char symbol_name_build[12]; /* used for created names ("4f") */ - -#ifdef SUN_ASM_SYNTAX -int local_label_defined[10]; -#endif - - -void -symbol_begin() -{ - symbol_lastP = NULL; - symbol_rootP = NULL; /* In case we have 0 symbols (!!) */ - sy_hash = hash_new(); - bzero ((char *)(& abs_symbol), sizeof(abs_symbol)); - abs_symbol . sy_type = N_ABS; /* Can't initialise a union. Sigh. */ - bzero ((char *)(local_label_counter), sizeof(local_label_counter) ); - local_bss_counter = 0; -} - -/* - * local_label_name() - * - * Caller must copy returned name: we re-use the area for the next name. - */ - -char * /* Return local label name. */ -local_label_name(n, augend) - register int n; /* we just saw "n:", "nf" or "nb" : n a digit */ - register int augend; /* 0 for nb, 1 for n:, nf */ -{ - register char * p; - register char * q; - char symbol_name_temporary[10]; /* build up a number, BACKWARDS */ - - know( n >= 0 ); - know( augend == 0 || augend == 1 ); - p = symbol_name_build; - * p ++ = 'L'; - * p ++ = n + '0'; /* Make into ASCII */ - * p ++ = 1; /* ^A */ - n = local_label_counter [ n ] + augend; - /* version number of this local label */ - /* - * Next code just does sprintf( {}, "%d", n); - * It is more elegant to do the next part recursively, but a procedure - * call for each digit emitted is considered too costly. - */ - q = symbol_name_temporary; - for (*q++=0; n; q++) /* emits NOTHING if n starts as 0 */ - { - know(n>0); /* We expect n > 0 always */ - *q = n % 10 + '0'; - n /= 10; - } - while ( * p ++ = * -- q ) - { - } - /* The label, as a '\0' ended string, starts at symbol_name_build. */ - return (symbol_name_build); -} - - -void -local_colon (n) - int n; /* just saw "n:" */ -{ - local_label_counter [n] ++; -#ifdef SUN_ASM_SYNTAX - local_label_defined[n]=1; -#endif - colon (local_label_name (n, 0)); -} - -/* - * symbol_new() - * - * Return a pointer to a new symbol. - * Die if we can't make a new symbol. - * Fill in the symbol's values. - * Add symbol to end of symbol chain. - * - * - * Please always call this to create a new symbol. - * - * Changes since 1985: Symbol names may not contain '\0'. Sigh. - */ - -symbolS * -symbol_new (name, type, other, desc, value, frag) - char * name; /* We copy this: OK to alter your copy. */ - unsigned char type; /* As in <a.out.h>. */ - char other; /* As in <a.out.h>. */ - short int desc; /* As in <a.out.h>. */ - valueT value; /* As in <a.out.h>, often an address. */ - /* Often used as offset from frag address. */ - struct frag * frag; /* For sy_frag. */ -{ - register symbolS * symbolP; - register char * preserved_copy_of_name; - register unsigned int name_length; - char * p; - - name_length = strlen(name) + 1; - obstack_grow(¬es,name,name_length); - p=obstack_finish(¬es); - /* obstack_1done( ¬es, name, name_length, &p ); */ - preserved_copy_of_name = p; - p=obstack_alloc(¬es,sizeof(struct symbol)); - /* obstack_1blank( ¬es, sizeof(struct symbol), &p ); */ - symbolP = (symbolS *) p; - symbolP -> sy_name = preserved_copy_of_name; - symbolP -> sy_type = type; - symbolP -> sy_other = other; - symbolP -> sy_desc = desc; - symbolP -> sy_value = value; - symbolP -> sy_frag = frag; - symbolP -> sy_next = NULL; /* End of chain. */ - symbolP -> sy_forward = NULL; /* JF */ -#ifdef SUSPECT - symbolP -> sy_name_offset = ~ 0; /* Impossible offset catches errors. */ - symbolP -> sy_number = ~ 0; /* Ditto. */ -#endif - /* - * Link to end of symbol chain. - */ - if (symbol_lastP) - { - symbol_lastP -> sy_next = symbolP; - } - else - { - symbol_rootP = symbolP; - } - symbol_lastP = symbolP; - - return (symbolP); -} - -/* - * colon() - * - * We have just seen "<name>:". - * Creates a struct symbol unless it already exists. - * - * Gripes if we are redefining a symbol incompatibly (and ignores it). - * - */ -void -colon (sym_name) /* just seen "x:" - rattle symbols & frags */ - register char * sym_name; /* symbol name, as a cannonical string */ - /* We copy this string: OK to alter later. */ -{ - register struct symbol * symbolP; /* symbol we are working with */ - -#ifdef SUN_ASM_SYNTAX - /* Sun local labes go out of scope whenever a non-local symbol is - defined. */ - - if(*sym_name !='L') - bzero((void *)local_label_defined,sizeof(local_label_defined)); -#endif - -#ifndef WORKING_DOT_WORD - if(new_broken_words) { - struct broken_word *a; - int possible_bytes; - fragS *frag_tmp; - char *frag_opcode; - extern md_short_jump_size; - extern md_long_jump_size; - - possible_bytes=md_short_jump_size+new_broken_words*md_long_jump_size; - frag_tmp=frag_now; - frag_opcode=frag_var(rs_broken_word,possible_bytes,possible_bytes,(relax_substateT)0,(symbolS *)broken_words,(long int)0,(char *)0); - - /* We want to store the pointer to where to insert the jump table in the - fr_opcode of the rs_broken_word frag. This requires a little hackery */ - while(frag_tmp && (frag_tmp->fr_type!=rs_broken_word || frag_tmp->fr_opcode)) - frag_tmp=frag_tmp->fr_next; - know(frag_tmp); - frag_tmp->fr_opcode=frag_opcode; - new_broken_words = 0; - - for(a=broken_words;a && a->dispfrag==0;a=a->next_broken_word) - a->dispfrag=frag_tmp; - } -#endif - if (symbolP = symbol_table_lookup( sym_name )) - { -#ifdef VMS - /* - * If the new symbol is .comm AND it has a size of zero, - * we ignore it (i.e. the old symbol overrides it) - */ - if ((seg_N_TYPE [(int) now_seg] == (N_UNDF | N_EXT)) && - ((obstack_next_free(& frags) - frag_now -> fr_literal) == 0)) - return; - /* - * If the old symbol is .comm and it has a size of zero, - * we override it with the new symbol value. - */ - if ((symbolP -> sy_type == (N_UNDF | N_EXT)) && - (symbolP->sy_value == 0)) { - symbolP -> sy_frag = frag_now; - symbolP -> sy_other = const_flag; - symbolP -> sy_value = obstack_next_free(& frags) - frag_now -> fr_literal; - symbolP -> sy_type |= seg_N_TYPE [(int) now_seg]; /* keep N_EXT bit */ - return; - } -#endif /* VMS */ - /* - * Now check for undefined symbols - */ - if ((symbolP -> sy_type & N_TYPE) == N_UNDF) - { - if( symbolP -> sy_other == 0 - && symbolP -> sy_desc == 0 - && symbolP -> sy_value == 0) - { - symbolP -> sy_frag = frag_now; -#ifdef VMS - symbolP -> sy_other = const_flag; -#endif - symbolP -> sy_value = obstack_next_free(& frags) - frag_now -> fr_literal; - know( N_UNDF == 0 ); - symbolP -> sy_type |= seg_N_TYPE [(int) now_seg]; /* keep N_EXT bit */ - } - else - { -#ifdef VMS - /* - * There are still several cases to check: - * A .comm/.lcomm symbol being redefined as - * initialized data is OK - * A .comm/.lcomm symbol being redefined with - * a larger size is also OK - */ - char New_Type = seg_N_TYPE [(int) now_seg]; - if (((symbolP->sy_type == (N_UNDF | N_EXT)) || - (symbolP->sy_type == N_BSS)) && - (((New_Type & ~N_EXT) == N_DATA) || - (New_Type == symbolP->sy_type))) { - /* - * Select which of the 2 cases this is - */ - if (New_Type == symbolP->sy_type) { - /* - * If the new size is larger we just - * change its value. If the new size - * is smaller, we ignore this symbol - */ - if (symbolP->sy_value < - (obstack_next_free(& frags) - - frag_now -> fr_literal)) { - symbolP -> sy_value = - obstack_next_free(& frags) - - frag_now -> fr_literal; - } - } else { - /* - * It is a .comm/.lcomm being converted - * to initialized data. - */ - symbolP -> sy_frag = frag_now; - symbolP -> sy_other = const_flag; - symbolP -> sy_value = obstack_next_free(& frags) - frag_now -> fr_literal; - symbolP -> sy_type |= seg_N_TYPE [(int) now_seg]; /* keep N_EXT bit */ - } - } else { -#endif /* VMS */ - as_fatal( "Symbol \"%s\" is already defined as \"%s\"/%d.%d.%d.", - sym_name, - seg_name [(int) N_TYPE_seg [symbolP -> sy_type & N_TYPE]], - symbolP -> sy_other, symbolP -> sy_desc, - symbolP -> sy_value); -#ifdef VMS - } -#endif /* VMS */ - } - } - else - { - as_fatal("Symbol %s already defined.",sym_name); - } - } - else - { - symbolP = symbol_new (sym_name, - (unsigned char)(seg_N_TYPE [(int) now_seg]), -#ifdef VMS - const_flag, -#else - 0, -#endif - 0, - (valueT)(obstack_next_free(&frags)-frag_now->fr_literal), - frag_now); - symbol_table_insert (symbolP); - } -} - - -/* - * symbol_table_insert() - * - * Die if we can't insert the symbol. - * - */ - -void -symbol_table_insert (symbolP) - struct symbol * symbolP; -{ - register char * error_string; - - know( symbolP ); - know( symbolP -> sy_name ); - if ( * (error_string = hash_jam (sy_hash, symbolP -> sy_name, (char *)symbolP))) - { - as_fatal( "Inserting \"%s\" into symbol table failed: %s", - symbolP -> sy_name, error_string); - } -} - -/* - * symbol_find_or_make() - * - * If a symbol name does not exist, create it as undefined, and insert - * it into the symbol table. Return a pointer to it. - */ -symbolS * -symbol_find_or_make (name) - char * name; -{ - register symbolS * symbolP; - - symbolP = symbol_table_lookup (name); - if (symbolP == NULL) - { - symbolP = symbol_new (name, N_UNDF, 0, 0, 0, & zero_address_frag); - symbol_table_insert (symbolP); - } - return (symbolP); -} - -/* - * symbol_find() - * - * Implement symbol table lookup. - * In: A symbol's name as a string: '\0' can't be part of a symbol name. - * Out: NULL if the name was not in the symbol table, else the address - * of a struct symbol associated with that name. - */ - -symbolS * -symbol_find (name) - char * name; -{ - return ( (symbolS *) hash_find( sy_hash, name )); -} - - -/* end: symbols.c */ diff --git a/gnu/gas/symbols.h b/gnu/gas/symbols.h deleted file mode 100644 index 5a52790645bd..000000000000 --- a/gnu/gas/symbols.h +++ /dev/null @@ -1,42 +0,0 @@ -/* symbols.h - - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -extern struct obstack notes; /* eg FixS live here. */ - -#define symbol_table_lookup(name) ((symbolS *)(symbol_find (name))) - -extern unsigned int local_bss_counter; /* Zeroed before a pass. */ - /* Only used by .lcomm directive. */ - - -extern symbolS * symbol_rootP; /* all the symbol nodes */ -extern symbolS * symbol_lastP; /* last struct symbol we made, or NULL */ - -extern symbolS abs_symbol; - -symbolS * symbol_find(); -void symbol_begin(); -char * local_label_name(); -void local_colon(); -symbolS * symbol_new(); -void colon(); -void symbol_table_insert(); -symbolS * symbol_find_or_make(); - -/* end: symbols.h */ diff --git a/gnu/gas/version.c b/gnu/gas/version.c deleted file mode 100644 index f94d3f4721ee..000000000000 --- a/gnu/gas/version.c +++ /dev/null @@ -1,23 +0,0 @@ -#if defined(__STDC__) || defined(const) -const -#endif -char version_string[] = "GNU assembler version 1.38\n"; - -/* DO NOT PUT COMMENTS ABOUT CHANGES IN THIS FILE. - - This file exists only to define `version_string'. - - Log changes in ChangeLog. The easiest way to do this is with - the Emacs command `add-change-log-entry'. If you don't use Emacs, - add entries of the form: - -Thu Jan 1 00:00:00 1970 Dennis Ritchie (dmr at alice) - - * universe.c (temporal_reality): Began Time. -*/ - -#ifdef VMS -dummy3() -{ -} -#endif diff --git a/gnu/gas/write.c b/gnu/gas/write.c deleted file mode 100644 index a850555d8193..000000000000 --- a/gnu/gas/write.c +++ /dev/null @@ -1,1259 +0,0 @@ -/* write.c - emit .o file - Copyright(C)1986 Free Software Foundation, Inc. - Copyright (C) 1986,1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* - - Umm, with real good luck, this thing should be set up to do byteordering - correctly, but I may have managed to miss a place or two. Treat a.out - very carefully until you're SURE that it works. . . - - In order to cross-assemble the target machine must have an a.out header - similar to the one in a.out.h on THIS machine. Byteorder doesn't matter; - we take special care of it, but the numbers must be the same SIZE (# of - bytes) and in the same PLACE. If this is not true, you will have some - trouble. - */ - -#include "as.h" -#include "md.h" -#include "subsegs.h" -#include "obstack.h" -#include "struc-symbol.h" -#include "write.h" -#include "symbols.h" - -#ifdef SPARC -#include "sparc.h" -#endif -#ifdef I860 -#include "i860.h" -#endif - -void append(); - -#ifdef hpux -#define EXEC_MACHINE_TYPE HP9000S200_ID -#endif - -#ifdef DOT_LABEL_PREFIX -#define LOCAL_LABEL(name) (name[0] =='.' \ - && ( name [1] == 'L' || name [1] == '.' )) -#else /* not defined DOT_LABEL_PREFIX */ -#define LOCAL_LABEL(name) (name [0] == 'L' ) -#endif /* not defined DOT_LABEL_PREFIX */ - -/* - * In: length of relocation (or of address) in chars: 1, 2 or 4. - * Out: GNU LD relocation length code: 0, 1, or 2. - */ - -static unsigned char - -nbytes_r_length [] = { - 42, 0, 1, 42, 2 - }; - - -static struct frag * text_frag_root; -static struct frag * data_frag_root; - -static struct frag * text_last_frag; /* Last frag in segment. */ -static struct frag * data_last_frag; /* Last frag in segment. */ - -static struct exec the_exec; - -static long int string_byte_count; - -static char * the_object_file; - -#if !defined(SPARC) && !defined(I860) -static -#endif -char * next_object_file_charP; /* Tracks object file bytes. */ - -static long int size_of_the_object_file; /* # bytes in object file. */ - -/* static long int length; JF unused */ /* String length, including trailing '\0'. */ - -static void relax_segment(); -void emit_segment(); -static relax_addressT relax_align(); -static long int fixup_segment(); -#if !defined(SPARC) && !defined(I860) -static void emit_relocations(); -#endif -/* - * fix_new() - * - * Create a fixS in obstack 'notes'. - */ -void -#if defined(SPARC) || defined(I860) -fix_new (frag, where, size, add_symbol, sub_symbol, offset, pcrel, r_type) -#else -fix_new (frag, where, size, add_symbol, sub_symbol, offset, pcrel) -#endif - fragS * frag; /* Which frag? */ - int where; /* Where in that frag? */ - short int size; /* 1, 2 or 4 usually. */ - symbolS * add_symbol; /* X_add_symbol. */ - symbolS * sub_symbol; /* X_subtract_symbol. */ - long int offset; /* X_add_number. */ - int pcrel; /* TRUE if PC-relative relocation. */ -#if defined(SPARC) || defined(I860) - int r_type; -#endif -{ - register fixS * fixP; - - fixP = (fixS *)obstack_alloc(¬es,sizeof(fixS)); - - fixP -> fx_frag = frag; - fixP -> fx_where = where; - fixP -> fx_size = size; - fixP -> fx_addsy = add_symbol; - fixP -> fx_subsy = sub_symbol; - fixP -> fx_offset = offset; - fixP -> fx_pcrel = pcrel; - fixP -> fx_next = * seg_fix_rootP; - - /* JF these 'cuz of the NS32K stuff */ - fixP -> fx_im_disp = 0; - fixP -> fx_pcrel_adjust = 0; - fixP -> fx_bsr = 0; - fixP ->fx_bit_fixP = 0; - -#if defined(SPARC) || defined(I860) - fixP->fx_r_type = r_type; -#endif - - * seg_fix_rootP = fixP; -} - -void -write_object_file() -{ - register struct frchain * frchainP; /* Track along all frchains. */ - register fragS * fragP; /* Track along all frags. */ - register struct frchain * next_frchainP; - register fragS * * prev_fragPP; - register char * name; - register symbolS * symbolP; - register symbolS ** symbolPP; - /* register fixS * fixP; JF unused */ - unsigned - text_siz, - data_siz, - syms_siz, - tr_siz, - dr_siz; - void output_file_create(); - void output_file_append(); - void output_file_close(); -#ifdef DONTDEF - void gdb_emit(); - void gdb_end(); -#endif - extern long omagic; /* JF magic # to write out. Is different for - Suns and Vaxen and other boxes */ - -#ifdef VMS - /* - * Under VMS we try to be compatible with VAX-11 "C". Thus, we - * call a routine to check for the definition of the procedure - * "_main", and if so -- fix it up so that it can be program - * entry point. - */ - VMS_Check_For_Main(); -#endif /* VMS */ - /* - * After every sub-segment, we fake an ".align ...". This conforms to BSD4.2 - * brane-damage. We then fake ".fill 0" because that is the kind of frag - * that requires least thought. ".align" frags like to have a following - * frag since that makes calculating their intended length trivial. - */ -#define SUB_SEGMENT_ALIGN (2) - for ( frchainP=frchain_root; frchainP; frchainP=frchainP->frch_next ) - { -#ifdef VMS - /* - * Under VAX/VMS, the linker (and PSECT specifications) - * take care of correctly aligning the segments. - * Doing the alignment here (on initialized data) can - * mess up the calculation of global data PSECT sizes. - */ -#undef SUB_SEGMENT_ALIGN -#define SUB_SEGMENT_ALIGN ((frchainP->frch_seg != SEG_DATA) ? 2 : 0) -#endif /* VMS */ - subseg_new (frchainP -> frch_seg, frchainP -> frch_subseg); - frag_align (SUB_SEGMENT_ALIGN, 0); - /* frag_align will have left a new frag. */ - /* Use this last frag for an empty ".fill". */ - /* - * For this segment ... - * Create a last frag. Do not leave a "being filled in frag". - */ - frag_wane (frag_now); - frag_now -> fr_fix = 0; - know( frag_now -> fr_next == NULL ); - /* know( frags . obstack_c_base == frags . obstack_c_next_free ); */ - /* Above shows we haven't left a half-completed object on obstack. */ - } - - /* - * From now on, we don't care about sub-segments. - * Build one frag chain for each segment. Linked thru fr_next. - * We know that there is at least 1 text frchain & at least 1 data frchain. - */ - prev_fragPP = &text_frag_root; - for ( frchainP=frchain_root; frchainP; frchainP=next_frchainP ) - { - know( frchainP -> frch_root ); - * prev_fragPP = frchainP -> frch_root; - prev_fragPP = & frchainP -> frch_last -> fr_next; - if ( ((next_frchainP = frchainP->frch_next) == NULL) - || next_frchainP == data0_frchainP) - { - prev_fragPP = & data_frag_root; - if ( next_frchainP ) - { - text_last_frag = frchainP -> frch_last; - } - else - { - data_last_frag = frchainP -> frch_last; - } - } - } /* for(each struct frchain) */ - - /* - * We have two segments. If user gave -R flag, then we must put the - * data frags into the text segment. Do this before relaxing so - * we know to take advantage of -R and make shorter addresses. - */ - if ( flagseen [ 'R' ] ) - { - fixS *tmp; - - text_last_frag -> fr_next = data_frag_root; - text_last_frag = data_last_frag; - data_last_frag = NULL; - data_frag_root = NULL; - if(text_fix_root) { - for(tmp=text_fix_root;tmp->fx_next;tmp=tmp->fx_next) - ; - tmp->fx_next=data_fix_root; - } else - text_fix_root=data_fix_root; - data_fix_root=NULL; - } - - relax_segment (text_frag_root, SEG_TEXT); - relax_segment (data_frag_root, SEG_DATA); - /* - * Now the addresses of frags are correct within the segment. - */ - - know( text_last_frag -> fr_type == rs_fill && text_last_frag -> fr_offset == 0 ); - text_siz=text_last_frag->fr_address; -#ifdef SPARC - text_siz= (text_siz+7)&(~7); - text_last_frag->fr_address=text_siz; -#endif - md_number_to_chars((char *)&the_exec.a_text,text_siz, sizeof(the_exec.a_text)); - /* the_exec . a_text = text_last_frag -> fr_address; */ - - /* - * Join the 2 segments into 1 huge segment. - * To do this, re-compute every rn_address in the SEG_DATA frags. - * Then join the data frags after the text frags. - * - * Determine a_data [length of data segment]. - */ - if (data_frag_root) - { - register relax_addressT slide; - - know( text_last_frag -> fr_type == rs_fill && text_last_frag -> fr_offset == 0 ); - data_siz=data_last_frag->fr_address; -#ifdef SPARC - data_siz += (8 - (data_siz % 8)) % 8; - data_last_frag->fr_address = data_siz; -#endif - md_number_to_chars((char *)&the_exec.a_data,data_siz,sizeof(the_exec.a_data)); - /* the_exec . a_data = data_last_frag -> fr_address; */ - slide = text_siz; /* Address in file of the data segment. */ - for (fragP = data_frag_root; - fragP; - fragP = fragP -> fr_next) - { - fragP -> fr_address += slide; - } - know( text_last_frag ); - text_last_frag -> fr_next = data_frag_root; - } - else { - md_number_to_chars((char *)&the_exec.a_data,0,sizeof(the_exec.a_data)); - data_siz = 0; - } - - bss_address_frag . fr_address = text_siz + data_siz; -#ifdef SPARC - local_bss_counter=(local_bss_counter+7)&(~7); -#endif - md_number_to_chars((char *)&the_exec.a_bss,local_bss_counter,sizeof(the_exec.a_bss)); - - - /* - * - * Crawl the symbol chain. - * - * For each symbol whose value depends on a frag, take the address of - * that frag and subsume it into the value of the symbol. - * After this, there is just one way to lookup a symbol value. - * Values are left in their final state for object file emission. - * We adjust the values of 'L' local symbols, even if we do - * not intend to emit them to the object file, because their values - * are needed for fix-ups. - * - * Unless we saw a -L flag, remove all symbols that begin with 'L' - * from the symbol chain. - * - * Count the (length of the nlists of the) (remaining) symbols. - * Assign a symbol number to each symbol. - * Count the number of string-table chars we will emit. - * - */ - know( zero_address_frag . fr_address == 0 ); - string_byte_count = sizeof( string_byte_count ); - - /* JF deal with forward references first. . . */ - for(symbolP=symbol_rootP;symbolP;symbolP=symbolP->sy_next) { - if(symbolP->sy_forward) { - symbolP->sy_value+=symbolP->sy_forward->sy_value+symbolP->sy_forward->sy_frag->fr_address; - symbolP->sy_forward=0; - } - } - symbolPP = & symbol_rootP; /* -> last symbol chain link. */ - { - register long int symbol_number; - - symbol_number = 0; - while (symbolP = * symbolPP) - { - name = symbolP -> sy_name; - if(flagseen['R'] && (symbolP->sy_nlist.n_type&N_DATA)) { - symbolP->sy_nlist.n_type&= ~N_DATA; - symbolP->sy_nlist.n_type|= N_TEXT; - } - /* if(symbolP->sy_forward) { - symbolP->sy_value += symbolP->sy_forward->sy_value + symbolP->sy_forward->sy_frag->fr_address; - } */ - - symbolP -> sy_value += symbolP -> sy_frag -> fr_address; - /* JF the 128 bit is a hack so stabs like - "LET_STMT:23. . ." don't go away */ - /* CPH: 128 bit hack is moby loser. N_SO for file "Lower.c" - fell through the cracks. I think that N_STAB should be - used instead of 128. */ - /* JF the \001 bit is to make sure that local labels - ( 1: - 9: don't make it into the symtable either */ -#ifndef VMS /* Under VMS we need to keep local symbols */ - if ( !name || (symbolP->sy_nlist.n_type&N_STAB) - || (name[2]!='\001' && (flagseen ['L'] || ! LOCAL_LABEL(name) ))) -#endif /* not VMS */ - { - symbolP -> sy_number = symbol_number ++; -#ifndef VMS - if (name) - { /* Ordinary case. */ - symbolP -> sy_name_offset = string_byte_count; - string_byte_count += strlen (symbolP -> sy_name) + 1; - } - else /* .Stabd case. */ -#endif /* not VMS */ - symbolP -> sy_name_offset = 0; - symbolPP = & (symbolP -> sy_next); - } -#ifndef VMS - else - * symbolPP = symbolP -> sy_next; -#endif /* not VMS */ - } /* for each symbol */ - - syms_siz = sizeof( struct nlist) * symbol_number; - md_number_to_chars((char *)&the_exec.a_syms,syms_siz,sizeof(the_exec.a_syms)); - /* the_exec . a_syms = sizeof( struct nlist) * symbol_number; */ - } - - /* - * Addresses of frags now reflect addresses we use in the object file. - * Symbol values are correct. - * Scan the frags, converting any ".org"s and ".align"s to ".fill"s. - * Also converting any machine-dependent frags using md_convert_frag(); - */ - subseg_change( SEG_TEXT, 0); - - for (fragP = text_frag_root; fragP; fragP = fragP -> fr_next) - { - switch (fragP -> fr_type) - { - case rs_align: - case rs_org: - fragP -> fr_type = rs_fill; - know( fragP -> fr_var == 1 ); - know( fragP -> fr_next ); - fragP -> fr_offset - = fragP -> fr_next -> fr_address - - fragP -> fr_address - - fragP -> fr_fix; - break; - - case rs_fill: - break; - - case rs_machine_dependent: - md_convert_frag (fragP); - /* - * After md_convert_frag, we make the frag into a ".space 0". - * Md_convert_frag() should set up any fixSs and constants - * required. - */ - frag_wane (fragP); - break; - -#ifndef WORKING_DOT_WORD - case rs_broken_word: - { - struct broken_word *lie; - extern md_short_jump_size; - extern md_long_jump_size; - - if(fragP->fr_subtype) { - fragP->fr_fix+=md_short_jump_size; - for(lie=(struct broken_word *)(fragP->fr_symbol);lie && lie->dispfrag==fragP;lie=lie->next_broken_word) - if(lie->added==1) - fragP->fr_fix+=md_long_jump_size; - } - frag_wane(fragP); - } - break; -#endif - - default: - BAD_CASE( fragP -> fr_type ); - break; - } /* switch (fr_type) */ - } /* for each frag. */ - -#ifndef WORKING_DOT_WORD - { - struct broken_word *lie; - struct broken_word **prevP; - - prevP= &broken_words; - for(lie=broken_words; lie; lie=lie->next_broken_word) - if(!lie->added) { -#if defined(SPARC) || defined(I860) - fix_new( lie->frag, lie->word_goes_here - lie->frag->fr_literal, - 2, lie->add, - lie->sub, lie->addnum, - 0, NO_RELOC); -#endif -#ifdef NS32K - fix_new_ns32k(lie->frag, - lie->word_goes_here - lie->frag->fr_literal, - 2, - lie->add, - lie->sub, - lie->addnum, - 0, 0, 2, 0, 0); -#endif -#if !defined(SPARC) && !defined(NS32K) && !defined(I860) - fix_new( lie->frag, lie->word_goes_here - lie->frag->fr_literal, - 2, lie->add, - lie->sub, lie->addnum, - 0); -#endif - /* md_number_to_chars(lie->word_goes_here, - lie->add->sy_value - + lie->addnum - - (lie->sub->sy_value), - 2); */ - *prevP=lie->next_broken_word; - } else - prevP= &(lie->next_broken_word); - - for(lie=broken_words;lie;) { - struct broken_word *untruth; - char *table_ptr; - long table_addr; - long from_addr, - to_addr; - int n, - m; - - extern md_short_jump_size; - extern md_long_jump_size; - void md_create_short_jump(); - void md_create_long_jump(); - - - - fragP=lie->dispfrag; - - /* Find out how many broken_words go here */ - n=0; - for(untruth=lie;untruth && untruth->dispfrag==fragP;untruth=untruth->next_broken_word) - if(untruth->added==1) - n++; - - table_ptr=lie->dispfrag->fr_opcode; - table_addr=lie->dispfrag->fr_address+(table_ptr - lie->dispfrag->fr_literal); - /* Create the jump around the long jumps */ - /* This is a short jump from table_ptr+0 to table_ptr+n*long_jump_size */ - from_addr=table_addr; - to_addr = table_addr + md_short_jump_size + n * md_long_jump_size; - md_create_short_jump(table_ptr,from_addr,to_addr,lie->dispfrag,lie->add); - table_ptr+=md_short_jump_size; - table_addr+=md_short_jump_size; - - for(m=0;lie && lie->dispfrag==fragP;m++,lie=lie->next_broken_word) { - if(lie->added==2) - continue; - /* Patch the jump table */ - /* This is the offset from ??? to table_ptr+0 */ - to_addr = table_addr - - (lie->sub->sy_value); - md_number_to_chars(lie->word_goes_here,to_addr,2); - for(untruth=lie->next_broken_word;untruth && untruth->dispfrag==fragP;untruth=untruth->next_broken_word) { - if(untruth->use_jump==lie) - md_number_to_chars(untruth->word_goes_here,to_addr,2); - } - - /* Install the long jump */ - /* this is a long jump from table_ptr+0 to the final target */ - from_addr=table_addr; - to_addr=lie->add->sy_value+lie->addnum; - md_create_long_jump(table_ptr,from_addr,to_addr,lie->dispfrag,lie->add); - table_ptr+=md_long_jump_size; - table_addr+=md_long_jump_size; - } - } - } -#endif -#ifndef VMS - /* - * Scan every FixS performing fixups. We had to wait until now to do - * this because md_convert_frag() may have made some fixSs. - */ - /* the_exec . a_trsize - = sizeof(struct relocation_info) * fixup_segment (text_fix_root, N_TEXT); - the_exec . a_drsize - = sizeof(struct relocation_info) * fixup_segment (data_fix_root, N_DATA); */ - - tr_siz=sizeof(struct relocation_info) * fixup_segment (text_fix_root, N_TEXT); - md_number_to_chars((char *)&the_exec.a_trsize, tr_siz ,sizeof(the_exec.a_trsize)); - dr_siz=sizeof(struct relocation_info) * fixup_segment (data_fix_root, N_DATA); - md_number_to_chars((char *)&the_exec.a_drsize, dr_siz, sizeof(the_exec.a_drsize)); - md_number_to_chars((char *)&the_exec.a_info,omagic,sizeof(the_exec.a_info)); - md_number_to_chars((char *)&the_exec.a_entry,0,sizeof(the_exec.a_entry)); - -#ifdef EXEC_MACHINE_TYPE - md_number_to_chars((char *)&the_exec.a_machtype, EXEC_MACHINE_TYPE, sizeof(the_exec.a_machtype)); -#endif -#ifdef EXEC_VERSION - md_number_to_chars((char *)&the_exec.a_version,EXEC_VERSION,sizeof(the_exec.a_version)); -#endif - - /* the_exec . a_entry = 0; */ - - size_of_the_object_file = - sizeof( the_exec ) + - text_siz + - data_siz + - syms_siz + - tr_siz + - dr_siz + - string_byte_count; - - next_object_file_charP - = the_object_file - = xmalloc ( size_of_the_object_file ); - - output_file_create (out_file_name); - - append (& next_object_file_charP, (char *)(&the_exec), (unsigned long)sizeof(the_exec)); - - /* - * Emit code. - */ - for (fragP = text_frag_root; fragP; fragP = fragP -> fr_next) - { - register long int count; - register char * fill_literal; - register long int fill_size; - - know( fragP -> fr_type == rs_fill ); - append (& next_object_file_charP, fragP -> fr_literal, (unsigned long)fragP -> fr_fix); - fill_literal= fragP -> fr_literal + fragP -> fr_fix; - fill_size = fragP -> fr_var; - know( fragP -> fr_offset >= 0 ); - for (count = fragP -> fr_offset; count; count --) - append (& next_object_file_charP, fill_literal, (unsigned long)fill_size); - } /* for each code frag. */ - - /* - * Emit relocations. - */ - emit_relocations (text_fix_root, (relax_addressT)0); - emit_relocations (data_fix_root, text_last_frag -> fr_address); - /* - * Emit all symbols left in the symbol chain. - * Any symbol still undefined is made N_EXT. - */ - for ( symbolP = symbol_rootP; symbolP; symbolP = symbolP -> sy_next ) - { - register char * temp; - - temp = symbolP -> sy_nlist . n_un . n_name; - /* JF fix the numbers up. Call by value RULES! */ - md_number_to_chars((char *)&(symbolP -> sy_nlist . n_un . n_strx ),symbolP -> sy_name_offset,sizeof(symbolP -> sy_nlist . n_un . n_strx )); - md_number_to_chars((char *)&(symbolP->sy_nlist.n_desc),symbolP->sy_nlist.n_desc,sizeof(symbolP -> sy_nlist . n_desc)); - md_number_to_chars((char *)&(symbolP->sy_nlist.n_value),symbolP->sy_nlist.n_value,sizeof(symbolP->sy_nlist.n_value)); - /* symbolP -> sy_nlist . n_un . n_strx = symbolP -> sy_name_offset; JF replaced by md above */ - if (symbolP -> sy_type == N_UNDF) - symbolP -> sy_type |= N_EXT; /* Any undefined symbols become N_EXT. */ - append (& next_object_file_charP, (char *)(& symbolP -> sy_nlist), - (unsigned long)sizeof(struct nlist)); - symbolP -> sy_nlist . n_un . n_name = temp; - } /* for each symbol */ - - /* - * next_object_file_charP -> slot for next object byte. - * Emit strings. - * Find strings by crawling along symbol table chain. - */ -/* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */ - md_number_to_chars((char *)&string_byte_count, string_byte_count, sizeof(string_byte_count)); - - append (& next_object_file_charP, (char *)&string_byte_count, (unsigned long)sizeof(string_byte_count)); - for ( symbolP = symbol_rootP; symbolP; symbolP = symbolP -> sy_next ) - { - if (symbolP -> sy_name) - { /* Ordinary case: not .stabd. */ - append (& next_object_file_charP, symbolP -> sy_name, - (unsigned long)(strlen (symbolP -> sy_name) + 1)); - } - } /* for each symbol */ - - know( next_object_file_charP == the_object_file + size_of_the_object_file ); - - output_file_append (the_object_file, size_of_the_object_file, out_file_name); - -#ifdef DONTDEF - if (flagseen['G']) /* GDB symbol file to be appended? */ - { - gdb_emit (out_file_name); - gdb_end (); - } -#endif - - output_file_close (out_file_name); -#else /* VMS */ - /* - * Now do the VMS-dependent part of writing the object file - */ - VMS_write_object_file(text_siz, data_siz, text_frag_root, data_frag_root); -#endif /* VMS */ -} /* write_object_file() */ - -/* - * relax_segment() - * - * Now we have a segment, not a crowd of sub-segments, we can make fr_address - * values. - * - * Relax the frags. - * - * After this, all frags in this segment have addresses that are correct - * within the segment. Since segments live in different file addresses, - * these frag addresses may not be the same as final object-file addresses. - */ -#ifndef VMS -static -#endif /* not VMS */ -void -relax_segment (segment_frag_root, segment_type) - struct frag * segment_frag_root; - segT segment_type; /* N_DATA or N_TEXT */ -{ - register struct frag * fragP; - register relax_addressT address; - /* register relax_addressT old_address; JF unused */ - /* register relax_addressT new_address; JF unused */ - - know( segment_type == SEG_DATA || segment_type == SEG_TEXT ); - - /* In case md_estimate_size_before_relax() wants to make fixSs. */ - subseg_change (segment_type, 0); - - /* - * For each frag in segment: count and store (a 1st guess of) fr_address. - */ - address = 0; - for ( fragP = segment_frag_root; fragP; fragP = fragP -> fr_next ) - { - fragP -> fr_address = address; - address += fragP -> fr_fix; - switch (fragP -> fr_type) - { - case rs_fill: - address += fragP -> fr_offset * fragP -> fr_var; - break; - - case rs_align: - address += relax_align (address, fragP -> fr_offset); - break; - - case rs_org: - /* - * Assume .org is nugatory. It will grow with 1st relax. - */ - break; - - case rs_machine_dependent: - address += md_estimate_size_before_relax - (fragP, seg_N_TYPE [(int) segment_type]); - break; - -#ifndef WORKING_DOT_WORD - /* Broken words don't concern us yet */ - case rs_broken_word: - break; -#endif - - default: - BAD_CASE( fragP -> fr_type ); - break; - } /* switch(fr_type) */ - } /* for each frag in the segment */ - - /* - * Do relax(). - */ - { - register long int stretch; /* May be any size, 0 or negative. */ - /* Cumulative number of addresses we have */ - /* relaxed this pass. */ - /* We may have relaxed more than one address. */ - register long int stretched; /* Have we stretched on this pass? */ - /* This is 'cuz stretch may be zero, when, - in fact some piece of code grew, and - another shrank. If a branch instruction - doesn't fit anymore, we could be scrod */ - - do - { - stretch = stretched = 0; - for (fragP = segment_frag_root; fragP; fragP = fragP -> fr_next) - { - register long int growth; - register long int was_address; - /* register long int var; */ - register long int offset; - register symbolS * symbolP; - register long int target; - register long int after; - register long int aim; - - was_address = fragP -> fr_address; - address = fragP -> fr_address += stretch; - symbolP = fragP -> fr_symbol; - offset = fragP -> fr_offset; - /* var = fragP -> fr_var; */ - switch (fragP -> fr_type) - { - case rs_fill: /* .fill never relaxes. */ - growth = 0; - break; - -#ifndef WORKING_DOT_WORD - /* JF: This is RMS's idea. I do *NOT* want to be blamed - for it I do not want to write it. I do not want to have - anything to do with it. This is not the proper way to - implement this misfeature. */ - case rs_broken_word: - { - struct broken_word *lie; - struct broken_word *untruth; - extern int md_short_jump_size; - extern int md_long_jump_size; - - /* Yes this is ugly (storing the broken_word pointer - in the symbol slot). Still, this whole chunk of - code is ugly, and I don't feel like doing anything - about it. Think of it as stubbornness in action */ - growth=0; - for(lie=(struct broken_word *)(fragP->fr_symbol); - lie && lie->dispfrag==fragP; - lie=lie->next_broken_word) { - - if(lie->added) - continue; - offset= lie->add->sy_frag->fr_address+lie->add->sy_value + lie->addnum - - (lie->sub->sy_frag->fr_address+lie->sub->sy_value); - if(offset<=-32768 || offset>=32767) { - if(flagseen['k']) - as_warn(".word %s-%s+%ld didn't fit",lie->add->sy_name,lie->sub->sy_name,lie->addnum); - lie->added=1; - if(fragP->fr_subtype==0) { - fragP->fr_subtype++; - growth+=md_short_jump_size; - } - for(untruth=lie->next_broken_word;untruth && untruth->dispfrag==lie->dispfrag;untruth=untruth->next_broken_word) - if(untruth->add->sy_frag==lie->add->sy_frag && untruth->add->sy_value==lie->add->sy_value) { - untruth->added=2; - untruth->use_jump=lie; - } - growth+=md_long_jump_size; - } - } - } - break; -#endif - case rs_align: - growth = relax_align ((relax_addressT)(address + fragP -> fr_fix), offset) - - relax_align ((relax_addressT)(was_address + fragP -> fr_fix), offset); - break; - - case rs_org: - target = offset; - if (symbolP) - { - know( ((symbolP -> sy_type & N_TYPE) == N_ABS) || ((symbolP -> sy_type & N_TYPE) == N_DATA) || ((symbolP -> sy_type & N_TYPE) == N_TEXT)); - know( symbolP -> sy_frag ); - know( (symbolP->sy_type&N_TYPE)!=N_ABS || symbolP->sy_frag==&zero_address_frag ); - target += - symbolP -> sy_value - + symbolP -> sy_frag -> fr_address; - } - know( fragP -> fr_next ); - after = fragP -> fr_next -> fr_address; - growth = ((target - after ) > 0) ? (target - after) : 0; - /* Growth may be -ve, but variable part */ - /* of frag cannot have < 0 chars. */ - /* That is, we can't .org backwards. */ - - growth -= stretch; /* This is an absolute growth factor */ - break; - - case rs_machine_dependent: - { - register const relax_typeS * this_type; - register const relax_typeS * start_type; - register relax_substateT next_state; - register relax_substateT this_state; - - start_type = this_type - = md_relax_table + (this_state = fragP -> fr_subtype); - target = offset; - if (symbolP) - { - know( ((symbolP -> sy_type & N_TYPE) == N_ABS) || ((symbolP -> sy_type & - N_TYPE) == N_DATA) || ((symbolP -> sy_type & N_TYPE) == N_TEXT)); - know( symbolP -> sy_frag ); - know( (symbolP->sy_type&N_TYPE)!=N_ABS || symbolP->sy_frag==&zero_address_frag ); - target += - symbolP -> sy_value - + symbolP -> sy_frag -> fr_address; - - /* If frag has yet to be reached on this pass, - assume it will move by STRETCH just as we did. - If this is not so, it will be because some frag - between grows, and that will force another pass. */ - - /* JF was just address */ - /* JF also added is_dnrange hack */ - /* There's gotta be a better/faster/etc way - to do this. . . */ - /* gnu@cygnus.com: I changed this from > to >= - because I ran into a zero-length frag (fr_fix=0) - which was created when the obstack needed a new - chunk JUST AFTER the opcode of a branch. Since - fr_fix is zero, fr_address of this frag is the same - as fr_address of the next frag. This - zero-length frag was variable and jumped to .+2 - (in the next frag), but since the > comparison - below failed (the two were =, not >), "stretch" - was not added to the target. Stretch was 178, so - the offset appeared to be .-176 instead, which did - not fit into a byte branch, so the assembler - relaxed the branch to a word. This didn't compare - with what happened when the same source file was - assembled on other machines, which is how I found it. - You might want to think about what other places have - trouble with zero length frags... */ - - if (symbolP->sy_frag->fr_address >= was_address && is_dnrange(fragP,symbolP->sy_frag)) - target += stretch; - - } - aim = target - address - fragP -> fr_fix; - /* The displacement is affected by the instruction size - * for the 32k architecture. I think we ought to be able - * to add fragP->fr_pcrel_adjust in all cases (it should be - * zero if not used), but just in case it breaks something - * else we'll put this inside #ifdef NS32K ... #endif - */ -#ifdef NS32K - aim += fragP->fr_pcrel_adjust; -#endif - - if (aim < 0) - { - /* Look backwards. */ - for (next_state = this_type -> rlx_more; next_state; ) - { - if (aim >= this_type -> rlx_backward) - next_state = 0; - else - { /* Grow to next state. */ - this_type = md_relax_table + (this_state = next_state); - next_state = this_type -> rlx_more; - } - } - } - else - { -#ifdef DONTDEF -/* JF these next few lines of code are for the mc68020 which can't handle short - offsets of zero in branch instructions. What a kludge! */ - if(aim==0 && this_state==(1<<2+0)) { /* FOO hard encoded from m.c */ - aim=this_type->rlx_forward+1; /* Force relaxation into word mode */ - } -#endif -/* JF end of 68020 code */ - /* Look forwards. */ - for (next_state = this_type -> rlx_more; next_state; ) - { - if (aim <= this_type -> rlx_forward) - next_state = 0; - else - { /* Grow to next state. */ - this_type = md_relax_table + (this_state = next_state); - next_state = this_type -> rlx_more; - } - } - } - if (growth = this_type -> rlx_length - start_type -> rlx_length) - fragP -> fr_subtype = this_state; - } - break; - - default: - BAD_CASE( fragP -> fr_type ); - break; - } - if(growth) { - stretch += growth; - stretched++; - } - } /* For each frag in the segment. */ - } while (stretched); /* Until nothing further to relax. */ - } - - /* - * We now have valid fr_address'es for each frag. - */ - - /* - * All fr_address's are correct, relative to their own segment. - * We have made all the fixS we will ever make. - */ -} /* relax_segment() */ - -/* - * Relax_align. Advance location counter to next address that has 'alignment' - * lowest order bits all 0s. - */ - -static relax_addressT /* How many addresses does the .align take? */ -relax_align (address, alignment) - register relax_addressT address; /* Address now. */ - register long int alignment; /* Alignment (binary). */ -{ - relax_addressT mask; - relax_addressT new_address; - - mask = ~ ( (~0) << alignment ); - new_address = (address + mask) & (~ mask); - return (new_address - address); -} - -/* - * fixup_segment() - */ -static long int -fixup_segment (fixP, this_segment_type) - register fixS * fixP; - int this_segment_type; /* N_TYPE bits for segment. */ -{ - register long int seg_reloc_count; - /* JF these all used to be local to the for loop, but GDB doesn't seem to be able to deal with them there, so I moved them here for a bit. */ - register symbolS * add_symbolP; - register symbolS * sub_symbolP; - register long int add_number; - register int size; - register char * place; - register long int where; - register char pcrel; - register fragS * fragP; - register int add_symbol_N_TYPE; - - - seg_reloc_count = 0; - for ( ; fixP; fixP = fixP -> fx_next) - { - fragP = fixP -> fx_frag; - know( fragP ); - where = fixP -> fx_where; - place = fragP -> fr_literal + where; - size = fixP -> fx_size; - add_symbolP = fixP -> fx_addsy; - sub_symbolP = fixP -> fx_subsy; - add_number = fixP -> fx_offset; - pcrel = fixP -> fx_pcrel; - if(add_symbolP) - add_symbol_N_TYPE = add_symbolP -> sy_type & N_TYPE; - if (sub_symbolP) - { - if(!add_symbolP) /* Its just -sym */ - { - if(sub_symbolP->sy_type!=N_ABS) - as_warn("Negative of non-absolute symbol %s", sub_symbolP->sy_name); - add_number-=sub_symbolP->sy_value; - } - else if ( ((sub_symbolP -> sy_type ^ add_symbol_N_TYPE) & N_TYPE) == 0 - && ( add_symbol_N_TYPE == N_DATA - || add_symbol_N_TYPE == N_TEXT - || add_symbol_N_TYPE == N_BSS - || add_symbol_N_TYPE == N_ABS)) - { - /* Difference of 2 symbols from same segment. */ - /* Can't make difference of 2 undefineds: 'value' means */ - /* something different for N_UNDF. */ - add_number += add_symbolP -> sy_value - sub_symbolP -> sy_value; - add_symbolP = NULL; - fixP -> fx_addsy = NULL; - } - else - { - /* Different segments in subtraction. */ - know( sub_symbolP -> sy_type != (N_ABS | N_EXT)) - if (sub_symbolP -> sy_type == N_ABS) - add_number -= sub_symbolP -> sy_value; - else - { - as_warn("Can't emit reloc {- %s-seg symbol \"%s\"} @ file address %d.", - seg_name[(int)N_TYPE_seg[sub_symbolP->sy_type&N_TYPE]], - sub_symbolP -> sy_name, fragP -> fr_address + where); - } - } - } - if (add_symbolP) - { - if (add_symbol_N_TYPE == this_segment_type && pcrel) - { - /* - * This fixup was made when the symbol's segment was - * SEG_UNKNOWN, but it is now in the local segment. - * So we know how to do the address without relocation. - */ - add_number += add_symbolP -> sy_value; - add_number -= -#ifndef NS32K - size + -#endif - where + fragP -> fr_address; -#if defined(NS32K) && defined(SEQUENT_COMPATABILITY) - if (fragP->fr_bsr) - add_number -= 0x12; /* FOO Kludge alert! */ -#endif - /* Kenny thinks this needs * - /* add_number +=size-2; */ - pcrel = 0; /* Lie. Don't want further pcrel processing. */ - fixP -> fx_addsy = NULL; /* No relocations please. */ - /* - * It would be nice to check that the address does not overflow. - * I didn't do this check because: - * + It is machine dependent in the general case (eg 32032) - * + Compiler output will never need this checking, so why - * slow down the usual case? - */ - } - else - { - switch (add_symbol_N_TYPE) - { - case N_ABS: - add_number += add_symbolP -> sy_value; - fixP -> fx_addsy = NULL; - add_symbolP = NULL; - break; - - case N_BSS: - case N_DATA: - case N_TEXT: - seg_reloc_count ++; - add_number += add_symbolP -> sy_value; - break; - - case N_UNDF: - seg_reloc_count ++; - break; - - default: - BAD_CASE( add_symbol_N_TYPE ); - break; - } /* switch on symbol seg */ - } /* if not in local seg */ - } /* if there was a + symbol */ - if (pcrel) - { - add_number -= -#ifndef NS32K - size + -#endif - where + fragP -> fr_address; - if (add_symbolP == 0) - { - fixP -> fx_addsy = & abs_symbol; - seg_reloc_count ++; - } - } - /* OVE added fx_im_disp for ns32k and others */ - if (!fixP->fx_bit_fixP) { - /* JF I hope this works . . . */ - if((size==1 && (add_number& ~0xFF) && (add_number&~0xFF!=(-1&~0xFF))) || - (size==2 && (add_number& ~0xFFFF) && (add_number&~0xFFFF!=(-1&~0xFFFF)))) - as_warn("Fixup of %d too large for field width of %d",add_number, size); - - switch (fixP->fx_im_disp) { - case 0: -#if defined(SPARC) || defined(I860) - fixP->fx_addnumber = add_number; - md_number_to_imm(place, add_number, size, fixP, this_segment_type); -#else - md_number_to_imm (place, add_number, size); - /* OVE: the immediates, like disps, have lsb at lowest address */ -#endif - break; - case 1: - md_number_to_disp (place, - fixP->fx_pcrel ? add_number+fixP->fx_pcrel_adjust:add_number, - size); - break; - case 2: /* fix requested for .long .word etc */ - md_number_to_chars (place, add_number, size); - break; - default: - as_fatal("Internal error in write.c in fixup_segment"); - } /* OVE: maybe one ought to put _imm _disp _chars in one md-func */ - } else { - md_number_to_field (place, add_number, fixP->fx_bit_fixP); - } - } /* For each fixS in this segment. */ - return (seg_reloc_count); -} /* fixup_segment() */ - - -/* The sparc needs its own emit_relocations() */ -#if !defined(SPARC) && !defined(I860) -/* - * emit_relocations() - * - * Crawl along a fixS chain. Emit the segment's relocations. - */ -static void -emit_relocations (fixP, segment_address_in_file) - register fixS * fixP; /* Fixup chain for this segment. */ - relax_addressT segment_address_in_file; -{ - struct relocation_info ri; - register symbolS * symbolP; - - /* JF this is for paranoia */ - bzero((char *)&ri,sizeof(ri)); - for ( ; fixP; fixP = fixP -> fx_next) - { - if (symbolP = fixP -> fx_addsy) - { - -#ifdef NS32K - /* These two 'cuz of NS32K */ - ri . r_bsr = fixP -> fx_bsr; - ri . r_disp = fixP -> fx_im_disp; -#endif - - ri . r_length = nbytes_r_length [fixP -> fx_size]; - ri . r_pcrel = fixP -> fx_pcrel; - ri . r_address = fixP -> fx_frag -> fr_address - + fixP -> fx_where - - segment_address_in_file; - if ((symbolP -> sy_type & N_TYPE) == N_UNDF) - { - ri . r_extern = 1; - ri . r_symbolnum = symbolP -> sy_number; - } - else - { - ri . r_extern = 0; - ri . r_symbolnum = symbolP -> sy_type & N_TYPE; - } - - /* - The 68k machines assign bit-fields from higher bits to - lower bits ("left-to-right") within the int. VAXen assign - bit-fields from lower bits to higher bits ("right-to-left"). - Both handle multi-byte numbers in their usual fashion - (Big-endian and little-endian stuff). - Thus we need a machine dependent routine to make - sure the structure is written out correctly. FUN! - */ - md_ri_to_chars((char *) &ri, ri); - append (&next_object_file_charP, (char *)& ri, (unsigned long)sizeof(ri)); - } - } - -} -#endif - -int -is_dnrange(f1,f2) -struct frag *f1,*f2; -{ - while(f1) { - if(f1->fr_next==f2) - return 1; - f1=f1->fr_next; - } - return 0; -} -/* End: as-write.c */ diff --git a/gnu/gas/write.h b/gnu/gas/write.h deleted file mode 100644 index 73276908afd4..000000000000 --- a/gnu/gas/write.h +++ /dev/null @@ -1,77 +0,0 @@ -/* write.h -> write.c - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* The bit_fix was implemented to support machines that need variables - to be inserted in bitfields other than 1, 2 and 4 bytes. - Furthermore it gives us a possibillity to mask in bits in the symbol - when it's fixed in the objectcode and check the symbols limits. - - The or-mask is used to set the huffman bits in displacements for the - ns32k port. - The acbi, addqi, movqi, cmpqi instruction requires an assembler that - can handle bitfields. Ie handle an expression, evaluate it and insert - the result in an some bitfield. ( ex: 5 bits in a short field of a opcode) - */ - - -struct bit_fix { - int fx_bit_size; /* Length of bitfield */ - int fx_bit_offset; /* Bit offset to bitfield */ - long fx_bit_base; /* Where do we apply the bitfix. - If this is zero, default is assumed. */ - long fx_bit_base_adj;/* Adjustment of base */ - long fx_bit_max; /* Signextended max for bitfield */ - long fx_bit_min; /* Signextended min for bitfield */ - long fx_bit_add; /* Or mask, used for huffman prefix */ -}; -typedef struct bit_fix bit_fixS; -/* - * FixSs may be built up in any order. - */ - -struct fix -{ - fragS * fx_frag; /* Which frag? */ - long int fx_where; /* Where is the 1st byte to fix up? */ - symbolS * fx_addsy; /* NULL or Symbol whose value we add in. */ - symbolS * fx_subsy; /* NULL or Symbol whose value we subtract. */ - long int fx_offset; /* Absolute number we add in. */ - struct fix * fx_next; /* NULL or -> next fixS. */ - short int fx_size; /* How many bytes are involved? */ - char fx_pcrel; /* TRUE: pc-relative. */ - char fx_pcrel_adjust;/* pc-relative offset adjust */ - char fx_im_disp; /* TRUE: value is a displacement */ - bit_fixS * fx_bit_fixP; /* IF NULL no bitfix's to do */ - char fx_bsr; /* sequent-hack */ -#if defined(SPARC) || defined(I860) - char fx_r_type; /* Sparc hacks */ - long fx_addnumber; -#endif -}; - -typedef struct fix fixS; - - -COMMON fixS * text_fix_root; /* Chains fixSs. */ -COMMON fixS * data_fix_root; /* Chains fixSs. */ -COMMON fixS ** seg_fix_rootP; /* -> one of above. */ - -bit_fixS *bit_fix_new(); -/* end: write.h */ - diff --git a/gnu/gas/xmalloc.c b/gnu/gas/xmalloc.c deleted file mode 100644 index 78c8c7f8c4a9..000000000000 --- a/gnu/gas/xmalloc.c +++ /dev/null @@ -1,60 +0,0 @@ -/* xmalloc.c - get memory or bust - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* -NAME - xmalloc() - get memory or bust -INDEX - xmalloc() uses malloc() - -SYNOPSIS - char * my_memory; - - my_memory = xmalloc(42); / * my_memory gets address of 42 chars * / - -DESCRIPTION - - Use xmalloc() as an "error-free" malloc(). It does almost the same job. - When it cannot honour your request for memory it BOMBS your program - with a "virtual memory exceeded" message. Malloc() returns NULL and - does not bomb your program. - -SEE ALSO - malloc() - -*/ -#ifdef USG -#include <malloc.h> -#endif - -char * xmalloc(n) - long n; -{ - char * retval; - char * malloc(); - void error(); - - if ( ! (retval = malloc ((unsigned)n)) ) - { - error("virtual memory exceeded"); - } - return (retval); -} - -/* end: xmalloc.c */ diff --git a/gnu/gas/xrealloc.c b/gnu/gas/xrealloc.c deleted file mode 100644 index a5010bc9b0c6..000000000000 --- a/gnu/gas/xrealloc.c +++ /dev/null @@ -1,61 +0,0 @@ -/* xrealloc.c -new memory or bust- - Copyright (C) 1987 Free Software Foundation, Inc. - -This file is part of GAS, the GNU Assembler. - -GAS is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 1, or (at your option) -any later version. - -GAS is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with GAS; see the file COPYING. If not, write to -the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ - - -/* - -NAME - xrealloc () - get more memory or bust -INDEX - xrealloc () uses realloc () -SYNOPSIS - char *my_memory; - - my_memory = xrealloc (my_memory, 42); - / * my_memory gets (perhaps new) address of 42 chars * / - -DESCRIPTION - - Use xrealloc () as an "error-free" realloc ().It does almost the same - job. When it cannot honour your request for memory it BOMBS your - program with a "virtual memory exceeded" message. Realloc() returns - NULL and does not bomb your program. - -SEE ALSO - realloc () -*/ - -#ifdef USG -#include <malloc.h> -#endif - -char * -xrealloc (ptr, n) -register char *ptr; -long n; -{ - char *realloc (); - void error(); - - if ((ptr = realloc (ptr, (unsigned)n)) == 0) - error ("virtual memory exceeded"); - return (ptr); -} - -/* end: xrealloc.c */ |
